2017-02-01 21 views
0

В основном я делаю игру с pygame, и вокруг экрана будут прямоугольники. Игроки 1 и 2 игрока. Если какой-либо из игроков 1-го уровня находится в пределах x расстояния от единиц 2 игрока, тогда огонь. Если я сделаю расстояние от центра, то это будет неточно, так как некоторые из этих прямоугольников будут намного длиннее с одной стороны и будут в пределах диапазона увольнения, но центра не будет. Я искал, но не смог найти решение этой проблемы.Pygame; проверяя, является ли кратчайшее расстояние между любыми точками на двух прямоугольниках меньше х суммы?

EDIT: удалены круги. У меня тоже будут круги, но я буду рассматривать их как прямоугольники и использовать их. Они маленькие, а погрешность в 2 пикселя не имеет значения.

+0

Что вы имеете в виду, что некоторые прямоугольники будет больше на одной стороне, это центр? Центр всегда определяется как точка с равным расстоянием между двумя противоположными краями. Если вы хотите, чтобы вы стреляли, когда игроки накладывались, тогда просто проверяйте, когда сталкиваются прямоугольники, ака ['if rect1.colliderect (rect2)'] (https://www.pygame.org/docs/ref/rect. HTML # pygame.Rect.colliderect). Или вы можете временно масштабировать ([inflate] (https://www.pygame.org/docs/ref/rect.html#pygame.Rect.inflate)), пиксели x больше, а затем проверяют на столкновение. –

+0

Я не думал о раздувании, похоже, что это сработает. Я имел в виду, что если есть два длинных тощих прямоугольника, они будут сталкиваться друг с другом, прежде чем они появятся на расстоянии х друг от друга, поскольку расстояние от их центров. Надувание кажется хорошим решением для него. – user3529201

ответ

0

Это лучшее, что я могу придумать прямо сейчас: Он сравнивает углы прямоугольника с центром круга. Если этого недостаточно, вы можете просто добавить центральные точки вдоль краев прямоугольников.

Не идеальное решение, но в зависимости от игры вы пишете это должно быть достаточно

def isInRange(rectangle, circle): 
    return (
     (rectangle.topleft.x  - circle.centerx)**2 + (rectangle.topleft.y  - circle.centery)**2 <= (mindist + r_circle)**2 or #circle in upper left quadrant of rectangle 
     (rectangle.bottomleft.x - circle.centerx)**2 + (rectangle.bottomleft.y - circle.centery)**2 <= (mindist + r_circle)**2 or #circle in bottom left quadrant of rectangle 
     (rectangle.bottomright.x - circle.centerx)**2 + (rectangle.bottomright.y - circle.centery)**2 <= (mindist + r_circle)**2 or #circle in bottom right quadrant of rectangle 
     (rectangle.topright.x - circle.centerx)**2 + (rectangle.topright.y - circle.centery)**2 <= (mindist + r_circle)**2 #circle in top right quadrant of rectangle 
     ) 
+0

Mate, функция будет очень желанной! – math2001

+0

изменил это, спасибо! – Hans

+0

В качестве аргументов требуется прямоугольник и круг, это не сработает для проверки расстояния между двумя прямоугольниками. Я должен был объяснить более четко в первоначальном посте. Я бы просто обработал круги, как прямоугольники, и использовал их правильно, чтобы проверить distace. Круги достаточно малы, чтобы это не имело значения. – user3529201

 Смежные вопросы

  • Нет связанных вопросов^_^