|
|
@@ -3,12 +3,14 @@ import pygame
|
|
|
from tileset import Tileset
|
|
|
|
|
|
class Character(object):
|
|
|
+ SPEED = 2
|
|
|
movement = [0, 0]
|
|
|
|
|
|
- def __init__(self, start_pos):
|
|
|
- self.render_x, self.render_y = start_pos
|
|
|
- self.render_x *= Tileset.TILESIZE
|
|
|
- self.render_y *= Tileset.TILESIZE
|
|
|
+ def __init__(self, start_pos, collisions):
|
|
|
+ self.pos = list(start_pos)
|
|
|
+ self.render_x = self.pos[0] * Tileset.TILESIZE
|
|
|
+ self.render_y = self.pos[1] * Tileset.TILESIZE
|
|
|
+ self.collisions = collisions
|
|
|
|
|
|
def frame(self, keys):
|
|
|
# are we done moving?
|
|
|
@@ -17,27 +19,41 @@ class Character(object):
|
|
|
if self.render_y % Tileset.TILESIZE == 0:
|
|
|
self.movement[1] = 0
|
|
|
|
|
|
- SPEED = 2
|
|
|
- direction = None
|
|
|
# can we start moving?
|
|
|
+ direction = None
|
|
|
+ movement_x = movement_y = None
|
|
|
if self.movement[1] == 0:
|
|
|
- if keys[pygame.K_DOWN] or keys[pygame.K_j]:
|
|
|
- self.movement[1] = SPEED
|
|
|
+ if (keys[pygame.K_DOWN] or keys[pygame.K_j]):
|
|
|
+ movement_y = 1
|
|
|
direction = Tileset.DOWN
|
|
|
elif keys[pygame.K_UP] or keys[pygame.K_k]:
|
|
|
- self.movement[1] = -SPEED
|
|
|
+ movement_y = -1
|
|
|
direction = Tileset.UP
|
|
|
+ # vertical collision detection
|
|
|
+ # each direction is checked separately because holding
|
|
|
+ # down+right on a right wall should still move you down
|
|
|
+ if movement_y and (self.pos[0], self.pos[1] + movement_y) in self.collisions:
|
|
|
+ movement_y = 0
|
|
|
if self.movement[0] == 0:
|
|
|
if keys[pygame.K_RIGHT] or keys[pygame.K_l]:
|
|
|
- self.movement[0] = SPEED
|
|
|
- if not self.movement[1]: # prefer up/down when moving diagonally
|
|
|
+ movement_x = 1
|
|
|
+ if self.movement[1] == 0 and movement_y is None: # prefer up/down when moving diagonally
|
|
|
direction = Tileset.RIGHT
|
|
|
elif keys[pygame.K_LEFT] or keys[pygame.K_h]:
|
|
|
- self.movement[0] = -SPEED
|
|
|
- if not self.movement[1]:
|
|
|
+ movement_x = -1
|
|
|
+ if self.movement[1] == 0 and movement_y is None:
|
|
|
direction = Tileset.LEFT
|
|
|
+ # horizontal collision detection
|
|
|
+ if movement_x and (self.pos[0] + movement_x, self.pos[1]) in self.collisions:
|
|
|
+ movement_x = 0
|
|
|
+ if movement_x:
|
|
|
+ self.movement[0] = movement_x
|
|
|
+ self.pos[0] += movement_x
|
|
|
+ if movement_y:
|
|
|
+ self.movement[1] = movement_y
|
|
|
+ self.pos[1] += movement_y
|
|
|
|
|
|
# move!
|
|
|
- self.render_x += self.movement[0]
|
|
|
- self.render_y += self.movement[1]
|
|
|
+ self.render_x += self.movement[0] * self.SPEED
|
|
|
+ self.render_y += self.movement[1] * self.SPEED
|
|
|
return direction
|