Tôi đang tạo trò chơi trong đó các quả bóng bị trả lại xung quanh bên trong vòng tròn của vòng tròn lớn hơn nhiều. Vòng tròn lớn hơn không di chuyển.Python & Pygame: Va chạm với nội thất của vòng tròn
Dưới đây là đoạn code mà tôi hiện đang sử dụng cho các va chạm:
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)
Nó được dựa trên những hướng dẫn tuyệt vời của Peter Collingridge over here.
Đối tượng hình tròn và bóng là cả hai lớp, với (x, y), bán kính, góc và tốc độ.
Tôi gặp hai vấn đề với phương pháp này, tuy nhiên:
- bóng bị trả từ (những gì tôi nghi ngờ) là "điểm neo" của nó, mà có vẻ là ở góc trên cùng bên phải của vòng tròn.
- Khi va chạm với đáy 5% của vòng tròn, không trả lại đủ cao và do đó "chìm" ra khỏi màn hình. Tôi đoán rằng điều này là bởi vì các thư bị trả lại là không đủ cao để di chuyển quả bóng trên của nó (không chính xác đặt) "điểm neo"?
Đã xem xét các giải pháp khả thi đã có ở đây, đáng chú ý là "Phát hiện va chạm vòng tròn nhanh", mặc dù trong Java đang sử dụng cùng một phương pháp, tất cả đều đối phó với các va chạm bên ngoài, trong khi tôi đang nhìn vào một quả bóng xung quanh bên trong một vòng tròn.
Đây cũng là định nghĩa lớp của Ball() và 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
Cảm ơn trước, Nathan
Trục X sẽ không được xác định bởi cosin của góc và trục Y bằng sin? Hay tôi đã học sai? : X – JCM
Tôi nghĩ rằng bạn đúng rằng đó là cách tiêu chuẩn để xác định mọi thứ, nhưng miễn là bạn nhất quán nó không thực sự tạo ra bất kỳ sự khác biệt nào. Rõ ràng nếu bạn xoay mọi thứ bằng 90 độ, điều đó sẽ không ảnh hưởng đến cách mọi thứ bị trả lại (giả sử trọng lực cũng thay đổi). –
@PeterCollingridge, bài viết của bạn là * tuyệt vời *!Giải pháp thanh lịch, phong cách pythonic, congrats .. và cảm ơn! – MestreLion