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 шт):

Автор решения: DiHASTRO

Я бы вам предложил отрисовывать шар не как 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()

Всем добра-бобра

→ Ссылка