diff --git a/CHANGELOG.md b/CHANGELOG.md index 1aa0d661febbb5dcc578ce7e3354894117344784..a92c0b596ec916a3de2d1d80f27cfa11680b3e0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -* +* Support for Python 3 API - [#36](https://gitlab.stage.hive.pt/joamag/boytacean/-/issues/36) +* `next_frame()` method for frame by frame navigation ### Changed diff --git a/examples/python/pocket.py b/examples/python/pocket.py index 9fdb09df3f725ae89c66e2ba2ea0daccd0bc1ee7..3ec7a284cf0e63972fc132453bb24a5c21a3766a 100644 --- a/examples/python/pocket.py +++ b/examples/python/pocket.py @@ -3,5 +3,6 @@ import boytacean gb = boytacean.GameBoy() gb.load() gb.load_rom("../../res/roms/demo/pocket.gb") -gb.clocks(10000000) +for _ in range(6000): + gb.next_frame() gb.save_image("pocket.png") diff --git a/src/gb.rs b/src/gb.rs index eba016573fe51f7f6c62eb049a6cdb5349d325e9..e58c612fd96bd65956569c61208576db67d7d1b5 100644 --- a/src/gb.rs +++ b/src/gb.rs @@ -487,6 +487,18 @@ impl GameBoy { cycles } + pub fn next_frame(&mut self) -> u32 { + let mut cycles = 0u32; + let current_frame = self.ppu_frame(); + loop { + cycles += self.clock() as u32; + if self.ppu_frame() != current_frame { + break; + } + } + cycles + } + pub fn key_press(&mut self, key: PadKey) { self.pad().key_press(key); } diff --git a/src/py.rs b/src/py.rs index d71cab0ebbbacf1bfa44467496776b20fc6e8549..9222bd627d3f7dad53d884a6dd7e705532562c48 100644 --- a/src/py.rs +++ b/src/py.rs @@ -43,6 +43,10 @@ impl GameBoy { self.system.clocks(count) } + pub fn next_frame(&mut self) -> u32 { + self.system.next_frame() + } + pub fn frame_buffer(&mut self, py: Python) -> PyObject { let pybytes = PyBytes::new(py, self.system.frame_buffer()); pybytes.into() diff --git a/src/python/boytacean/__init__.py b/src/python/boytacean/__init__.py index 04e22e062ec85d3a498edf08c161223e58dc9f55..eab8e19457ab106b34d9991691182a60a0f4024e 100644 --- a/src/python/boytacean/__init__.py +++ b/src/python/boytacean/__init__.py @@ -23,6 +23,9 @@ class GameBoy: def clocks(self, count: int) -> int: return self._system.clocks(count) + def next_frame(self) -> int: + return self._system.next_frame() + def frame_buffer(self): return self._system.frame_buffer()