| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- import pygame
- from tileset import Tileset
- class Character(object):
- SPEED = 2
- movement = [0, 0]
- 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?
- if self.render_x % Tileset.TILESIZE == 0:
- self.movement[0] = 0
- if self.render_y % Tileset.TILESIZE == 0:
- self.movement[1] = 0
- # 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]):
- movement_y = 1
- direction = Tileset.DOWN
- elif keys[pygame.K_UP] or keys[pygame.K_k]:
- 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]:
- 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]:
- 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.SPEED
- self.render_y += self.movement[1] * self.SPEED
- return direction
|