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