character.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import pygame
  2. from tileset import Tileset
  3. class Character(object):
  4. SPEED = 2
  5. movement = [0, 0]
  6. def __init__(self, start_pos, collisions):
  7. self.pos = list(start_pos)
  8. self.render_x = self.pos[0] * Tileset.TILESIZE
  9. self.render_y = self.pos[1] * Tileset.TILESIZE
  10. self.collisions = collisions
  11. def frame(self, keys):
  12. # are we done moving?
  13. if self.render_x % Tileset.TILESIZE == 0:
  14. self.movement[0] = 0
  15. if self.render_y % Tileset.TILESIZE == 0:
  16. self.movement[1] = 0
  17. # can we start moving?
  18. direction = None
  19. movement_x = movement_y = None
  20. if self.movement[1] == 0:
  21. if (keys[pygame.K_DOWN] or keys[pygame.K_j]):
  22. movement_y = 1
  23. direction = Tileset.DOWN
  24. elif keys[pygame.K_UP] or keys[pygame.K_k]:
  25. movement_y = -1
  26. direction = Tileset.UP
  27. # vertical collision detection
  28. # each direction is checked separately because holding
  29. # down+right on a right wall should still move you down
  30. if movement_y and (self.pos[0], self.pos[1] + movement_y) in self.collisions:
  31. movement_y = 0
  32. if self.movement[0] == 0:
  33. if keys[pygame.K_RIGHT] or keys[pygame.K_l]:
  34. movement_x = 1
  35. if self.movement[1] == 0 and movement_y is None: # prefer up/down when moving diagonally
  36. direction = Tileset.RIGHT
  37. elif keys[pygame.K_LEFT] or keys[pygame.K_h]:
  38. movement_x = -1
  39. if self.movement[1] == 0 and movement_y is None:
  40. direction = Tileset.LEFT
  41. # horizontal collision detection
  42. if movement_x and (self.pos[0] + movement_x, self.pos[1]) in self.collisions:
  43. movement_x = 0
  44. if movement_x:
  45. self.movement[0] = movement_x
  46. self.pos[0] += movement_x
  47. if movement_y:
  48. self.movement[1] = movement_y
  49. self.pos[1] += movement_y
  50. # move!
  51. self.render_x += self.movement[0] * self.SPEED
  52. self.render_y += self.movement[1] * self.SPEED
  53. return direction