Ik probeer voor het eerst een spel te maken in python / pyglet, maar heb een probleem met de collision detection.
De code werkt wel, maar enkel als ik de walkspeed op 1 pixel per gameloop zet.
Als ik de walkspeed op bvb 5 pixels / gameloop zet, dan gaat de collision functie het volgende doen:
voorbeeldsituatie:
De player rectangle bevindt zich dus 4 pixels rechts van de muur.
Nu ga ik als player naar links met 5px/gameloop
Dan gaat de collision detectie het volgende doen:
(player.x1 - 5px) < muur.x2 => dus collisie gededecteerd, waardoor de speler niet tot precies 1 pixels tegen de muur kan. (omwillen van die walkspeed van 5 pixels)
in mijn game loop doe ik het volgende:
De player handlepos functie:
(Player heeft x en posX (posX = voor de berekeningen, x = om de image coordinaten up te daten)
Nadat de collision functie uitgevoerd werd wordt de player.update opgeroepen
(self.moveLeft, self.moveRight, .. zijn booleans die ingesteld worden in de collision functie, daar wordt dus bepaald in welke richting je verder mag lopen)
De code werkt wel, maar enkel als ik de walkspeed op 1 pixel per gameloop zet.
Als ik de walkspeed op bvb 5 pixels / gameloop zet, dan gaat de collision functie het volgende doen:
voorbeeldsituatie:
code:
1
2
3
| muur.x2 = 40 player.x1 = 44 player.x2 = 84 |
De player rectangle bevindt zich dus 4 pixels rechts van de muur.
Nu ga ik als player naar links met 5px/gameloop
Dan gaat de collision detectie het volgende doen:
(player.x1 - 5px) < muur.x2 => dus collisie gededecteerd, waardoor de speler niet tot precies 1 pixels tegen de muur kan. (omwillen van die walkspeed van 5 pixels)
in mijn game loop doe ik het volgende:
code:
1
2
3
4
5
6
7
| def update(dt):
player.handle_pos()
print(player.posX)
player.collides_with(tile)
for obj in objects:
obj.update(dt) |
De player handlepos functie:
(Player heeft x en posX (posX = voor de berekeningen, x = om de image coordinaten up te daten)
code:
1
2
3
4
5
6
7
8
9
10
11
12
| def handle_pos(self):
if self.key_handler[key.LEFT]:
self.posX -= 1
if self.key_handler[key.RIGHT]:
self.posX += 1
if self.key_handler[key.UP]:
self.posY += 1
if self.key_handler[key.DOWN]:
self.posY -= 1 |
Nadat de collision functie uitgevoerd werd wordt de player.update opgeroepen
(self.moveLeft, self.moveRight, .. zijn booleans die ingesteld worden in de collision functie, daar wordt dus bepaald in welke richting je verder mag lopen)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| def update(self, dt):
if self.key_handler[key.LEFT]:
if self.moveLeft:
self.image = anim_left
self.x = self.posX
else:
self.posX = self.x
if self.key_handler[key.RIGHT]:
if self.moveRight:
self.image = anim_right
self.x = self.posX
else:
self.posX = self.x
if self.key_handler[key.UP]:
if self.moveUp:
self.image = anim_up
self.y = self.posY
else:
self.posY = self.y
if self.key_handler[key.DOWN]:
if (self.moveDown):
self.image = anim_down
self.y = self.posY
else:
self.posY = self.y |