为了账号安全,请及时绑定邮箱和手机立即绑定

Pygame如何让球碰撞

Pygame如何让球碰撞

一只斗牛犬 2023-04-11 16:02:58
我想在 pygame 中制作一个脚本,其中两个球相互飞向,当它们碰撞时它们应该相互弹开,但我不知道该怎么做,你能帮帮我吗?
查看完整描述

1 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

要检测 2 个圆(分别是球)是否发生碰撞,您必须测试圆中心点之间的欧几里得距离是否小于半径之和。我建议使用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

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()


查看完整回答
反对 回复 2023-04-11
  • 1 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信