summaryrefslogtreecommitdiff
path: root/src/scene.mm
diff options
context:
space:
mode:
Diffstat (limited to 'src/scene.mm')
-rw-r--r--src/scene.mm79
1 files changed, 78 insertions, 1 deletions
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 <memory>
+#import <optional>
namespace
{
@@ -68,6 +69,7 @@ namespace
{
std::unique_ptr<display_impl> display_;
std::unique_ptr<nes::nes> nes_;
+ std::optional<NSTimeInterval> 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<std::uint64_t>((currentTime - last_time) * 1000.);
+ self->nes_->step(delta_ms);
}
@end \ No newline at end of file