Mercurial > skaapsteker
comparison skaapsteker/sprites/base.py @ 623:65881746dc20
More Sprite hierarchy work.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Sat, 07 May 2011 13:59:00 +0200 |
parents | da331c80ec08 |
children | 83569a6b3ad8 |
comparison
equal
deleted
inserted
replaced
622:da331c80ec08 | 623:65881746dc20 |
---|---|
33 | 33 |
34 class GameSprite(Sprite): | 34 class GameSprite(Sprite): |
35 image_dir = 'sprites/' | 35 image_dir = 'sprites/' |
36 image_file = None | 36 image_file = None |
37 sprite_layer = None | 37 sprite_layer = None |
38 debug_color = (240, 0, 0) | |
38 | 39 |
39 def __init__(self, pos, **opts): | 40 def __init__(self, pos, **opts): |
40 Sprite.__init__(self) | 41 Sprite.__init__(self) |
41 if self.sprite_layer is not None: | 42 if self.sprite_layer is not None: |
42 # pygame's Sprite class clobbers self._layer in __init__(), so we need to thwart it. | 43 # pygame's Sprite class clobbers self._layer in __init__(), so we need to thwart it. |
43 self._layer = self.sprite_layer | 44 self._layer = self.sprite_layer |
44 self.setup_image_data(pos) | 45 self.setup_image_data(pos, **opts) |
45 self.setup(**opts) | 46 self.setup(**opts) |
46 | 47 |
47 def setup(self): | 48 def setup(self): |
48 pass | 49 pass |
49 | 50 |
50 def get_tile_pos(self): | 51 def get_tile_pos(self): |
51 return cdiv(self.rect.center, TILE_SIZE) | 52 return cdiv(self.rect.center, TILE_SIZE) |
52 | 53 |
53 def setup_image_data(self, pos): | 54 def setup_image_data(self, pos, **opts): |
54 self.image = data.load_image(self.image_dir + self.image_file) | 55 self.image = data.load_image(self.image_dir + self.image_file) |
55 self.rect = self.image.get_rect(midbottom=tile_midbottom(pos)) | 56 self.rect = self.image.get_rect(midbottom=tile_midbottom(pos)) |
56 self.collide_rect = self.rect.move(0, 0) | 57 self.collide_rect = self.rect.move(0, 0) |
58 | |
59 def get_debug_color(self): | |
60 return self.debug_color | |
61 | |
62 def draw_debug(self, surface): | |
63 pygame.draw.rect(surface, self.get_debug_color(), self.collide_rect, 1) | |
57 | 64 |
58 | 65 |
59 class AnimatedGameSprite(GameSprite): | 66 class AnimatedGameSprite(GameSprite): |
60 # first item is the starting animation | 67 # first item is the starting animation |
61 animation_regexes = ( | 68 animation_regexes = ( |
68 wants_updates = True | 75 wants_updates = True |
69 frame_pause = 0.1 # default time between animation frames | 76 frame_pause = 0.1 # default time between animation frames |
70 facings = None | 77 facings = None |
71 | 78 |
72 | 79 |
73 def setup_image_data(self, pos): | 80 def setup_image_data(self, pos, **opts): |
74 self._animations = dict((k, []) for k, r in self.animation_regexes) | 81 self._animations = dict((k, []) for k, r in self.animation_regexes) |
75 self._frame = 0 | 82 self._frame = 0 |
76 self._last_time = 0 | 83 self._last_time = 0 |
77 self._animation = self.animation_regexes[0][0] | 84 self._animation = self.animation_regexes[0][0] |
78 if self.facings and self._animation in self.facings: | 85 if self.facings and self._animation in self.facings: |
390 def remove(self): | 397 def remove(self): |
391 self._me.level = '_limbo' | 398 self._me.level = '_limbo' |
392 self.kill() | 399 self.kill() |
393 | 400 |
394 | 401 |
395 class Geography(Sprite): | 402 class Geography(GameSprite): |
396 mobile = False | 403 mobile = False |
397 gravitates = False | 404 gravitates = False |
398 collides_with = set([PC_LAYER, MONSTER_LAYER, NPC_LAYER, PROJECTILE_LAYER]) | 405 collides_with = set([PC_LAYER, MONSTER_LAYER, NPC_LAYER, PROJECTILE_LAYER]) |
399 is_ground = True | 406 is_ground = True |
400 actionable = False | 407 actionable = False |
401 bounce_factor = (0.0, 0.0) | 408 bounce_factor = (0.0, 0.0) |
402 | 409 |
403 def __init__(self, pos, image): | 410 def setup(self, image): |
404 Sprite.__init__(self) | 411 pass |
412 | |
413 def setup_image_data(self, pos, image, **opts): | |
405 self.tile_pos = pos | 414 self.tile_pos = pos |
406 self.image = image | 415 self.image = image |
407 self.collide_rect = self.image.get_bounding_rect(1) | 416 self.collide_rect = self.image.get_bounding_rect(1) |
408 self.floor_rect = Rect(self.collide_rect.topleft, (self.collide_rect.width, 2)) | 417 self.floor_rect = Rect(self.collide_rect.topleft, (self.collide_rect.width, 2)) |
409 self.rect = self.image.get_rect() | 418 self.rect = self.image.get_rect() |
427 actionable = True | 436 actionable = True |
428 | 437 |
429 image_file = 'torii.png' | 438 image_file = 'torii.png' |
430 | 439 |
431 | 440 |
432 def setup_image_data(self, pos): | 441 def setup_image_data(self, pos, **opts): |
433 super(Doorway, self).setup_image_data(pos) | 442 super(Doorway, self).setup_image_data(pos, **opts) |
434 self.image = pygame.transform.scale(self.image, self.image.get_rect().center) | 443 self.image = pygame.transform.scale(self.image, self.image.get_rect().center) |
435 self.rect = self.image.get_rect(midbottom=self.rect.midbottom) | 444 self.rect = self.image.get_rect(midbottom=self.rect.midbottom) |
436 self.collide_rect = self.rect | 445 self.collide_rect = self.rect |
437 | 446 |
438 | 447 |
458 | 467 |
459 | 468 |
460 class StartingDoorway(Doorway): | 469 class StartingDoorway(Doorway): |
461 actionable = False | 470 actionable = False |
462 | 471 |
463 def setup_image_data(self, pos): | 472 def setup_image_data(self, pos, **opts): |
464 self.image = pygame.Surface((0, 0)) | 473 self.image = pygame.Surface((0, 0)) |
465 self.rect = self.image.get_rect(midbottom=tile_midbottom(pos)) | 474 self.rect = self.image.get_rect(midbottom=tile_midbottom(pos)) |
466 self.collide_rect = self.rect.move(0, 0) | 475 self.collide_rect = self.rect.move(0, 0) |
467 | 476 |
468 | 477 |
486 self.image_file = 'kitsune.png' | 495 self.image_file = 'kitsune.png' |
487 else: | 496 else: |
488 self.image_file = 'monster.png' | 497 self.image_file = 'monster.png' |
489 super(Skeleton, self).__init__(pos, **opts) | 498 super(Skeleton, self).__init__(pos, **opts) |
490 | 499 |
491 def setup_image_data(self, pos): | 500 def setup_image_data(self, pos, **opts): |
492 GameSprite.setup_image_data(self, pos) | 501 super(Skeleton, self).setup_image_data(pos, **opts) |
493 # Pixel based rect, not tile: | 502 # Pixel based rect, not tile: |
494 self.rect = self.image.get_rect(midbottom=self._pos) | 503 self.rect = self.image.get_rect(midbottom=self._pos) |
495 self.collide_rect = self.rect.move(0, 0) | 504 self.collide_rect = self.rect.move(0, 0) |
496 | 505 |
497 | 506 |