Я делаю платформу 2d с использованием Python с PyGame. Все идет хорошо, но я столкнулся с множеством проблем с обнаружением столкновений. Вот они:Обнаружение столкновений с PyGame
- Вы не можете пройти через объекты, которые имеют точное место для вас, чтобы пройти через
- Вы можете пройти через потолок (очень странный)
код у меня есть очень большой, и я думаю, что, поскольку он включает несколько классов, я должен опубликовать его на GitHub, так что вот ссылка на мой репозиторий: https://github.com/pta2002/SuperBros.
Но только для справки, вот мой метод обнаружения colliion:
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
и вот мой метод обновления:
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
Почему вы переходящим в й/г/ш/в 1 и 2? Почему бы не пройти в двух прямых объектах? – DJMcMayhem
Да. Существует метод «Rect», который имеет проверку на столкновение. Проверьте документы pygame – bcdan