python - 如何解决pygame中这些圆圈的碰撞?

标签 python pygame collision-detection

所以,基本上我希望两个圆以加速度 1 向彼此加速。 我想在圆碰撞时停止。 但是,代码会在冲突之前停止。这是因为它计算出在下一次迭代中,它们会直接通过。所以它停止了。如何改进它,以便它给出所需的结果。 我要求它打印圆的位置和速度,以便您可以在运行时查看数据。 提前致谢。

import pygame
pygame.init()

w=1000
h=500
dis=pygame.display.set_mode((w,h))
pygame.display.set_caption("test2")

t=10
x1=50
x2=w-50
y1=250
y2=y1
v=0
r=True
def circles():
    pygame.draw.circle(dis,(0,200,0),(x1,y1),25)
    pygame.draw.circle(dis,(0,0,200),(x2,y2),25)

run=True
while run:
    pygame.time.delay(100)
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            run=False

    while r:
        pygame.time.delay(t)
        dis.fill((255,255,255))
        circles()
        print(x2,x1,(x2-x1),v,t)

        x1+=v
        x2-=v
        v+=1

        if x2-x1<=50: # THIS LINE STOPS  THE CIRCLES
            r=False

        pygame.display.update()
pygame.quit()

最佳答案

您实际做的是绘制圆圈,然后更新其位置,最后更新显示。
改变顺序。更新圆圈的位置,然后在当前位置绘制它们,最后更新显示。所以圆圈显示在实际位置。

run=True
while run:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            run=False

    pygame.time.delay(t)

    if r:
        x1 += v
        x2 -= v
        v += 1

        if x2-x1 <= 50: 
            r=False

    print(x2,x1,(x2-x1),v,t)

    dis.fill((255,255,255))
    circles()
    pygame.display.update()

而且,1个循环绝对足够了。只需在主应用程序循环中验证 if r: 即可。

如果您不希望圆圈在最终位置相交,那么您必须更正位置:

if x2-x1 <= 50: 
    r = False
    d = x2-x1
    x1 -= (50-d) // 2
    x2 += (50-d) // 2 

关于python - 如何解决pygame中这些圆圈的碰撞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59323459/

相关文章:

python - 更新 PyQt4 中的 n 个 PlotWidgets 以进行实时绘图

Python程序直到键盘中断才会响应

collision-detection - 使用 PCL 进行两个点云之间的碰撞检测

python - pyodbc 连接到 SQL Server 2012 问题

python - 在pygame中将瓷砖覆盖到 Sprite 上

python - 消除高于和低于某个值的地 block 值

python - 如何将 Sprite 从矩形更改为图像?

python - python中的snake使用pygame模块

c++ - AABB碰撞代码的三角形不起作用

java - 如何检测组件的碰撞?