I have been making a 2d platformer using Python with PyGame. It has all be going good, but I have stumbled accross many problems with collision detection. Here they are:
- You can't go through objects that have the exact space for you to go through
- You can go through the ceiling (very weird)
The code I have is very big and I think that, since it involves multiple classes, I should post it on GitHub, so here is the link to my repository: https://github.com/pta2002/SuperBros.
But just for reference, here is my colliion detection method:
def detectCollisions(self, x1, y1, w1, h1, x2, y2, w2, h2):
if x2 + w2 >= x1 >= x2 and y2 + h2 >= y1 >= y2:
return 1
elif x2 + w2 >= x1 + w1 >= x2 and y2 + h2 >= y1 >= y2:
return 2
elif x2 + w2 >= x1 >= x2 and y2 + h2 >= y1 + h1 >= y2:
return 3
elif x2 + w2 >= x1 + w1 >= x2 and y2 + h2 >= y1 + h1 >= y2:
return 4
else:
return 0
and here is my update method:
def update(self, gravity, block_list):
if self.velocity < 0:
self.falling = True
collision = 0
blockX, blockY = 0, 0
self.canMoveRight = True
self.canMoveLeft = True
for block in block_list:
collision = self.detectCollisions(self.x, self.y, self.width, self.height,
block.x, block.y, block.width, block.height)
if not collision == 0:
blockX = block.x
blockY = block.y
break
if not collision == 0:
if self.falling:
self.falling = False
self.onGround = True
self.velocity = 0
self.y = block.y - self.height
else:
if collision == 2:
self.canMoveRight = False
if collision == 1:
self.canMoveLeft = False
else:
self.falling = True
self.onGround = False
if not self.onGround:
self.velocity += gravity
self.y -= self.velocity
if (self.canMoveRight and self.xvel > 0) or (self.canMoveLeft and self.xvel < 0):
self.x += self.xvel
if self.jumping:
if self.onGround:
self.velocity = 8
self.onGround = False
if self.cur_image >= self.num_images - 1:
self.cur_image = 0
else:
self.cur_image += 1