im working on a litle game using pygame in python3. Im using tiled for the map and pyscroll for the camera and i don't know how to solve this issue: i made detection collision that work using object layer in tiled and a litle bit of code. the detection work pretty well but when it come to say to the ply "u can't go this way there is a wall" im stuck... Usually, i first create a array where i put all the wall that you will collide in with a for loop, then i give my ply object x and y coordinate: i use them to make him spawn at a certaine position in the map but also i update this coordinate every frame in a variable. finally i store this coordinate in a other variable with the copy() function so i have 2 variable: position and old_position.
Then, i check every frame if there is a collision with walls and if they are collision: position = old_position | so the ply never pass through the wall. This time its not working and i really don't know why '-- any suggestions?
plr = Player(320, 320)
map_g.add(plr)
walls = []
for obj in tmx_data.objects:
if obj.type == "collision":
walls.append(pygame.Rect(obj.x, obj.y, obj.width, obj.height))
Loop
plr.save_pos()
map_g.center(plr.rect.center)
map_g.update(0.075)
for sprite in map_g.sprites():
if sprite.feet.collidelist(walls) > -1:
print("collision")
sprite.collision_repos()
map_g.draw(win)
Ply Class
def __init__(self, pos_x, pos_y):
super().__init__()
...
self.position = [pos_x, pos_y]
self.old_position = self.position.copy()
...
def save_pos(self):
self.old_position = self.position.copy()
def collision_repos(self):
self.position = self.old_position
self.rect.topleft = self.position
self.feet.midbottom = self.rect.midbottom
def update(self, speed):
self.rect.topleft = self.position
self.feet.midbottom = self.rect.midbottom
...
So actually i solved the issue after 5h... Its actually a dumb problem so everything was working, its just that the save_pos() function was called too quick and worked one time, after that the function was broken. all you got to do here is just let the interpreter some m/s so call the function later in your code...