Python.Столкновение двух объектов в pygame
Как мне в моем коде реализовать столкновение?
import pygame
window=pygame.display.set_mode((700, 700))
pygame.display.set_caption('PYWINDOW')
screen=pygame.Surface((700, 700))
run=True
class Ball():
def __init__(self, speed, width, height, oX, oY, img):
self.speed=speed
self.width=width
self.height=height
self.reverseX=False
self.reverseY=False
self.height=height
self.x=oX
self.y=oY
self.img=img
def drawAndMove(self, holst):
# oX
if self.reverseX:
if self.x>0:
self.x-=0.9*self.speed
else:
self.reverseX=False
elif self.x<700-self.width:
self.x+=1.3*self.speed
else:
self.reverseX=True
# oY
if self.reverseY:
if self.y>0:
self.y-=0.8*self.speed
else:
self.reverseY=False
elif self.y<700-self.height:
self.y+=1.1*self.speed
else:
self.reverseY=True
holst.blit(self.img, (self.x, self.y))
def isQuit():
global run
for e in pygame.event.get():
if e.type == pygame.QUIT:
run=False
bimg=pygame.image.load('/home/korobeinikovi/ball.png')
ball1=Ball(1, 48, 46, 100, 100, bimg)
ball2=Ball(1, 48, 46, 100, 150, bimg)
while run:
screen.fill((0, 100, 0))
ball1.drawAndMove(screen)
ball2.drawAndMove(screen)
window.blit(screen, (0, 0))
isQuit()
pygame.display.flip()
pygame.quit()
Ответы (1 шт):
Я бы вам предложил отрисовывать шар не как width и height, а также oX и oY, а как Радиус и центр шара. А именно а также R , oX и oY. Это даст вам проще проводить сравнение для столкновений, а именно:
Столкновение двух шаров есть их соприкосновение, при котором расстояние между ними равно 0. То есть, когда они сталкиваются, расстояние между их центрами равняется сумме их радиусов R. Расстояние между двумя точками на плоскости вычисляется по формуле (перевожу на путхон):
import math
distance = math.sqrt( (ball1.oX - ball2.oX) ** 2 + (ball1.oY - ball2.oY) ** 2 )
Далее мы сравниваем, если distance == ball1.R + ball2.R, значит они столкнулись. Но может быть такое, что наши шарики из-за чего-то пройдут чуть-чуть сквозь друг друга, а значит, наша формула не сработает, поэтому предлагаю поставить distance <= ball1.R + ball2.R.
В итоге заносим в общий цикл для проверки:
while Run:
...
distance = math.sqrt( (ball1.oX - ball2.oX) ** 2 + (ball1.oY - ball2.oY) ** 2 )
if distance <= ball1.R + ball2.R:
function_of_collision_you_need()
Всем добра-бобра