summaryrefslogtreecommitdiff
path: root/app/mac/scene.mm
diff options
context:
space:
mode:
authorHannes Schulze <haschu0103@outlook.de>2025-01-29 00:58:07 +0100
committerHannes Schulze <haschu0103@outlook.de>2025-01-29 00:58:07 +0100
commitc1062208bb54cce8dffa04e9697ae124f271ecaf (patch)
tree5d387dcb76ec26a87d7ecafb983939b359c8f11e /app/mac/scene.mm
parent117f584b3f3d7945732a29848eb6d4ead1f57bee (diff)
use game controller api for input
Diffstat (limited to 'app/mac/scene.mm')
-rw-r--r--app/mac/scene.mm109
1 files changed, 18 insertions, 91 deletions
diff --git a/app/mac/scene.mm b/app/mac/scene.mm
index b71f9f6..0d50a7e 100644
--- a/app/mac/scene.mm
+++ b/app/mac/scene.mm
@@ -1,7 +1,6 @@
#import "scene.hh"
#import "nes/nes.hh"
#import "nes/util/display.hh"
-#import "nes/util/rgb.hh"
#import <memory>
#import <optional>
#import <iostream>
@@ -32,13 +31,10 @@ namespace
buffer_back_ = buffer_front_;
buffer_front_ = tmp;
bytes_back_ = static_cast<std::uint8_t*>([buffer_back_ mutableBytes]);
- }
- auto actually_switch_buffers() -> void
- {
- auto texture = [SKTexture textureWithData:buffer_front_ size:CGSizeMake(width, height) flipped:YES];
- [texture setFilteringMode:SKTextureFilteringNearest];
- [node_ setTexture:texture];
+ auto texture = [SKTexture textureWithData:buffer_front_ size:CGSizeMake(width, height) flipped:YES];
+ [texture setFilteringMode:SKTextureFilteringNearest];
+ [node_ setTexture:texture];
}
virtual auto set(unsigned x, unsigned y, nes::rgb value) -> void override
@@ -71,9 +67,9 @@ namespace
@implementation Scene
{
- std::unique_ptr<display_impl> display_;
- std::unique_ptr<nes::nes> nes_;
- std::optional<NSTimeInterval> last_time_;
+ std::unique_ptr<display_impl> _display;
+ std::unique_ptr<nes::nes> _nes;
+ std::optional<NSTimeInterval> _lastTimestamp;
}
- (instancetype)initWithFilePath:(NSString*)filePath
@@ -95,97 +91,28 @@ namespace
std::abort();
}
- self->display_ = std::make_unique<display_impl>(node);
- self->nes_ = std::make_unique<nes::nes>(std::move(cartridge), *self->display_);
+ _display = std::make_unique<display_impl>(node);
+ _nes = std::make_unique<nes::nes>(std::move(cartridge), *self->_display);
}
return self;
}
-- (void)keyDown:(NSEvent*)event
-{
- auto& controller_1 = self->nes_->ref_controller_1();
-
- switch ([event keyCode])
- {
- case 0x7e: // up arrow
- controller_1.ref_pressed().add(nes::buttons::up);
- break;
- case 0x7d: // down arrow
- controller_1.ref_pressed().add(nes::buttons::down);
- break;
- case 0x7b: // left arrow
- controller_1.ref_pressed().add(nes::buttons::left);
- break;
- case 0x7c: // right arrow
- controller_1.ref_pressed().add(nes::buttons::right);
- break;
- case 0x6: // "Z"
- controller_1.ref_pressed().add(nes::buttons::a);
- break;
- case 0x7: // "X"
- controller_1.ref_pressed().add(nes::buttons::b);
- break;
- case 0x24: // return
- controller_1.ref_pressed().add(nes::buttons::start);
- break;
- case 0x31: // space
- controller_1.ref_pressed().add(nes::buttons::select);
- break;
- default:
- [super keyDown:event];
- break;
- }
-}
-
-- (void)keyUp:(NSEvent*)event
+- (void)update:(NSTimeInterval)currentTime
{
- auto& controller_1 = self->nes_->ref_controller_1();
+ _nes->ref_controller_1().set_pressed(_primaryController ? [_primaryController readPressedButtons] : nes::button_mask{});
+ _nes->ref_controller_2().set_pressed(_secondaryController ? [_secondaryController readPressedButtons] : nes::button_mask{});
- switch ([event keyCode])
- {
- case 0x7e: // up arrow
- controller_1.ref_pressed().remove(nes::buttons::up);
- break;
- case 0x7d: // down arrow
- controller_1.ref_pressed().remove(nes::buttons::down);
- break;
- case 0x7b: // left arrow
- controller_1.ref_pressed().remove(nes::buttons::left);
- break;
- case 0x7c: // right arrow
- controller_1.ref_pressed().remove(nes::buttons::right);
- break;
- case 0x6: // "Z"
- controller_1.ref_pressed().remove(nes::buttons::a);
- break;
- case 0x7: // "X"
- controller_1.ref_pressed().remove(nes::buttons::b);
- break;
- case 0x24: // return
- controller_1.ref_pressed().remove(nes::buttons::start);
- break;
- case 0x31: // space
- controller_1.ref_pressed().remove(nes::buttons::select);
- break;
- default:
- [super keyUp:event];
- break;
- }
-}
+ auto const lastTimestamp = _lastTimestamp.value_or(currentTime);
+ _lastTimestamp = currentTime;
+ auto deltaMicroseconds = static_cast<std::uint64_t>((currentTime - lastTimestamp) * 1000. * 1000.);
+ deltaMicroseconds = std::min(deltaMicroseconds, std::uint64_t{ 50000 });
+ _nes->step(std::chrono::microseconds{ deltaMicroseconds });
-- (void)update:(NSTimeInterval)currentTime
-{
- auto const last_time = self->last_time_.value_or(currentTime);
- last_time_ = currentTime;
- auto delta_us = static_cast<std::uint64_t>((currentTime - last_time) * 1000. * 1000.);
- delta_us = std::min(delta_us, std::uint64_t{ 50000 });
- self->nes_->step(std::chrono::microseconds{ delta_us });
- if (self->nes_->get_status() != nes::status::success)
+ if (_nes->get_status() != nes::status::success)
{
- std::cerr << "Invalid state: " << to_string(self->nes_->get_status()) << std::endl;
+ std::cerr << "Invalid state: " << to_string(_nes->get_status()) << std::endl;
std::abort();
}
- self->display_->actually_switch_buffers();
}
@end \ No newline at end of file