class Collider: def __init__(self, entity, level): self.entity = entity self.level = level.level self.levelObj = level self.result = [] def checkX(self): if self.leftLevelBorderReached() or self.rightLevelBorderReached(): return try: rows = [ self.level[self.entity.getPosIndex().y], self.level[self.entity.getPosIndex().y + 1], self.level[self.entity.getPosIndex().y + 2], ] except Exception: return for row in rows: tiles = row[self.entity.getPosIndex().x : self.entity.getPosIndex().x + 2] for tile in tiles: if tile.rect is not None: if self.entity.rect.colliderect(tile.rect): if self.entity.vel.x > 0: self.entity.rect.right = tile.rect.left self.entity.vel.x = 0 if self.entity.vel.x < 0: self.entity.rect.left = tile.rect.right self.entity.vel.x = 0 def checkY(self): self.entity.onGround = False try: rows = [ self.level[self.entity.getPosIndex().y], self.level[self.entity.getPosIndex().y + 1], self.level[self.entity.getPosIndex().y + 2], ] except Exception: try: self.entity.gameOver() except Exception: self.entity.alive = None return for row in rows: tiles = row[self.entity.getPosIndex().x : self.entity.getPosIndex().x + 2] for tile in tiles: if tile.rect is not None: if self.entity.rect.colliderect(tile.rect): if self.entity.vel.y > 0: self.entity.onGround = True self.entity.rect.bottom = tile.rect.top self.entity.vel.y = 0 # reset jump on bottom if self.entity.traits is not None: if "JumpTrait" in self.entity.traits: self.entity.traits["JumpTrait"].reset() if "bounceTrait" in self.entity.traits: self.entity.traits["bounceTrait"].reset() if self.entity.vel.y < 0: self.entity.rect.top = tile.rect.bottom self.entity.vel.y = 0 def rightLevelBorderReached(self): if self.entity.getPosIndexAsFloat().x > self.levelObj.levelLength - 1: self.entity.rect.x = (self.levelObj.levelLength - 1) * 32 self.entity.vel.x = 0 return True def leftLevelBorderReached(self): if self.entity.rect.x < 0: self.entity.rect.x = 0 self.entity.vel.x = 0 return True