Mercurial > touhou
annotate pytouhou/ui/gamerunner.py @ 360:d55a1843b2a7
Fix Flandre's QED: Ripples of 495 years
author | Thibaut Girka <thib@sitedethib.com> |
---|---|
date | Mon, 09 Jul 2012 21:10:38 +0200 |
parents | 451bee1d2cec |
children | 74471afbac37 |
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 |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
15 import pyglet |
146
96c30ffd9b87
Evil workaround to pyglet's X11 backend
Thibaut Girka <thib@sitedethib.com>
parents:
131
diff
changeset
|
16 import traceback |
300
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
17 from itertools import chain |
146
96c30ffd9b87
Evil workaround to pyglet's X11 backend
Thibaut Girka <thib@sitedethib.com>
parents:
131
diff
changeset
|
18 |
300
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
19 from pyglet.gl import (glMatrixMode, glLoadIdentity, glEnable, glDisable, |
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
20 glHint, glEnableClientState, glViewport, glScissor, |
225
2d35565b5608
Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
21 gluPerspective, gluOrtho2D, |
203
df8b2ab54639
Make pylint slightly happier (and code analysis easier)
Thibaut Girka <thib@sitedethib.com>
parents:
188
diff
changeset
|
22 GL_MODELVIEW, GL_PROJECTION, |
df8b2ab54639
Make pylint slightly happier (and code analysis easier)
Thibaut Girka <thib@sitedethib.com>
parents:
188
diff
changeset
|
23 GL_TEXTURE_2D, GL_BLEND, GL_FOG, |
df8b2ab54639
Make pylint slightly happier (and code analysis easier)
Thibaut Girka <thib@sitedethib.com>
parents:
188
diff
changeset
|
24 GL_PERSPECTIVE_CORRECTION_HINT, GL_FOG_HINT, GL_NICEST, |
300
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
25 GL_COLOR_ARRAY, GL_VERTEX_ARRAY, GL_TEXTURE_COORD_ARRAY, |
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
26 GL_SCISSOR_TEST) |
131
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
27 |
224
9bb26dbb8438
Remove useless and occasionally problematic (think about non-utf8 terminals) print calls.
Thibaut Girka <thib@sitedethib.com>
parents:
205
diff
changeset
|
28 from pytouhou.utils.helpers import get_logger |
9bb26dbb8438
Remove useless and occasionally problematic (think about non-utf8 terminals) print calls.
Thibaut Girka <thib@sitedethib.com>
parents:
205
diff
changeset
|
29 |
205
ee6dfd14a785
Rename pytouhou.opengl to pytouhou.ui, makes much more sense that way.
Thibaut Girka <thib@sitedethib.com>
parents:
203
diff
changeset
|
30 from .gamerenderer import GameRenderer |
343
94fdb6c782c1
Implement sfx for player and enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
341
diff
changeset
|
31 from .music import MusicPlayer, SFXPlayer |
131
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
32 |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
33 |
224
9bb26dbb8438
Remove useless and occasionally problematic (think about non-utf8 terminals) print calls.
Thibaut Girka <thib@sitedethib.com>
parents:
205
diff
changeset
|
34 logger = get_logger(__name__) |
9bb26dbb8438
Remove useless and occasionally problematic (think about non-utf8 terminals) print calls.
Thibaut Girka <thib@sitedethib.com>
parents:
205
diff
changeset
|
35 |
9bb26dbb8438
Remove useless and occasionally problematic (think about non-utf8 terminals) print calls.
Thibaut Girka <thib@sitedethib.com>
parents:
205
diff
changeset
|
36 |
131
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
37 class GameRunner(pyglet.window.Window, GameRenderer): |
334
4eca6130f118
Add options to set FPS limit and disable double buffering
Thibaut Girka <thib@sitedethib.com>
parents:
331
diff
changeset
|
38 def __init__(self, resource_loader, game=None, background=None, replay=None, double_buffer=True, fps_limit=60): |
131
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
39 GameRenderer.__init__(self, resource_loader, game, background) |
225
2d35565b5608
Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
40 |
334
4eca6130f118
Add options to set FPS limit and disable double buffering
Thibaut Girka <thib@sitedethib.com>
parents:
331
diff
changeset
|
41 config = pyglet.gl.Config(double_buffer=double_buffer) |
300
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
42 width, height = (game.interface.width, game.interface.height) if game else (None, None) |
225
2d35565b5608
Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
43 pyglet.window.Window.__init__(self, width=width, height=height, |
334
4eca6130f118
Add options to set FPS limit and disable double buffering
Thibaut Girka <thib@sitedethib.com>
parents:
331
diff
changeset
|
44 caption='PyTouhou', resizable=False, |
4eca6130f118
Add options to set FPS limit and disable double buffering
Thibaut Girka <thib@sitedethib.com>
parents:
331
diff
changeset
|
45 config=config) |
225
2d35565b5608
Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
46 |
334
4eca6130f118
Add options to set FPS limit and disable double buffering
Thibaut Girka <thib@sitedethib.com>
parents:
331
diff
changeset
|
47 self.fps_limit = fps_limit |
187
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
48 self.replay_level = None |
331
1b4f04b08729
Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
330
diff
changeset
|
49 |
1b4f04b08729
Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
330
diff
changeset
|
50 if game: |
1b4f04b08729
Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
330
diff
changeset
|
51 self.load_game(game, background, replay) |
330
16ed1ab1e14b
Add a GameRunner.load_game method to allow level changes.
Thibaut Girka <thib@sitedethib.com>
parents:
323
diff
changeset
|
52 |
16ed1ab1e14b
Add a GameRunner.load_game method to allow level changes.
Thibaut Girka <thib@sitedethib.com>
parents:
323
diff
changeset
|
53 self.clock = pyglet.clock.get_default() |
16ed1ab1e14b
Add a GameRunner.load_game method to allow level changes.
Thibaut Girka <thib@sitedethib.com>
parents:
323
diff
changeset
|
54 |
16ed1ab1e14b
Add a GameRunner.load_game method to allow level changes.
Thibaut Girka <thib@sitedethib.com>
parents:
323
diff
changeset
|
55 |
341
61caded6b4f5
Clean music playback API a little.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
334
diff
changeset
|
56 def load_game(self, game=None, background=None, bgms=None, replay=None): |
330
16ed1ab1e14b
Add a GameRunner.load_game method to allow level changes.
Thibaut Girka <thib@sitedethib.com>
parents:
323
diff
changeset
|
57 GameRenderer.load_game(self, game, background) |
16ed1ab1e14b
Add a GameRunner.load_game method to allow level changes.
Thibaut Girka <thib@sitedethib.com>
parents:
323
diff
changeset
|
58 self.replay_level = None |
187
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
59 if not replay or not replay.levels[game.stage-1]: |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
60 self.keys = pyglet.window.key.KeyStateHandler() |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
61 self.push_handlers(self.keys) |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
62 else: |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
63 self.keys = 0 |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
64 self.replay_level = replay.levels[game.stage-1] |
341
61caded6b4f5
Clean music playback API a little.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
334
diff
changeset
|
65 game.players[0].state.lives = self.replay_level.lives |
61caded6b4f5
Clean music playback API a little.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
334
diff
changeset
|
66 game.players[0].state.power = self.replay_level.power |
61caded6b4f5
Clean music playback API a little.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
334
diff
changeset
|
67 game.players[0].state.bombs = self.replay_level.bombs |
61caded6b4f5
Clean music playback API a little.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
334
diff
changeset
|
68 game.difficulty = self.replay_level.difficulty |
61caded6b4f5
Clean music playback API a little.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
334
diff
changeset
|
69 |
61caded6b4f5
Clean music playback API a little.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
334
diff
changeset
|
70 game.music = MusicPlayer(game.resource_loader, bgms) |
61caded6b4f5
Clean music playback API a little.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
334
diff
changeset
|
71 game.music.play(0) |
131
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
72 |
343
94fdb6c782c1
Implement sfx for player and enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
341
diff
changeset
|
73 game.player_sfx = SFXPlayer(game.resource_loader) |
94fdb6c782c1
Implement sfx for player and enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
341
diff
changeset
|
74 game.enemy_sfx = SFXPlayer(game.resource_loader) |
94fdb6c782c1
Implement sfx for player and enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
341
diff
changeset
|
75 |
131
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
76 |
225
2d35565b5608
Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
77 def start(self, width=None, height=None): |
300
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
78 width = width or (self.game.interface.width if self.game else 640) |
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
79 height = height or (self.game.interface.height if self.game else 480) |
225
2d35565b5608
Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
80 if (width, height) != (self.width, self.height): |
2d35565b5608
Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
81 self.set_size(width, height) |
131
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
82 |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
83 # Initialize OpenGL |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
84 glEnable(GL_BLEND) |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
85 glEnable(GL_TEXTURE_2D) |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
86 glEnable(GL_FOG) |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
87 glHint(GL_FOG_HINT, GL_NICEST) |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
88 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST) |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
89 glEnableClientState(GL_COLOR_ARRAY) |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
90 glEnableClientState(GL_VERTEX_ARRAY) |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
91 glEnableClientState(GL_TEXTURE_COORD_ARRAY) |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
92 |
334
4eca6130f118
Add options to set FPS limit and disable double buffering
Thibaut Girka <thib@sitedethib.com>
parents:
331
diff
changeset
|
93 if self.fps_limit > 0: |
4eca6130f118
Add options to set FPS limit and disable double buffering
Thibaut Girka <thib@sitedethib.com>
parents:
331
diff
changeset
|
94 pyglet.clock.set_fps_limit(self.fps_limit) |
131
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
95 while not self.has_exit: |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
96 pyglet.clock.tick() |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
97 self.dispatch_events() |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
98 self.update() |
300
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
99 self.render_game() |
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
100 self.render_interface() |
131
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
101 self.flip() |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
102 |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
103 |
146
96c30ffd9b87
Evil workaround to pyglet's X11 backend
Thibaut Girka <thib@sitedethib.com>
parents:
131
diff
changeset
|
104 def _event_text_symbol(self, ev): |
96c30ffd9b87
Evil workaround to pyglet's X11 backend
Thibaut Girka <thib@sitedethib.com>
parents:
131
diff
changeset
|
105 # XXX: Ugly workaround to a pyglet bug on X11 |
96c30ffd9b87
Evil workaround to pyglet's X11 backend
Thibaut Girka <thib@sitedethib.com>
parents:
131
diff
changeset
|
106 #TODO: fix that bug in pyglet |
96c30ffd9b87
Evil workaround to pyglet's X11 backend
Thibaut Girka <thib@sitedethib.com>
parents:
131
diff
changeset
|
107 try: |
96c30ffd9b87
Evil workaround to pyglet's X11 backend
Thibaut Girka <thib@sitedethib.com>
parents:
131
diff
changeset
|
108 return pyglet.window.Window._event_text_symbol(self, ev) |
96c30ffd9b87
Evil workaround to pyglet's X11 backend
Thibaut Girka <thib@sitedethib.com>
parents:
131
diff
changeset
|
109 except Exception as exc: |
224
9bb26dbb8438
Remove useless and occasionally problematic (think about non-utf8 terminals) print calls.
Thibaut Girka <thib@sitedethib.com>
parents:
205
diff
changeset
|
110 logger.warn('Pyglet error: %s', traceback.format_exc(exc)) |
146
96c30ffd9b87
Evil workaround to pyglet's X11 backend
Thibaut Girka <thib@sitedethib.com>
parents:
131
diff
changeset
|
111 return None, None |
96c30ffd9b87
Evil workaround to pyglet's X11 backend
Thibaut Girka <thib@sitedethib.com>
parents:
131
diff
changeset
|
112 |
96c30ffd9b87
Evil workaround to pyglet's X11 backend
Thibaut Girka <thib@sitedethib.com>
parents:
131
diff
changeset
|
113 |
131
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
114 def on_key_press(self, symbol, modifiers): |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
115 if symbol == pyglet.window.key.ESCAPE: |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
116 self.has_exit = True |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
117 # XXX: Fullscreen will be enabled the day pyglet stops sucking |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
118 elif symbol == pyglet.window.key.F11: |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
119 self.set_fullscreen(not self.fullscreen) |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
120 |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
121 |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
122 def update(self): |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
123 if self.background: |
151
5cf927cbd9c5
Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents:
146
diff
changeset
|
124 self.background.update(self.game.frame) |
131
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
125 if self.game: |
187
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
126 if not self.replay_level: |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
127 #TODO: allow user settings |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
128 keystate = 0 |
353
451bee1d2cec
Allow Z as well as W to shoot.
Thibaut Girka <thib@sitedethib.com>
parents:
345
diff
changeset
|
129 if self.keys[pyglet.window.key.W] or self.keys[pyglet.window.key.Z]: |
187
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
130 keystate |= 1 |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
131 if self.keys[pyglet.window.key.X]: |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
132 keystate |= 2 |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
133 #TODO: on some configurations, LSHIFT is Shift_L when pressed |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
134 # and ISO_Prev_Group when released, confusing the hell out of pyglet |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
135 # and leading to a always-on LSHIFT... |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
136 if self.keys[pyglet.window.key.LSHIFT]: |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
137 keystate |= 4 |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
138 if self.keys[pyglet.window.key.UP]: |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
139 keystate |= 16 |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
140 if self.keys[pyglet.window.key.DOWN]: |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
141 keystate |= 32 |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
142 if self.keys[pyglet.window.key.LEFT]: |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
143 keystate |= 64 |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
144 if self.keys[pyglet.window.key.RIGHT]: |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
145 keystate |= 128 |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
146 if self.keys[pyglet.window.key.LCTRL]: |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
147 keystate |= 256 |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
148 else: |
188
008f90ebfdc0
Fix replay handling and add support for encrypted replays
Thibaut Girka <thib@sitedethib.com>
parents:
187
diff
changeset
|
149 keystate = 0 |
008f90ebfdc0
Fix replay handling and add support for encrypted replays
Thibaut Girka <thib@sitedethib.com>
parents:
187
diff
changeset
|
150 for frame, _keystate, unknown in self.replay_level.keys: |
008f90ebfdc0
Fix replay handling and add support for encrypted replays
Thibaut Girka <thib@sitedethib.com>
parents:
187
diff
changeset
|
151 if self.game.frame < frame: |
008f90ebfdc0
Fix replay handling and add support for encrypted replays
Thibaut Girka <thib@sitedethib.com>
parents:
187
diff
changeset
|
152 break |
008f90ebfdc0
Fix replay handling and add support for encrypted replays
Thibaut Girka <thib@sitedethib.com>
parents:
187
diff
changeset
|
153 else: |
008f90ebfdc0
Fix replay handling and add support for encrypted replays
Thibaut Girka <thib@sitedethib.com>
parents:
187
diff
changeset
|
154 keystate = _keystate |
187
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
158
diff
changeset
|
155 |
331
1b4f04b08729
Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
330
diff
changeset
|
156 self.game.run_iter(keystate) |
131
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
157 |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
158 |
300
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
159 def render_game(self): |
225
2d35565b5608
Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
160 # Switch to game projection |
2d35565b5608
Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
161 #TODO: move that to GameRenderer? |
300
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
162 x, y = self.game.interface.game_pos |
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
163 glViewport(x, y, self.game.width, self.game.height) |
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
164 glScissor(x, y, self.game.width, self.game.height) |
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
165 glEnable(GL_SCISSOR_TEST) |
225
2d35565b5608
Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
166 glMatrixMode(GL_PROJECTION) |
2d35565b5608
Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
167 glLoadIdentity() |
300
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
168 gluPerspective(30, float(self.game.width) / float(self.game.height), |
225
2d35565b5608
Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
169 101010101./2010101., 101010101./10101.) |
2d35565b5608
Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
170 |
131
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
171 GameRenderer.render(self) |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
172 |
300
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
173 glDisable(GL_SCISSOR_TEST) |
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
174 |
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
175 |
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
176 def render_interface(self): |
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
177 # Interface |
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
178 interface = self.game.interface |
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
179 interface.labels['framerate'].set_text('%.2ffps' % self.clock.get_fps()) |
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
180 |
225
2d35565b5608
Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
181 glMatrixMode(GL_PROJECTION) |
2d35565b5608
Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
182 glLoadIdentity() |
131
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
183 glMatrixMode(GL_MODELVIEW) |
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
184 glLoadIdentity() |
300
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
185 gluOrtho2D(0., float(self.width), float(self.height), 0.) |
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
186 glViewport(0, 0, self.width, self.height) |
225
2d35565b5608
Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
187 |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
300
diff
changeset
|
188 items = [item for item in interface.items if item.anmrunner and item.anmrunner.running] |
323
2fcdb8966957
Display lives and bombs.
Thibaut Girka <thib@sitedethib.com>
parents:
321
diff
changeset
|
189 labels = interface.labels.values() |
2fcdb8966957
Display lives and bombs.
Thibaut Girka <thib@sitedethib.com>
parents:
321
diff
changeset
|
190 |
300
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
191 if items: |
323
2fcdb8966957
Display lives and bombs.
Thibaut Girka <thib@sitedethib.com>
parents:
321
diff
changeset
|
192 # Redraw all the interface |
300
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
193 self.render_elements(items) |
da53bc29b94a
Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
233
diff
changeset
|
194 else: |
323
2fcdb8966957
Display lives and bombs.
Thibaut Girka <thib@sitedethib.com>
parents:
321
diff
changeset
|
195 # Redraw only changed labels |
2fcdb8966957
Display lives and bombs.
Thibaut Girka <thib@sitedethib.com>
parents:
321
diff
changeset
|
196 labels = [label for label in labels if label.changed] |
2fcdb8966957
Display lives and bombs.
Thibaut Girka <thib@sitedethib.com>
parents:
321
diff
changeset
|
197 |
345
2c4589370cc6
Display a boss remaining lives and timeout.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
343
diff
changeset
|
198 if self.game.boss: |
2c4589370cc6
Display a boss remaining lives and timeout.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
343
diff
changeset
|
199 self.render_elements(interface.boss_items) |
2c4589370cc6
Display a boss remaining lives and timeout.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
343
diff
changeset
|
200 |
323
2fcdb8966957
Display lives and bombs.
Thibaut Girka <thib@sitedethib.com>
parents:
321
diff
changeset
|
201 self.render_elements(labels) |
2fcdb8966957
Display lives and bombs.
Thibaut Girka <thib@sitedethib.com>
parents:
321
diff
changeset
|
202 self.render_elements(chain(*(label.objects() for label in labels))) |
2fcdb8966957
Display lives and bombs.
Thibaut Girka <thib@sitedethib.com>
parents:
321
diff
changeset
|
203 for label in labels: |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
300
diff
changeset
|
204 label.changed = False |
131
fab7ad2f0d8b
Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
205 |