From 5734a139d3f218972b5ebaff0e51167770352bcf Mon Sep 17 00:00:00 2001 From: Hannes Schulze Date: Mon, 13 Jan 2025 23:42:17 +0100 Subject: finish ui --- src/scene.mm | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 1 deletion(-) (limited to 'src/scene.mm') diff --git a/src/scene.mm b/src/scene.mm index 1dbcecd..bb461ab 100644 --- a/src/scene.mm +++ b/src/scene.mm @@ -3,6 +3,7 @@ #import "nes/display.hh" #import "nes/util/rgb.hh" #import +#import namespace { @@ -68,6 +69,7 @@ namespace { std::unique_ptr display_; std::unique_ptr nes_; + std::optional last_time_; } - (instancetype)initWithFilePath:(NSString*)filePath @@ -90,9 +92,84 @@ namespace return self; } +- (void)keyDown:(NSEvent*)event +{ + auto& controller_1 = self->nes_->get_controller_1(); + + switch ([event keyCode]) + { + case 0x7e: // up arrow + controller_1.get_pressed().add(nes::buttons::up); + break; + case 0x7d: // down arrow + controller_1.get_pressed().add(nes::buttons::down); + break; + case 0x7b: // left arrow + controller_1.get_pressed().add(nes::buttons::left); + break; + case 0x7c: // right arrow + controller_1.get_pressed().add(nes::buttons::right); + break; + case 0x6: // "Z" + controller_1.get_pressed().add(nes::buttons::a); + break; + case 0x7: // "X" + controller_1.get_pressed().add(nes::buttons::b); + break; + case 0x24: // return + controller_1.get_pressed().add(nes::buttons::start); + break; + case 0x31: // space + controller_1.get_pressed().add(nes::buttons::select); + break; + default: + [super keyDown:event]; + break; + } +} + +- (void)keyUp:(NSEvent*)event +{ + auto& controller_1 = self->nes_->get_controller_1(); + + switch ([event keyCode]) + { + case 0x7e: // up arrow + controller_1.get_pressed().remove(nes::buttons::up); + break; + case 0x7d: // down arrow + controller_1.get_pressed().remove(nes::buttons::down); + break; + case 0x7b: // left arrow + controller_1.get_pressed().remove(nes::buttons::left); + break; + case 0x7c: // right arrow + controller_1.get_pressed().remove(nes::buttons::right); + break; + case 0x6: // "Z" + controller_1.get_pressed().remove(nes::buttons::a); + break; + case 0x7: // "X" + controller_1.get_pressed().remove(nes::buttons::b); + break; + case 0x24: // return + controller_1.get_pressed().remove(nes::buttons::start); + break; + case 0x31: // space + controller_1.get_pressed().remove(nes::buttons::select); + break; + default: + [super keyUp:event]; + break; + } +} + - (void)update:(NSTimeInterval)currentTime { - [super update:currentTime]; + auto const last_time = self->last_time_.value_or(currentTime); + last_time_ = currentTime; + auto const delta_ms = static_cast((currentTime - last_time) * 1000.); + self->nes_->step(delta_ms); } @end \ No newline at end of file -- cgit v1.3.1