/python/spriteful/entity/core.py

https://github.com/clofresh/spriteful · Python · 110 lines · 83 code · 25 blank · 2 comment · 6 complexity · d35d9602c508a85dbc12ba7c57062bbb MD5 · raw file

  1. from glob import glob
  2. from random import randint
  3. from . import behavior
  4. from ..util import Position
  5. class Entity(object):
  6. ''' Base class for any game object.
  7. '''
  8. main_class = None
  9. other_classes = []
  10. starting_sprite = None
  11. @staticmethod
  12. def get_sprites(main_class):
  13. sprites = {}
  14. for sprite in glob('static/img/sprites/%s*' % main_class):
  15. _, sprite_type, _, _ = sprite.split('.')
  16. sprites[sprite_type] = '/' + sprite
  17. return sprites
  18. @classmethod
  19. def default(cls, x, y, **properties):
  20. position = Position(int(x), int(y))
  21. return cls(
  22. position,
  23. cls.main_class,
  24. cls.other_classes,
  25. cls.starting_sprite,
  26. **properties
  27. )
  28. def __init__(self, position, main_class, other_classes, starting_sprite, **properties):
  29. self.position = position
  30. self.main_class = main_class
  31. self.other_classes = other_classes
  32. self.starting_sprite = starting_sprite
  33. self.sprites = self.get_sprites(main_class)
  34. self.id = None
  35. self.intentions = []
  36. self._changes = []
  37. self.properties = properties
  38. def __repr__(self):
  39. return '%s(%s)' % (self.__class__.__name__, repr(self.position))
  40. def set_id(self, id_number):
  41. self.id = '%s-%d' % (self.main_class, id_number)
  42. def to_dict(self):
  43. return {
  44. 'selector':"#%s" % self.id,
  45. 'id': self.id,
  46. 'position': self.position,
  47. 'main_class': self.main_class,
  48. 'other_classes': self.other_classes,
  49. 'starting_sprite': self.starting_sprite,
  50. 'sprites': self.sprites,
  51. }
  52. @property
  53. def changed(self):
  54. return len(self._changes) > 0
  55. def changes(self):
  56. output = self._changes
  57. self._changes = []
  58. return output
  59. def has_class(self, selected_class):
  60. all_classes = set([self.main_class]).union(self.other_classes)
  61. return selected_class in all_classes
  62. def update(self, world):
  63. if len(self.intentions) > 0:
  64. intent = self.intentions[0]
  65. intent(world)
  66. self.intentions = self.intentions[1:]
  67. def receive(self, message):
  68. print '%s received %s' % (self.id, repr(message))
  69. method = getattr(self, 'receive_%s' % message[u'type'], None)
  70. if method:
  71. method(message)
  72. class Pc(Entity, behavior.CanMove, behavior.CanBite):
  73. main_class = 'monkey'
  74. other_classes = ['facing-left', 'player']
  75. starting_sprite = 'walk'
  76. class Npc(Entity, behavior.CanMove):
  77. main_class = 'large-monkey'
  78. other_classes = ['facing-left']
  79. starting_sprite = 'walk'
  80. def update(self, world):
  81. if not self.intentions:
  82. if randint(0, 100) == 1:
  83. self.intent_move(world.random_position())
  84. else:
  85. super(self.__class__, self).update(world)