annotate skaapsteker/levelscene.py @ 270:e47efa33903b

Fixed key sequence handling.
author Jeremy Thurgood <firxen@gmail.com>
date Fri, 08 Apr 2011 17:13:25 +0200
parents 401102f16a42
children 95e2ef31e714
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15
538d15e6cca1 Add level scenes
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
1 """Scene wrapping a level object."""
538d15e6cca1 Add level scenes
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
2
169
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
3 from pygame.locals import (KEYDOWN, KEYUP, K_DOWN, K_ESCAPE, K_LEFT, K_RIGHT,
244
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
4 K_SEMICOLON, K_UP, K_p, K_q, K_x, K_z, K_RETURN)
106
bf7d511d3650 Dvorak support
Stefano Rivera <stefano@rivera.za.net>
parents: 104
diff changeset
5
248
129afb4417cf Some light cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents: 244
diff changeset
6 import pygame
265
7628467eecd9 Add double-key tap support
Neil Muller <drnlmuller@gmail.com>
parents: 264
diff changeset
7 import time
248
129afb4417cf Some light cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents: 244
diff changeset
8
106
bf7d511d3650 Dvorak support
Stefano Rivera <stefano@rivera.za.net>
parents: 104
diff changeset
9 from . import options
248
129afb4417cf Some light cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents: 244
diff changeset
10 from . import engine
129afb4417cf Some light cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents: 244
diff changeset
11 from . import level
129afb4417cf Some light cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents: 244
diff changeset
12 from . import physics
265
7628467eecd9 Add double-key tap support
Neil Muller <drnlmuller@gmail.com>
parents: 264
diff changeset
13 from . import constants
248
129afb4417cf Some light cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents: 244
diff changeset
14 from .sprites import player
129afb4417cf Some light cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents: 244
diff changeset
15 from .widgets.text import Text
251
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
16 from .widgets.bubble import DialogueWidget
248
129afb4417cf Some light cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents: 244
diff changeset
17
15
538d15e6cca1 Add level scenes
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
18
538d15e6cca1 Add level scenes
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
19 class LevelScene(engine.Scene):
538d15e6cca1 Add level scenes
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
20
264
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 263
diff changeset
21 def __init__(self, game_state, soundsystem, doorway_def=None):
262
de60329cfc9f Factor out sound stuff
Neil Muller <drnlmuller@gmail.com>
parents: 251
diff changeset
22 super(LevelScene, self).__init__(game_state, soundsystem)
189
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
23
264
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 263
diff changeset
24 if doorway_def is not None:
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 263
diff changeset
25 player_def = self.game_state.world.player
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 263
diff changeset
26 player_def.level, player_def.doorway = doorway_def.split('.')
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 263
diff changeset
27 self._level = level.Level(self.game_state.world.player.level, soundsystem)
244
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
28 self._player_dead = False
251
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
29 self._dialogue = None
189
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
30
264
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 263
diff changeset
31 self.setup_player()
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 263
diff changeset
32
40
fa1bb94cfa76 Re-factor drawing to blit to a clip rect in the One True Level Surface before blitting that to the screen.
Simon Cross <hodgestar@gmail.com>
parents: 16
diff changeset
33 self._level_surface = self._level.get_surface()
111
601d2a500e4a Hook up scrolling.
Simon Cross <hodgestar@gmail.com>
parents: 106
diff changeset
34 self._clip_rect = None
40
fa1bb94cfa76 Re-factor drawing to blit to a clip rect in the One True Level Surface before blitting that to the screen.
Simon Cross <hodgestar@gmail.com>
parents: 16
diff changeset
35 self._world = physics.World()
173
21d34f1f15b2 Press p to pause.
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
36 self._paused = False
40
fa1bb94cfa76 Re-factor drawing to blit to a clip rect in the One True Level Surface before blitting that to the screen.
Simon Cross <hodgestar@gmail.com>
parents: 16
diff changeset
37
189
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
38 for sprite in self._level.sprites:
50
7d411ed02eac Initial stab at detecting collisions.
Simon Cross <hodgestar@gmail.com>
parents: 43
diff changeset
39 self._world.add(sprite)
189
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
40 for sprite in self.game_state.create_sprites(self._level.name):
127
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 124
diff changeset
41 self._world.add(sprite)
189
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
42 self._world.add(self._player)
43
abbc9ada8dc4 Enemies must fall
Simon Cross <hodgestar@gmail.com>
parents: 42
diff changeset
43
102
2e913a89e69d Link up key presses to calls to action functions on player and to quitting level.
Simon Cross <hodgestar@gmail.com>
parents: 88
diff changeset
44 self._build_action_map()
2e913a89e69d Link up key presses to calls to action functions on player and to quitting level.
Simon Cross <hodgestar@gmail.com>
parents: 88
diff changeset
45
264
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 263
diff changeset
46 def setup_player(self):
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 263
diff changeset
47 doorway = self._level.doorways[self.game_state.world.player.doorway]
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 263
diff changeset
48 self._player = player.Player(self.game_state.world, self._soundsystem)
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 263
diff changeset
49 self._player.set_facing(doorway.facing)
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 263
diff changeset
50 self._player.set_image()
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 263
diff changeset
51 self._player.set_pos(doorway._starting_tile_pos)
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 263
diff changeset
52
265
7628467eecd9 Add double-key tap support
Neil Muller <drnlmuller@gmail.com>
parents: 264
diff changeset
53 # Double tap stuff
7628467eecd9 Add double-key tap support
Neil Muller <drnlmuller@gmail.com>
parents: 264
diff changeset
54 self._last_keys_down = []
7628467eecd9 Add double-key tap support
Neil Muller <drnlmuller@gmail.com>
parents: 264
diff changeset
55 self._last_keydown_time = None
7628467eecd9 Add double-key tap support
Neil Muller <drnlmuller@gmail.com>
parents: 264
diff changeset
56 self._last_keyup_time = None
264
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 263
diff changeset
57
102
2e913a89e69d Link up key presses to calls to action functions on player and to quitting level.
Simon Cross <hodgestar@gmail.com>
parents: 88
diff changeset
58 def _build_action_map(self):
169
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
59 action = lambda s: getattr(self._player, 'action_%s' % s)
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
60
244
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
61 self._quit_keys = set([K_q, K_ESCAPE])
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
62 self._restart_keys = set([K_x, K_z, K_RETURN])
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
63
169
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
64 self._fast_key_map = {
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
65 K_LEFT: action('left'),
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
66 K_RIGHT: action('right'),
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
67 K_UP: action('up'),
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
68 K_DOWN: action('down'),
106
bf7d511d3650 Dvorak support
Stefano Rivera <stefano@rivera.za.net>
parents: 104
diff changeset
69 }
169
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
70 self._fast_keys_down = set()
106
bf7d511d3650 Dvorak support
Stefano Rivera <stefano@rivera.za.net>
parents: 104
diff changeset
71
169
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
72 self._slow_key_map = {
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
73 K_ESCAPE: self._quit,
173
21d34f1f15b2 Press p to pause.
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
74 K_p: self._toggle_pause,
169
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
75 }
106
bf7d511d3650 Dvorak support
Stefano Rivera <stefano@rivera.za.net>
parents: 104
diff changeset
76 if options['dvorak']:
169
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
77 self._slow_key_map[K_SEMICOLON] = action('fire1')
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
78 self._slow_key_map[K_q] = action('fire2')
106
bf7d511d3650 Dvorak support
Stefano Rivera <stefano@rivera.za.net>
parents: 104
diff changeset
79 else:
169
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
80 self._slow_key_map[K_x] = action('fire1')
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
81 self._slow_key_map[K_z] = action('fire2')
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
82 self._slow_key_map[K_q] = self._quit
102
2e913a89e69d Link up key presses to calls to action functions on player and to quitting level.
Simon Cross <hodgestar@gmail.com>
parents: 88
diff changeset
83
265
7628467eecd9 Add double-key tap support
Neil Muller <drnlmuller@gmail.com>
parents: 264
diff changeset
84 self._key_tap_map = {
7628467eecd9 Add double-key tap support
Neil Muller <drnlmuller@gmail.com>
parents: 264
diff changeset
85 (K_LEFT, K_LEFT) : action('double_left'),
7628467eecd9 Add double-key tap support
Neil Muller <drnlmuller@gmail.com>
parents: 264
diff changeset
86 (K_RIGHT, K_RIGHT) : action('double_right'),
7628467eecd9 Add double-key tap support
Neil Muller <drnlmuller@gmail.com>
parents: 264
diff changeset
87 (K_DOWN, K_DOWN) : action('double_down'),
7628467eecd9 Add double-key tap support
Neil Muller <drnlmuller@gmail.com>
parents: 264
diff changeset
88 }
7628467eecd9 Add double-key tap support
Neil Muller <drnlmuller@gmail.com>
parents: 264
diff changeset
89
244
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
90 def _quit(self, pause=True):
102
2e913a89e69d Link up key presses to calls to action functions on player and to quitting level.
Simon Cross <hodgestar@gmail.com>
parents: 88
diff changeset
91 import menuscene # avoid circular import
244
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
92 if pause:
262
de60329cfc9f Factor out sound stuff
Neil Muller <drnlmuller@gmail.com>
parents: 251
diff changeset
93 engine.ChangeScene.post(menuscene.MenuScene(self.game_state, self._soundsystem, self))
244
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
94 else:
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
95 # FIXME: When starting the game, we shoudl ensure we have sane
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
96 # states
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
97 if self._player_dead:
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
98 self._player.restore()
262
de60329cfc9f Factor out sound stuff
Neil Muller <drnlmuller@gmail.com>
parents: 251
diff changeset
99 engine.ChangeScene.post(menuscene.MenuScene(self.game_state, self._soundsystem, None))
244
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
100
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
101 def _restart(self):
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
102 if self._player_dead:
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
103 self._player.restore()
264
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 263
diff changeset
104 engine.ChangeScene.post(LevelScene(self.game_state, self._soundsystem))
104
12ce1d131a72 Hack in resume game option
Neil Muller <drnlmuller@gmail.com>
parents: 102
diff changeset
105
173
21d34f1f15b2 Press p to pause.
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
106 def _toggle_pause(self):
21d34f1f15b2 Press p to pause.
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
107 if self._paused:
21d34f1f15b2 Press p to pause.
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
108 self._world.thaw()
21d34f1f15b2 Press p to pause.
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
109 self._paused = False
21d34f1f15b2 Press p to pause.
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
110 else:
21d34f1f15b2 Press p to pause.
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
111 self._world.freeze()
21d34f1f15b2 Press p to pause.
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
112 self._paused = True
21d34f1f15b2 Press p to pause.
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
113
251
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
114 def _open_dialogue(self, npc):
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
115 if npc.dsm.has_text():
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
116 if self._dialogue is not None:
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
117 self._dialogue.close()
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
118 self._world.freeze()
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
119 self._dialogue = DialogueWidget(npc)
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
120 else:
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
121 self._close_dialogue()
250
8d7edd77bfbf Start hooking up NPC interactions.
Simon Cross <hodgestar@gmail.com>
parents: 248
diff changeset
122
251
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
123 def _close_dialogue(self):
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
124 if self._dialogue is not None:
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
125 self._world.thaw()
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
126 self._dialogue.close()
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
127 self._dialogue = None
250
8d7edd77bfbf Start hooking up NPC interactions.
Simon Cross <hodgestar@gmail.com>
parents: 248
diff changeset
128
170
aa154c4086cb Replace scene .freeze and .thaw methods with .enter and .leave.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
129 def leave(self):
104
12ce1d131a72 Hack in resume game option
Neil Muller <drnlmuller@gmail.com>
parents: 102
diff changeset
130 """Freeze the scene, for serialization"""
12ce1d131a72 Hack in resume game option
Neil Muller <drnlmuller@gmail.com>
parents: 102
diff changeset
131 self._world.freeze()
243
4050e77dade6 Add support for background music tracks
Neil Muller <drnlmuller@gmail.com>
parents: 206
diff changeset
132 self._level.leave()
104
12ce1d131a72 Hack in resume game option
Neil Muller <drnlmuller@gmail.com>
parents: 102
diff changeset
133
170
aa154c4086cb Replace scene .freeze and .thaw methods with .enter and .leave.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
134 def enter(self):
104
12ce1d131a72 Hack in resume game option
Neil Muller <drnlmuller@gmail.com>
parents: 102
diff changeset
135 """Unfreeze"""
12ce1d131a72 Hack in resume game option
Neil Muller <drnlmuller@gmail.com>
parents: 102
diff changeset
136 self._world.thaw()
243
4050e77dade6 Add support for background music tracks
Neil Muller <drnlmuller@gmail.com>
parents: 206
diff changeset
137 self._level.enter()
88
bf4adb40ca3c Rough outline of a player object, completely with statuesque flying fox
Neil Muller <drnlmuller@gmail.com>
parents: 50
diff changeset
138
123
592477d8b09b Add fps to game
Neil Muller <drnlmuller@gmail.com>
parents: 114
diff changeset
139 def draw(self, screen_surface, engine):
111
601d2a500e4a Hook up scrolling.
Simon Cross <hodgestar@gmail.com>
parents: 106
diff changeset
140 if self._clip_rect is None:
601d2a500e4a Hook up scrolling.
Simon Cross <hodgestar@gmail.com>
parents: 106
diff changeset
141 self._clip_rect = pygame.Rect((0, 0), screen_surface.get_size())
15
538d15e6cca1 Add level scenes
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
142
251
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
143 if not self._paused and not self._dialogue:
173
21d34f1f15b2 Press p to pause.
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
144 for key in self._fast_keys_down:
21d34f1f15b2 Press p to pause.
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
145 self._fast_key_map[key]()
21d34f1f15b2 Press p to pause.
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
146 self._world.update()
169
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
147
111
601d2a500e4a Hook up scrolling.
Simon Cross <hodgestar@gmail.com>
parents: 106
diff changeset
148 self._update_clip_rect()
40
fa1bb94cfa76 Re-factor drawing to blit to a clip rect in the One True Level Surface before blitting that to the screen.
Simon Cross <hodgestar@gmail.com>
parents: 16
diff changeset
149
111
601d2a500e4a Hook up scrolling.
Simon Cross <hodgestar@gmail.com>
parents: 106
diff changeset
150 self._level_surface.set_clip(self._clip_rect)
40
fa1bb94cfa76 Re-factor drawing to blit to a clip rect in the One True Level Surface before blitting that to the screen.
Simon Cross <hodgestar@gmail.com>
parents: 16
diff changeset
151 self._level.draw(self._level_surface)
fa1bb94cfa76 Re-factor drawing to blit to a clip rect in the One True Level Surface before blitting that to the screen.
Simon Cross <hodgestar@gmail.com>
parents: 16
diff changeset
152 self._world.draw(self._level_surface)
251
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
153 if self._dialogue:
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
154 self._dialogue.draw(self._level_surface)
40
fa1bb94cfa76 Re-factor drawing to blit to a clip rect in the One True Level Surface before blitting that to the screen.
Simon Cross <hodgestar@gmail.com>
parents: 16
diff changeset
155
123
592477d8b09b Add fps to game
Neil Muller <drnlmuller@gmail.com>
parents: 114
diff changeset
156 fps_text_pos = self._clip_rect.left + 10, self._clip_rect.top + 10
183
691d2795ae3c Add text shadow
Stefano Rivera <stefano@rivera.za.net>
parents: 173
diff changeset
157 fps_text = Text('FPS: %.1f' % engine.get_fps(), fps_text_pos, shadow='white')
123
592477d8b09b Add fps to game
Neil Muller <drnlmuller@gmail.com>
parents: 114
diff changeset
158 fps_text.draw(self._level_surface)
592477d8b09b Add fps to game
Neil Muller <drnlmuller@gmail.com>
parents: 114
diff changeset
159
173
21d34f1f15b2 Press p to pause.
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
160 if self._paused:
21d34f1f15b2 Press p to pause.
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
161 paused_text_pos = self._clip_rect.centerx - 10, self._clip_rect.centery - 10
21d34f1f15b2 Press p to pause.
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
162 paused_text = Text('Paused', paused_text_pos)
21d34f1f15b2 Press p to pause.
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
163 paused_text.draw(self._level_surface)
21d34f1f15b2 Press p to pause.
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
164
244
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
165 if self._player_dead:
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
166 death_text_pos = self._clip_rect.centerx - 100, self._clip_rect.centery - 100
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
167 death_text = Text("You've died.\nPress Escape to exit or Return to restart the level", death_text_pos)
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
168 death_text.draw(self._level_surface)
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
169
111
601d2a500e4a Hook up scrolling.
Simon Cross <hodgestar@gmail.com>
parents: 106
diff changeset
170 screen_surface.blit(self._level_surface, (0, 0), self._clip_rect)
601d2a500e4a Hook up scrolling.
Simon Cross <hodgestar@gmail.com>
parents: 106
diff changeset
171
601d2a500e4a Hook up scrolling.
Simon Cross <hodgestar@gmail.com>
parents: 106
diff changeset
172 def _update_clip_rect(self):
601d2a500e4a Hook up scrolling.
Simon Cross <hodgestar@gmail.com>
parents: 106
diff changeset
173 cr = self._clip_rect
601d2a500e4a Hook up scrolling.
Simon Cross <hodgestar@gmail.com>
parents: 106
diff changeset
174 lr = self._level_surface.get_rect()
150
a5ca417ee39a Centre camera one tile higher then the midbottom of the player, to avoid bouncing around due to animation size mismatches.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
175 cr.center = self._player.collide_rect.move(0, -level.TILE_SIZE[0]).midbottom
124
fde3d25cb4b9 Replace custom clamping code with a call to .clamp_ip.
Simon Cross <hodgestar@gmail.com>
parents: 123
diff changeset
176 cr.clamp_ip(lr)
15
538d15e6cca1 Add level scenes
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
177
270
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
178
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
179 def _detect_key_sequence(self, ev):
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
180 if ev.key not in self._fast_key_map:
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
181 self._key_sequence = []
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
182 return False
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
183
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
184 print ev
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
185
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
186 if ev.type is KEYUP:
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
187 if (not self._key_sequence
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
188 or ev.key != self._key_sequence[-1]
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
189 or (time.time() - self._last_keydown_time) > constants.DOUBLE_TAP_TIME):
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
190 self._key_sequence = []
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
191 return False
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
192 self._last_keyup_time = time.time()
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
193 return False
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
194
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
195 if ev.type is KEYDOWN:
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
196 if self._last_keyup_time is None or (time.time() - self._last_keyup_time) > constants.DOUBLE_TAP_TIME:
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
197 self._key_sequence = []
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
198 self._key_sequence.append(ev.key)
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
199 self._last_keydown_time = time.time()
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
200 for seq in self._key_tap_map:
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
201 if seq == tuple(self._key_sequence[-len(seq):]):
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
202 self._key_sequence = self._key_sequence[-len(seq):]
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
203 return True
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
204 return False
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
205
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
206
16
e2837dd40607 Show how to use dispatch on levelscene.
Simon Cross <hodgestar@gmail.com>
parents: 15
diff changeset
207 def dispatch(self, ev):
250
8d7edd77bfbf Start hooking up NPC interactions.
Simon Cross <hodgestar@gmail.com>
parents: 248
diff changeset
208 if ev.type is KEYDOWN:
270
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
209
244
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
210 if self._player_dead:
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
211 if ev.key in self._restart_keys:
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
212 self._restart()
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
213 elif ev.key in self._quit_keys:
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
214 self._quit(False)
5bbf90e6a94b Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents: 243
diff changeset
215 return
270
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
216
251
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
217 if self._dialogue:
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
218 self._dialogue.dispatch(ev)
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
219 return
270
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
220
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
221 if self._detect_key_sequence(ev):
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
222 print "Detected double-tap:", self._key_sequence
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
223 action = self._key_tap_map.get(tuple(self._key_sequence))
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
224 if action is not None:
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
225 action()
169
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
226 if ev.key in self._fast_key_map:
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
227 self._fast_keys_down.add(ev.key)
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
228 action = self._slow_key_map.get(ev.key)
102
2e913a89e69d Link up key presses to calls to action functions on player and to quitting level.
Simon Cross <hodgestar@gmail.com>
parents: 88
diff changeset
229 if action is not None:
2e913a89e69d Link up key presses to calls to action functions on player and to quitting level.
Simon Cross <hodgestar@gmail.com>
parents: 88
diff changeset
230 action()
270
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
231
169
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
232 elif ev.type is KEYUP:
270
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
233 self._detect_key_sequence(ev)
e47efa33903b Fixed key sequence handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 268
diff changeset
234
169
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
235 if ev.key in self._fast_key_map:
b7a8f4a677e1 Replace key repeating with custom tracking of fast keys.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
236 self._fast_keys_down.discard(ev.key)
265
7628467eecd9 Add double-key tap support
Neil Muller <drnlmuller@gmail.com>
parents: 264
diff changeset
237
250
8d7edd77bfbf Start hooking up NPC interactions.
Simon Cross <hodgestar@gmail.com>
parents: 248
diff changeset
238 elif engine.PlayerDied.matches(ev):
8d7edd77bfbf Start hooking up NPC interactions.
Simon Cross <hodgestar@gmail.com>
parents: 248
diff changeset
239 self._player_dead = True
8d7edd77bfbf Start hooking up NPC interactions.
Simon Cross <hodgestar@gmail.com>
parents: 248
diff changeset
240 elif engine.OpenDialog.matches(ev):
251
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
241 self._open_dialogue(ev.npc)
250
8d7edd77bfbf Start hooking up NPC interactions.
Simon Cross <hodgestar@gmail.com>
parents: 248
diff changeset
242 elif engine.CloseDialog.matches(ev):
251
432f6997d306 More hooking up of interacting with NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 250
diff changeset
243 self._close_dialogue()