def __resolve_tile_collisions__(self, sideTiles, aboveBelowTiles, previousBB, collisionLayer): """ Resolves collisions with Spike Tiles first, and sets State based on collision results. These State changes would be appropriate for a platformer. """ originalX, originalY = self.Position allTiles = set() allTiles.update(sideTiles) allTiles.update(aboveBelowTiles) for tile in allTiles: if type(tile) in self._specialTiles: self.ResolveCollision(tile) tile.ResolveCollision(self) # after resolving, get rid of all the tiles of that type so we only collide once for sideTile in list(sideTiles): if isinstance(sideTile, type(tile)): sideTiles.remove(sideTile) for aboveBelowTile in list(aboveBelowTiles): if isinstance(aboveBelowTile, type(tile)): aboveBelowTiles.remove(aboveBelowTile) break # collides with normal square tiles if collisionLayer.Name == Constants.EditorConstants.LAYER_NAME_COLLISION_TILES: Actor.__resolve_tile_collisions__(self, sideTiles, aboveBelowTiles, previousBB, collisionLayer) # For a platformer, switch to the land state when hitting the ground if (originalY > self.Position[1]): # got pushed up, must be on ground if not self._onGround: #self.ChangeState('land') self._onGround = True else: ''' # little hack to make falling off things slower - CAD if (self._onGround): self.Velocity = Vector((self.Velocity.x, self.Velocity.y * 0.60)) ''' if (self.Velocity.y > 0.0): self._onGround = False if (originalY < self.Position[1]): # hit a ceiling, stop moving up self.Velocity = Vector((self.Velocity.x, 0)) if (originalX != self.Position[0]): # hit a wall, Velocity goes to 0? self.Velocity = Vector((0, self.Velocity.y))