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 |