#python #pygame #collision
#python #pygame #столкновение
Вопрос:
Я программировал игру на python, используя модули pygame и math. Я написал эти коды для обнаружения столкновений (я создал 5 препятствий, с которыми я хочу, чтобы мой игрок столкнулся), но проблема была во время игры, иногда это работает, а иногда нет.
Это функции столкновения, которые я определил
def collide1(binX, binY, playerX, playerY):
distance = math.sqrt(math.pow(binX - playerX, 2) math.pow(binY - playerY, 2))
if distance == 27:
return True
else:
return False
def collide2(snowX, snowY, playerX, playerY):
distance = math.sqrt(math.pow(snowX - playerX, 2) math.pow(snowY - playerY, 2))
if distance == 27:
return True
else:
return False
def collide3(glacierX, glacierY, playerX, playerY):
distance = math.sqrt(math.pow(glacierX - playerX, 2) math.pow(glacierY - playerY, 2))
if distance == 27:
return True
else:
return False
def collide4(boardX, boardY, playerX, playerY):
distance = math.sqrt(math.pow(boardX - playerX, 2) math.pow(boardY - playerY, 2))
if distance == 27:
return True
else:
return False
def collide5(iceX, iceY, playerX, playerY):
distance = math.sqrt(math.pow(iceX - playerX, 2) math.pow(iceY - playerY, 2))
if distance == 27:
return True
else:
return False
В цикле while
# Collision Detection
collision1 = collide1(binX, binY, playerX, playerY)
collision2 = collide2(snowX, snowY, playerX, playerY)
collision3 = collide3(glacierX, glacierY, playerX, playerY)
collision4 = collide4(boardX, boardY, playerX, playerY)
collision5 = collide5(iceX, iceY, playerX, playerY)
if collision1:
print("You have collided!")
elif collision2:
print("You have collided!")
elif collision3:
print("You have collided!")
elif collision4:
print("You have collided!")
elif collision5:
print("You have collided!")
Пожалуйста, скажите мне, где я делаю это неправильно.
Комментарии:
1.
if distance == 27:
->if distance <= 27:
2. Исходный код мне неясен в отношении того, как вы пытаетесь это сделать… в любом случае … вы можете попробовать модуль python, подобный этому pymunk.org/en/latest/examples.html или взгляните на то, как это устроено.
Ответ №1:
На самом деле, вы просто проверяете, касается ли игрок препятствия, но вы пропустите столкновение, если игрок пересечет препятствие. Вы должны оценить, если distance <= 27
, а не distance == 27
. Кроме того, вполне достаточно реализовать 1 функцию для теста на столкновение.
def collide(x1, y1, x2, y2):
distance = math.sqrt(math.pow(x1 - x2, 2) math.pow(y1 - y2, 2))
if distance <= 27:
return True
else:
return False
Функция может быть дополнительно упрощена:
def collide(x1, y1, x2, y2):
distance = math.hypot(x1 - x2, y1 - y2)
return distance <= 27
Используйте цикл для выполнения теста на столкновение:
obstacles = [(binX, binY), (snowX, snowY), (glacierX, glacierY), (boardX, boardY), (iceX, iceY)]
for x, y in obstacles:
collision = collide(x, y, playerX, playerY)
if collision:
print("You have collided!")
Комментарии:
1. Большое вам спасибо, сэр / мэм, я застрял в этой проблеме на целый день, и я не могу объяснить, насколько хорошо я себя чувствую после того, как она наконец заработала.
Ответ №2:
Прямо сейчас вы сталкиваетесь только в том случае, если расстояние ровно 27. Если вы предполагаете, что сферы, вы все равно можете считать их «сталкивающимися», если они имеют размер менее 27 пикселей.
Поэтому замените все ваши расстояния на if distance <= 27:
Примечание меньше или равно.
Еще одна вещь, которую следует отметить, это то, что вычисление квадратных корней происходит очень медленно. Гораздо быстрее проверить, если distance_squared <= 27 * 27
затем проверить math.pow(distance_squared, 0.5) <= 27
.
Комментарии:
1. Большое вам спасибо, сэр / мэм, я всегда буду помнить ваши замечания.