Я делаю игру, в которой шары отскакивают вокруг внутри гораздо большего круга. Большой круг не перемещается.Python & Pygame: столкновение шара с внутренностью круга
Вот код, который я сейчас использую для этих столкновений:
def collideCircle(circle, ball):
"""Check for collision between a ball and a circle"""
dx = circle.x - ball.x
dy = circle.y - ball.y
distance = math.hypot(dx, dy)
if distance >= circle.size + ball.size:
# We don't need to change anything about the circle, just the ball
tangent = math.atan2(dy, dx)
ball.angle = 2 * tangent - ball.angle
ball.speed *= elasticity + 0.251
angle = 0.5 * math.pi + tangent
ball.x -= math.sin(angle)
ball.y += math.cos(angle)
Он основан на прекрасном учебнике Питера Collingridge over here.
Объекты окружности и шара - оба класса, с (x, y), радиусом, углом и скоростью.
У меня возникают две проблемы, связанные с этим методом, однако:
- мяч отскакивает от (я подозреваю) является его «узловая точка», которая, как представляется, в верхнем правом углу круга.
- При столкновении с нижним 5% круга не удается отскочить достаточно высоко и, следовательно, «опускается» из экрана. Я предполагаю, что это происходит потому, что сильный удар не достаточно высок, чтобы переместить мяч выше его (неправильно расположен) «узловой точки»?
Просмотрев возможные решения, уже присутствующие здесь, в частности «Быстрое обнаружение столкновений по кругу» [Ссылка удалена из-за ограничения на спам-ссылки], которые, хотя в Java используют один и тот же метод, все они имеют дело с внешними столкновениями, в то время как я смотрю на подпрыгивание шара вокруг внутреннего круга.
Здесь также определение классов Бала() и Circle():
class Ball():
def __init__(self, (x,y), size):
"""Setting up the new instance"""
self.x = x
self.y = y
self.size = size
self.colour = (0,128,255)
self.thickness = 0
self.speed = 0.01
self.angle = math.pi/2
def display(self):
"""Draw the ball"""
pygame.draw.circle(screen, self.colour, (int(self.x), int(self.y)), self.size, self.thickness)
def move(self):
"""Move the ball according to angle and speed"""
self.x += math.sin(self.angle) * self.speed
self.y -= math.cos(self.angle) * self.speed
(self.angle, self.speed) = addVectors((self.angle, self.speed), gravity)
self.speed *= drag
class Circle():
def __init__(self, (x,y), size):
"""Set up the new instance of the Circle class"""
self.x = x
self.y = y
self.size = size
self.colour = (236, 236, 236)
self.thickness = 0
self.angle = 0 # Needed for collision...
self.speed = 0 # detection against balls
def display(self):
"""Draw the circle"""
pygame.draw.circle(screen, self.colour, (int(self.x), int(self.y)), self.size, self.thickness
Спасибо заранее, Натан
Ось X не будет определяться косинусом угла и осью Y синусом? Или я ошиблась? : X – JCM
Я думаю, вы правы, что это стандартный способ определения вещей, но пока вы согласны, на самом деле это не имеет никакого значения. Ясно, что если вы вращаете все на 90 градусов, это не должно влиять на то, как вещи отскакивают (при условии, что гравитация также изменяется). –
@PeterCollingridge, ваши статьи * удивительные *!Элегантные решения, пифонический стиль, поздравления .. и спасибо! – MestreLion