刘锦城ljc 2023-07-17 20:23 采纳率: 91.3%
浏览 60
已结题

关于pygame的问题

下面这个是我的部分代码,我创建的是一个1000*800的窗口,我的想法是:让四个矩形在这个窗口中碰撞,但是我的碰撞程序好像写挂了,请问能帮我调一下吗?谢谢!

## 其中`sfx[i]`  ,  `sfy[i]`表示第i个矩形左上角的`x`和`y`坐标 ;`sfx[i]+len(name[i])*30`和`sfy[j]+40`表示的是第i个矩形右下角的`xy`坐标
## `ffx[i]`和`ffy[i]`表示第`i`个矩形的偏移值,相当于每次`sfx[i]+=ffx[i];sfy[i]+=ffy[i];`
## sc是窗口名字,tupdate()是用来更新四个矩形的位置和屏幕的。
while 1:
    sc.fill((212,212,212))
    tupdate()
    for i in range(len(name)):
        for j in range(i+1,len(name)):
            if(i==j):
                continue
            if(sfx[i]-1<=sfx[j] and sfx[i]+1>=sfx[j]):
                if(sfy[i]<=sfy[j]<=sfy[i]+40 or sfy[i]<=sfy[j]+40<=sfy[i]+40):
                    ffy[i]=-ffy[i]
                    ffy[j]=-ffy[j]
            if(sfy[i]-1<=sfy[j] and sfy[i]+1>=sfy[j]):
                if(sfx[i]<=sfx[j]<= sfx[i]+len(name[i])*30 or sfx[i]<=sfx[j]+len(name[j])*30<=sfx[i]+len(name[i])*30):
                    ffx[i]=-ffx[i]
                    ffx[j]=-ffx[j]
            if(sfx[i]+len(name[i])*30-1<=sfx[j]+len(name[j])*30 and sfx[i]+len(name[i])*30+1>=sfx[j]+len(name[j])*30):
                if(sfy[i]<=sfy[j]<=sfy[i]+40 or sfy[i]<=sfy[j]+40<=sfy[i]+40):
                    ffy[i]=-ffy[i]
                    ffy[j]=-ffy[j]

            if(sfy[i]+40-1<=sfy[j]+40 and sfy[i]+40+1>=sfy[j]+40):
                if(sfx[i]<=sfx[j]<= sfx[i]+len(name[i])*30 or sfx[i]<=sfx[j]+len(name[j])*30<=sfx[i]+len(name[i])*30):
                    ffx[i]=-ffx[i]
                    ffx[j]=-ffx[j]
        if(sfx[i]<=0 or sfx[i]+len(name[i])*30>1000):
            ffx[i]=-ffx[i]
        if(sfy[i]<=0 or sfy[i]+40>800):
            ffy[i]=-ffy[i]
   

请问这份代码要怎么改?

  • 写回答

3条回答 默认 最新

  • 梦幻编织者 2023-07-17 23:40
    关注

    根据您提供的代码,我发现以下几个问题:

    检查矩形碰撞的条件错误。在当前代码中,判断矩形是否重叠的逻辑有误。例如,if(sfx[i]-1<=sfx[j] and sfx[i]+1>=sfx[j])这个条件会导致只有左侧边缘完全重合时才会触发碰撞,但实际上需要考虑到整个矩形的范围。
    反弹方向计算错误。当两个矩形发生碰撞时,您尝试通过改变 ffx[i] 和 ffx[j] 的正负号来反弹它们的运动方向,但实际上应该交换它们的速度值,而不仅仅是改变符号。
    边界检测不完整。虽然您已经检查了矩形是否超出窗口的左右边界,但没有考虑上下边界。
    以下是针对上述问题的修复建议:

    while True:
        sc.fill((212, 212, 212))
        tupdate()
    
        for i in range(len(name)):
            for j in range(i + 1, len(name)):
                if i == j:
                    continue
    
                if sfx[i] < sfx[j] + len(name[j]) * 30 and sfx[i] + len(name[i]) * 30 > sfx[j]:
                    if sfy[i] < sfy[j] + 40 and sfy[i] + 40 > sfy[j]:
                        ffx[i], ffx[j] = ffx[j], ffx[i]  # 交换水平速度
                        ffy[i], ffy[j] = ffy[j], ffy[i]  # 交换垂直速度
    
            # 更新位置和边界检测
            sfx[i] += ffx[i]
            sfy[i] += ffy[i]
    
            if sfx[i] <= 0 or sfx[i] + len(name[i]) * 30 >= 1000:
                ffx[i] = -ffx[i]
    
            if sfy[i] <= 0 or sfy[i] + 40 >= 800:
                ffy[i] = -ffy[i]
    

    这里我们使用了更准确的矩形重叠判断条件,并通过交换速度值来实现矩形碰撞后的反弹效果。同时,我还添加了对上下边界越界的检测。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 8月24日
  • 已采纳回答 8月16日
  • 创建了问题 7月17日

悬赏问题

  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助