From fe8e0249c1916c74eed97d9750b16b03e87953e7 Mon Sep 17 00:00:00 2001 From: raylu Date: Sat, 12 Oct 2013 03:48:28 -0700 Subject: collision detection! --- character.py | 46 +++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-) (limited to 'character.py') diff --git a/character.py b/character.py index 9129c1e..51521ce 100644 --- a/character.py +++ b/character.py @@ -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 -- cgit v1.2.3