【问题标题】:Pygame how to let balls collidePygame如何让球发生碰撞
【发布时间】:2020-07-29 02:33:18
【问题描述】:

我想在 pygame 中编写一个脚本,其中两个球相互飞向,当它们碰撞时它们应该相互弹开,但我不知道该怎么做,你能帮我吗?

【问题讨论】:

标签: python pygame collision-detection collision


【解决方案1】:

要检测两个圆(分别是球)是否发生碰撞,您必须测试圆中心点之间的Euclidean distance 是否小于半径之和。我建议使用pygame.math.Vector2 / distance_to() 进行计算。
在下文中,1 圆由中心点 (x1, y1) 和半径 r1 定义。第二个圆由 (x2, y2)r2 定义:

v1 = pygame.math.Vector2(x1, y1)
v2 = pygame.math.Vector2(x2, y2)
if v1.distance_to(v2) < r1 + r2:
    print("hit")

如果要让圆反弹,就必须像台球一样,在交点的法向量上反映圆的运动向量。使用 pygame.math.Vector2 / reflect_ip()reflect() 计算圆的新方向。
圆的运动由 (mx1, my1)(mx2, my2) 给出:

nv = v2 - v1
m1 = pygame.math.Vector2(mx1, my1).reflect(nv)
m2 = pygame.math.Vector2(mx2, my2).reflect(nv)
mx1, my1 = m1.x, m1.y
mx2, my2 = m2.x, m2.y

最小示例: repl.it/@Rabbid76/PyGame-CirclesBounceOff

import pygame

pygame.init()

width, height = 400, 400
window = pygame.display.set_mode((width, height))
clock = pygame.time.Clock()

x1, y1, r1, mx1, my1 = 200, 200, 50, 2, 0.5
x2, y2, r2, mx2, my2 = 300, 200, 50, -1, -1.5

def move(c, v, r, m):
    c += v
    if c < r: c, v = r, -v
    if c > m-r: c, v = m-r, -v   
    return c, v

hit_count = 0
run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    x1, mx1 = move(x1, mx1, r1, width)
    y1, my1 = move(y1, my1, r1, height)
    x2, mx2 = move(x2, mx2, r2, width)
    y2, my2 = move(y2, my2, r2, height)

    v1 = pygame.math.Vector2(x1, y1)
    v2 = pygame.math.Vector2(x2, y2)
    if v1.distance_to(v2) < r1 + r2 - 2:
        hit_count += 1
        print("hit:", hit_count)

        nv = v2 - v1
        m1 = pygame.math.Vector2(mx1, my1).reflect(nv)
        m2 = pygame.math.Vector2(mx2, my2).reflect(nv)
        mx1, my1 = m1.x, m1.y
        mx2, my2 = m2.x, m2.y

    window.fill((127, 127, 127))
    pygame.draw.circle(window, (255, 0, 0), (round(x1), round(y1)), r1, 4)
    pygame.draw.circle(window, (0, 0, 255), (round(x2), round(y2)), r2, 4)
    pygame.display.flip()

【讨论】:

  • 谢谢@Rabid76,真的很有帮助!
【解决方案2】:

您只需检查 x 坐标是否与另一个 x 坐标在同一个位置,这很容易。例如,如果您有一个称为 x 的 x 坐标,另一个称为 i(两个球都有 2 个 x 坐标),那么您可以说如果哦,在我说任何东西之前,这个示例适合您的 pygame 窗口是 500,500。你可以说如果 x == 250: x -= 15。反之,对于 i。如果 i == 250:i += 15。那你去吧!显然你需要做一些改变,但这是基本代码,我想你会理解的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多