Mercurial > touhou
annotate pytouhou/ui/gamerunner.pyx @ 792:11bc22bad1bf
python: Replace the image crate with png
We weren’t using any of its features anyway, so the png crate is exactly what
we need, without the many heavy dependencies of image.
https://github.com/image-rs/image-png/pull/670 will eventually make it even
faster to build.
| author | Link Mauve <linkmauve@linkmauve.fr> |
|---|---|
| date | Sat, 17 Jan 2026 22:22:25 +0100 |
| parents | ec1e06402a97 |
| children |
| rev | line source |
|---|---|
|
131
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
1 # -*- encoding: utf-8 -*- |
|
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
2 ## |
|
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
3 ## Copyright (C) 2011 Thibaut Girka <thib@sitedethib.com> |
|
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
4 ## |
|
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
5 ## This program is free software; you can redistribute it and/or modify |
|
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
6 ## it under the terms of the GNU General Public License as published |
|
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
7 ## by the Free Software Foundation; version 3 only. |
|
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
8 ## |
|
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
9 ## This program is distributed in the hope that it will be useful, |
|
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
10 ## but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
11 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
12 ## GNU General Public License for more details. |
|
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
13 ## |
|
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
14 |
|
503
c622eaf64428
Optimize GameRunner some more, fix replay, and remove Window dependency in Renderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
494
diff
changeset
|
15 cimport cython |
|
c622eaf64428
Optimize GameRunner some more, fix replay, and remove Window dependency in Renderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
494
diff
changeset
|
16 |
|
635
80687f258001
Make sdl.Window inherit from gui.Window, so we can swap implementations.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
617
diff
changeset
|
17 from pytouhou.lib.gui cimport EXIT, PAUSE, SCREENSHOT, RESIZE, FULLSCREEN |
|
146
96c30ffd9b87
Evil workaround to pyglet's X11 backend
Thibaut Girka <thib@sitedethib.com>
parents:
131
diff
changeset
|
18 |
|
463
11708a1d0a1a
Make GameRunner inherit from a Runner base class, to bypass Python calls in Window.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
459
diff
changeset
|
19 from .window cimport Window, Runner |
|
783
ec1e06402a97
Replace SDL2_mixer with the kira crate
Link Mauve <linkmauve@linkmauve.fr>
parents:
635
diff
changeset
|
20 from libtouhou import Audio |
|
503
c622eaf64428
Optimize GameRunner some more, fix replay, and remove Window dependency in Renderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
494
diff
changeset
|
21 from pytouhou.game.game cimport Game |
|
783
ec1e06402a97
Replace SDL2_mixer with the kira crate
Link Mauve <linkmauve@linkmauve.fr>
parents:
635
diff
changeset
|
22 |
|
ec1e06402a97
Replace SDL2_mixer with the kira crate
Link Mauve <linkmauve@linkmauve.fr>
parents:
635
diff
changeset
|
23 |
|
ec1e06402a97
Replace SDL2_mixer with the kira crate
Link Mauve <linkmauve@linkmauve.fr>
parents:
635
diff
changeset
|
24 class DummyAudio: |
|
ec1e06402a97
Replace SDL2_mixer with the kira crate
Link Mauve <linkmauve@linkmauve.fr>
parents:
635
diff
changeset
|
25 def play(self, name): |
|
ec1e06402a97
Replace SDL2_mixer with the kira crate
Link Mauve <linkmauve@linkmauve.fr>
parents:
635
diff
changeset
|
26 pass |
|
ec1e06402a97
Replace SDL2_mixer with the kira crate
Link Mauve <linkmauve@linkmauve.fr>
parents:
635
diff
changeset
|
27 |
|
ec1e06402a97
Replace SDL2_mixer with the kira crate
Link Mauve <linkmauve@linkmauve.fr>
parents:
635
diff
changeset
|
28 def play_bgm(self, track): |
|
ec1e06402a97
Replace SDL2_mixer with the kira crate
Link Mauve <linkmauve@linkmauve.fr>
parents:
635
diff
changeset
|
29 pass |
|
224
9bb26dbb8438
Remove useless and occasionally problematic (think about non-utf8 terminals) print calls.
Thibaut Girka <thib@sitedethib.com>
parents:
205
diff
changeset
|
30 |
|
9bb26dbb8438
Remove useless and occasionally problematic (think about non-utf8 terminals) print calls.
Thibaut Girka <thib@sitedethib.com>
parents:
205
diff
changeset
|
31 |
|
463
11708a1d0a1a
Make GameRunner inherit from a Runner base class, to bypass Python calls in Window.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
459
diff
changeset
|
32 cdef class GameRunner(Runner): |
|
503
c622eaf64428
Optimize GameRunner some more, fix replay, and remove Window dependency in Renderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
494
diff
changeset
|
33 cdef object background, con, resource_loader, keys, replay_level, common |
|
c622eaf64428
Optimize GameRunner some more, fix replay, and remove Window dependency in Renderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
494
diff
changeset
|
34 cdef Game game |
|
458
1b56d62250ab
Make pytouhou.ui.{window,shader,game{runner,renderer}} extension types.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
456
diff
changeset
|
35 cdef Window window |
|
503
c622eaf64428
Optimize GameRunner some more, fix replay, and remove Window dependency in Renderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
494
diff
changeset
|
36 cdef list save_keystates |
|
783
ec1e06402a97
Replace SDL2_mixer with the kira crate
Link Mauve <linkmauve@linkmauve.fr>
parents:
635
diff
changeset
|
37 cdef bint skip, audio |
|
458
1b56d62250ab
Make pytouhou.ui.{window,shader,game{runner,renderer}} extension types.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
456
diff
changeset
|
38 |
|
511
2e8ceaa85d5c
Don’t type the renderer in GameRunner, so that we can switch it without type issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
508
diff
changeset
|
39 # Since we want to support multiple renderers, don’t specify its type. |
|
2e8ceaa85d5c
Don’t type the renderer in GameRunner, so that we can switch it without type issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
508
diff
changeset
|
40 #TODO: find a way to still specify its interface. |
|
2e8ceaa85d5c
Don’t type the renderer in GameRunner, so that we can switch it without type issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
508
diff
changeset
|
41 cdef object renderer |
|
2e8ceaa85d5c
Don’t type the renderer in GameRunner, so that we can switch it without type issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
508
diff
changeset
|
42 |
|
2e8ceaa85d5c
Don’t type the renderer in GameRunner, so that we can switch it without type issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
508
diff
changeset
|
43 def __init__(self, Window window, renderer, common, resource_loader, |
|
783
ec1e06402a97
Replace SDL2_mixer with the kira crate
Link Mauve <linkmauve@linkmauve.fr>
parents:
635
diff
changeset
|
44 bint skip=False, con=None, bint audio=True): |
|
508
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
45 self.renderer = renderer |
|
503
c622eaf64428
Optimize GameRunner some more, fix replay, and remove Window dependency in Renderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
494
diff
changeset
|
46 self.common = common |
|
c622eaf64428
Optimize GameRunner some more, fix replay, and remove Window dependency in Renderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
494
diff
changeset
|
47 self.resource_loader = resource_loader |
|
419
1c92721f8e49
Re-implement frame control
Thibaut Girka <thib@sitedethib.com>
parents:
418
diff
changeset
|
48 |
|
422
52829ebe2561
Refactor window management in its own class.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
421
diff
changeset
|
49 self.window = window |
|
187
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
50 self.replay_level = None |
|
378
11d895b6c0dc
Add the debug feature to start a game at the end of a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
374
diff
changeset
|
51 self.skip = skip |
| 486 | 52 self.con = con |
|
783
ec1e06402a97
Replace SDL2_mixer with the kira crate
Link Mauve <linkmauve@linkmauve.fr>
parents:
635
diff
changeset
|
53 self.audio = audio |
|
331
1b4f04b08729
Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
330
diff
changeset
|
54 |
|
503
c622eaf64428
Optimize GameRunner some more, fix replay, and remove Window dependency in Renderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
494
diff
changeset
|
55 self.width = common.interface.width |
|
c622eaf64428
Optimize GameRunner some more, fix replay, and remove Window dependency in Renderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
494
diff
changeset
|
56 self.height = common.interface.height |
|
422
52829ebe2561
Refactor window management in its own class.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
421
diff
changeset
|
57 |
|
330
16ed1ab1e14b
Add a GameRunner.load_game method to allow level changes.
Thibaut Girka <thib@sitedethib.com>
parents:
323
diff
changeset
|
58 |
|
511
2e8ceaa85d5c
Don’t type the renderer in GameRunner, so that we can switch it without type issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
508
diff
changeset
|
59 def load_game(self, Game game, background=None, bgms=None, replay=None, |
|
2e8ceaa85d5c
Don’t type the renderer in GameRunner, so that we can switch it without type issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
508
diff
changeset
|
60 save_keystates=None): |
|
422
52829ebe2561
Refactor window management in its own class.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
421
diff
changeset
|
61 self.game = game |
|
52829ebe2561
Refactor window management in its own class.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
421
diff
changeset
|
62 self.background = background |
|
52829ebe2561
Refactor window management in its own class.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
421
diff
changeset
|
63 |
|
508
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
64 if self.renderer is not None: |
|
511
2e8ceaa85d5c
Don’t type the renderer in GameRunner, so that we can switch it without type issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
508
diff
changeset
|
65 self.renderer.load_textures(self.resource_loader.instanced_anms) |
|
508
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
66 self.renderer.load_background(background) |
|
422
52829ebe2561
Refactor window management in its own class.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
421
diff
changeset
|
67 |
|
378
11d895b6c0dc
Add the debug feature to start a game at the end of a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
374
diff
changeset
|
68 self.set_input(replay) |
|
11d895b6c0dc
Add the debug feature to start a game at the end of a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
374
diff
changeset
|
69 if replay and replay.levels[game.stage - 1]: |
|
494
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
487
diff
changeset
|
70 game.players[0].lives = self.replay_level.lives |
|
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
487
diff
changeset
|
71 game.players[0].power = self.replay_level.power |
|
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
487
diff
changeset
|
72 game.players[0].bombs = self.replay_level.bombs |
|
341
61caded6b4f5
Clean music playback API a little.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
334
diff
changeset
|
73 game.difficulty = self.replay_level.difficulty |
|
61caded6b4f5
Clean music playback API a little.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
334
diff
changeset
|
74 |
|
373
6deab6ad8be8
Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
370
diff
changeset
|
75 self.save_keystates = save_keystates |
|
6deab6ad8be8
Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
370
diff
changeset
|
76 |
|
783
ec1e06402a97
Replace SDL2_mixer with the kira crate
Link Mauve <linkmauve@linkmauve.fr>
parents:
635
diff
changeset
|
77 if self.audio: |
|
ec1e06402a97
Replace SDL2_mixer with the kira crate
Link Mauve <linkmauve@linkmauve.fr>
parents:
635
diff
changeset
|
78 game.music = Audio(self.resource_loader, bgms) |
|
ec1e06402a97
Replace SDL2_mixer with the kira crate
Link Mauve <linkmauve@linkmauve.fr>
parents:
635
diff
changeset
|
79 else: |
|
ec1e06402a97
Replace SDL2_mixer with the kira crate
Link Mauve <linkmauve@linkmauve.fr>
parents:
635
diff
changeset
|
80 game.music = DummyAudio() |
|
511
2e8ceaa85d5c
Don’t type the renderer in GameRunner, so that we can switch it without type issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
508
diff
changeset
|
81 if bgms is not None: |
|
783
ec1e06402a97
Replace SDL2_mixer with the kira crate
Link Mauve <linkmauve@linkmauve.fr>
parents:
635
diff
changeset
|
82 game.music.play_bgm(0) |
|
428
f41a26971a19
Remove all Loader uses from outside pytouhou.games, and add a --no-music option to disable bgm.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
427
diff
changeset
|
83 |
|
783
ec1e06402a97
Replace SDL2_mixer with the kira crate
Link Mauve <linkmauve@linkmauve.fr>
parents:
635
diff
changeset
|
84 game.sfx_player = game.music if not self.skip else DummyAudio() |
|
343
94fdb6c782c1
Implement sfx for player and enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
341
diff
changeset
|
85 |
|
131
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
86 |
|
617
a6af3ff86612
Change all “void except *” function into “bint except True”, to prevent PyErr_Occurred() from being called at each call.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
606
diff
changeset
|
87 cdef bint set_input(self, replay=None) except True: |
|
378
11d895b6c0dc
Add the debug feature to start a game at the end of a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
374
diff
changeset
|
88 if not replay or not replay.levels[self.game.stage-1]: |
|
11d895b6c0dc
Add the debug feature to start a game at the end of a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
374
diff
changeset
|
89 self.replay_level = None |
|
11d895b6c0dc
Add the debug feature to start a game at the end of a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
374
diff
changeset
|
90 else: |
|
11d895b6c0dc
Add the debug feature to start a game at the end of a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
374
diff
changeset
|
91 self.replay_level = replay.levels[self.game.stage-1] |
|
11d895b6c0dc
Add the debug feature to start a game at the end of a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
374
diff
changeset
|
92 self.keys = self.replay_level.iter_keystates() |
|
11d895b6c0dc
Add the debug feature to start a game at the end of a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
374
diff
changeset
|
93 |
|
11d895b6c0dc
Add the debug feature to start a game at the end of a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
374
diff
changeset
|
94 |
|
503
c622eaf64428
Optimize GameRunner some more, fix replay, and remove Window dependency in Renderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
494
diff
changeset
|
95 @cython.cdivision(True) |
|
617
a6af3ff86612
Change all “void except *” function into “bint except True”, to prevent PyErr_Occurred() from being called at each call.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
606
diff
changeset
|
96 cdef bint set_renderer_size(self, long width, long height) except True: |
|
508
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
97 if self.renderer is not None: |
|
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
98 runner_width = float(self.width) |
|
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
99 runner_height = float(self.height) |
|
503
c622eaf64428
Optimize GameRunner some more, fix replay, and remove Window dependency in Renderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
494
diff
changeset
|
100 |
|
508
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
101 scale = min(width / runner_width, |
|
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
102 height / runner_height) |
|
503
c622eaf64428
Optimize GameRunner some more, fix replay, and remove Window dependency in Renderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
494
diff
changeset
|
103 |
|
511
2e8ceaa85d5c
Don’t type the renderer in GameRunner, so that we can switch it without type issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
508
diff
changeset
|
104 new_width = <long>(runner_width * scale) |
|
2e8ceaa85d5c
Don’t type the renderer in GameRunner, so that we can switch it without type issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
508
diff
changeset
|
105 new_height = <long>(runner_height * scale) |
|
508
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
106 |
|
511
2e8ceaa85d5c
Don’t type the renderer in GameRunner, so that we can switch it without type issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
508
diff
changeset
|
107 x = (width - new_width) // 2 |
|
2e8ceaa85d5c
Don’t type the renderer in GameRunner, so that we can switch it without type issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
508
diff
changeset
|
108 y = (height - new_height) // 2 |
|
2e8ceaa85d5c
Don’t type the renderer in GameRunner, so that we can switch it without type issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
508
diff
changeset
|
109 |
|
2e8ceaa85d5c
Don’t type the renderer in GameRunner, so that we can switch it without type issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
508
diff
changeset
|
110 self.renderer.size = x, y, new_width, new_height |
|
503
c622eaf64428
Optimize GameRunner some more, fix replay, and remove Window dependency in Renderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
494
diff
changeset
|
111 |
|
c622eaf64428
Optimize GameRunner some more, fix replay, and remove Window dependency in Renderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
494
diff
changeset
|
112 |
|
617
a6af3ff86612
Change all “void except *” function into “bint except True”, to prevent PyErr_Occurred() from being called at each call.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
606
diff
changeset
|
113 cdef bint start(self) except True: |
|
508
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
114 if self.renderer is not None: |
|
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
115 self.set_renderer_size(self.width, self.height) |
|
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
116 self.renderer.start(self.common) |
|
370
74471afbac37
Add a programmable pipeline renderer, and a --fixed-pipeline switch to use the old one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
353
diff
changeset
|
117 |
|
131
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
118 |
|
617
a6af3ff86612
Change all “void except *” function into “bint except True”, to prevent PyErr_Occurred() from being called at each call.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
606
diff
changeset
|
119 cdef bint capture(self) except True: |
|
592
19d930f9e3f0
Add the screenshot feature, using P or Home like the original game.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
578
diff
changeset
|
120 if self.renderer is not None: |
|
19d930f9e3f0
Add the screenshot feature, using P or Home like the original game.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
578
diff
changeset
|
121 filename = 'screenshot/frame%06d.ppm' % self.game.frame |
|
19d930f9e3f0
Add the screenshot feature, using P or Home like the original game.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
578
diff
changeset
|
122 self.renderer.capture(filename, self.width, self.height) |
|
19d930f9e3f0
Add the screenshot feature, using P or Home like the original game.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
578
diff
changeset
|
123 |
|
19d930f9e3f0
Add the screenshot feature, using P or Home like the original game.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
578
diff
changeset
|
124 |
|
606
3c2f96f1d715
Fix compilation under Cython 0.22, by making the pyx and the pxd declarations’ except clause similar.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
594
diff
changeset
|
125 cpdef bint update(self, bint render) except -1: |
|
458
1b56d62250ab
Make pytouhou.ui.{window,shader,game{runner,renderer}} extension types.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
456
diff
changeset
|
126 cdef long keystate |
|
592
19d930f9e3f0
Add the screenshot feature, using P or Home like the original game.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
578
diff
changeset
|
127 capture = False |
|
458
1b56d62250ab
Make pytouhou.ui.{window,shader,game{runner,renderer}} extension types.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
456
diff
changeset
|
128 |
|
508
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
129 if self.background is not None: |
|
151
5cf927cbd9c5
Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents:
146
diff
changeset
|
130 self.background.update(self.game.frame) |
|
635
80687f258001
Make sdl.Window inherit from gui.Window, so we can swap implementations.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
617
diff
changeset
|
131 for event, args in self.window.get_events(): |
|
80687f258001
Make sdl.Window inherit from gui.Window, so we can swap implementations.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
617
diff
changeset
|
132 if event == EXIT: |
|
422
52829ebe2561
Refactor window management in its own class.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
421
diff
changeset
|
133 return False |
|
635
80687f258001
Make sdl.Window inherit from gui.Window, so we can swap implementations.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
617
diff
changeset
|
134 elif event == PAUSE: |
|
80687f258001
Make sdl.Window inherit from gui.Window, so we can swap implementations.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
617
diff
changeset
|
135 return False # TODO: implement the pause. |
|
80687f258001
Make sdl.Window inherit from gui.Window, so we can swap implementations.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
617
diff
changeset
|
136 elif event == FULLSCREEN: |
|
80687f258001
Make sdl.Window inherit from gui.Window, so we can swap implementations.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
617
diff
changeset
|
137 self.window.toggle_fullscreen() |
|
80687f258001
Make sdl.Window inherit from gui.Window, so we can swap implementations.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
617
diff
changeset
|
138 elif event == SCREENSHOT: |
|
80687f258001
Make sdl.Window inherit from gui.Window, so we can swap implementations.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
617
diff
changeset
|
139 capture = True |
|
80687f258001
Make sdl.Window inherit from gui.Window, so we can swap implementations.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
617
diff
changeset
|
140 elif event == RESIZE: |
|
80687f258001
Make sdl.Window inherit from gui.Window, so we can swap implementations.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
617
diff
changeset
|
141 width, height = args |
|
80687f258001
Make sdl.Window inherit from gui.Window, so we can swap implementations.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
617
diff
changeset
|
142 self.set_renderer_size(width, height) |
|
80687f258001
Make sdl.Window inherit from gui.Window, so we can swap implementations.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
617
diff
changeset
|
143 if self.window is not None: |
|
80687f258001
Make sdl.Window inherit from gui.Window, so we can swap implementations.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
617
diff
changeset
|
144 self.window.set_size(width, height) |
|
508
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
145 if self.replay_level is None: |
|
635
80687f258001
Make sdl.Window inherit from gui.Window, so we can swap implementations.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
617
diff
changeset
|
146 keystate = self.window.get_keystate() |
|
508
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
147 else: |
|
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
148 try: |
|
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
149 keystate = self.keys.next() |
|
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
150 except StopIteration: |
|
187
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
151 keystate = 0 |
|
508
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
152 if self.skip: |
|
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
153 self.set_input() |
|
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
154 self.skip = False |
|
783
ec1e06402a97
Replace SDL2_mixer with the kira crate
Link Mauve <linkmauve@linkmauve.fr>
parents:
635
diff
changeset
|
155 self.game.sfx_player = self.game.music |
|
508
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
156 |
|
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
157 if self.save_keystates is not None: |
|
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
158 self.save_keystates.append(keystate) |
|
187
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
159 |
|
508
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
160 if self.con is not None: |
|
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
161 self.con.run_iter(self.game, keystate) |
|
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
162 else: |
|
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
504
diff
changeset
|
163 self.game.run_iter([keystate]) |
|
373
6deab6ad8be8
Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
370
diff
changeset
|
164 |
|
549
56bca8ce4b68
Add a very simple sample interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
538
diff
changeset
|
165 labels = self.game.interface.labels |
|
56bca8ce4b68
Add a very simple sample interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
538
diff
changeset
|
166 if self.window is not None and 'framerate' in labels: |
|
56bca8ce4b68
Add a very simple sample interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
538
diff
changeset
|
167 labels['framerate'].set_text('%.2ffps' % self.window.get_fps()) |
|
56bca8ce4b68
Add a very simple sample interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
538
diff
changeset
|
168 |
|
594
12756994a92c
Make frameskip actually skip the rendering part, not just the buffer swap.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
592
diff
changeset
|
169 if render and not self.skip and self.renderer is not None: |
|
503
c622eaf64428
Optimize GameRunner some more, fix replay, and remove Window dependency in Renderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
494
diff
changeset
|
170 self.renderer.render(self.game) |
|
549
56bca8ce4b68
Add a very simple sample interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
538
diff
changeset
|
171 |
|
592
19d930f9e3f0
Add the screenshot feature, using P or Home like the original game.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
578
diff
changeset
|
172 if capture: |
|
19d930f9e3f0
Add the screenshot feature, using P or Home like the original game.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
578
diff
changeset
|
173 self.capture() |
|
19d930f9e3f0
Add the screenshot feature, using P or Home like the original game.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
578
diff
changeset
|
174 |
|
422
52829ebe2561
Refactor window management in its own class.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
421
diff
changeset
|
175 return True |
