当前位置: 首页 > 知识库问答 >
问题:

向左移动时,如何修正错误的减速?

单于庆
2023-03-14

我刚开始在pygame中学习游戏开发,我希望玩家停止按键时,玩家对象会减速。

这就是我目前的情况:

def update(self):
    self.accel_x = 0
    keys = pg.key.get_pressed()
    if keys[pg.K_LEFT]:
        self.accel_x = -0.2
    if keys[pg.K_RIGHT]:
        self.accel_x = 0.2

    if abs(self.vx) >= max_speed:
        self.vx = self.vx/abs(self.vx) * max_speed

    if self.accel_x == 0:
        self.vx *= 0.91

    self.vx += self.accel_x
    self.vy += self.accel_y
    self.rect.x += self.vx
    self.rect.y += self.vy

它在向右移动时工作正常,但在向左移动时对象不会按时停止。相反,它会减速到一个点,然后继续以非常慢的速度行驶一段时间,然后停止。

共有1个答案

缪英锐
2023-03-14

首先,让我们看看算法背后的数学原理。

当按下按钮时,速度和位置基于加速度a,在t(函数运行的次数),初始值为v0和x0

v=v0a*t

x=x0∑(i=1到t)i*a

x=x0(t2t)*a/2

当松开按钮(accel为0)时,速度v呈几何下降

v=v0*0.91t

10次呼叫后,我们有~0.39 v,100次呼叫后~10-5v。这意味着,从视觉上看,位置x减速并停止,v太小,在一段时间后无法产生差异。

数学与游戏中看到的是一致的。

问题是为什么这个算法在左侧不起作用
虽然它的工作原理应该是一样的,但左右都一样。

不同的是,左边,

  • 按下LEFT后,速度v更可能为负值
  • 位置x可能在某个点变为负值(必须进行检查)

由于提供的代码(可能)不包括要更改的零件,因此一些建议:

  • 如果abs(v)小于(比如)10-5,或者位置在视觉上没有变化的其他小值(小于一个像素),则可以将速度强制为0

如果这不能解决您的问题,您可以编辑您的问题并添加更多相关代码。

 类似资料:
  • 以下是您将看到的一些方法的快速描述: > :返回船的边界(一个矩形) :返回表示船边界中心的Vector2d。 :一个,它表示船的速度(每帧添加到位置) :一个新的,当给定一个角度(以弧度为单位)时,将其标准化 :不是线性插值!如果你想看代码,这里是(在类中): 当玩家没有按键时,飞船应该减速。以下是我为此所做的: 然而,现在我意识到我希望它在向目标移动时漂移。我试过这个: 这当然不会真的达到零速

  • 当我运行应用程序时,会显示以下错误: 下面是我的文件“pamdabatchConfigurer.java”: 我真的不知道这个错误是从哪里来的,有人能帮我一下吗?

  • 问题内容: 我想做的只是为移动设备添加左/右触摸滑动功能。我怎样才能做到这一点? 另外,如何使显示在悬停时的上一个/下一个按钮变小,以用于移动/ ipad版本? 谢谢 问题答案: 更新: 当我刚接触Web设计时,我想到了此解决方案。既然我年纪大一些又聪明了, 马克·希尔拉迪 ( Mark Shiraldi) 给出的答案似乎是一个更好的选择。参见下一个最佳答案;这是一个更有效率的解决方案。 我最近参

  • 主要内容:恢复未提交的更改,删除分段区域的更改,用Git复位移动头指针人非圣贤孰能。所以每个VCS都提供一个功能来修复错误,直到Git控制的某一点上。 Git提供了一个功能,可用于撤消对本地存储库所做的修改。 假设用户意外地对本地存储库进行了一些更改,然后想要撤消这些更改。 在这种情况下,恢复操作起着重要的作用。 恢复未提交的更改 假设我们不小心修改了本地存储库中的一个文件,此时想撤销这些修改。为了处理这种情况,我们可以使用命令。可以使用此命令来还原文件的内容。 为

  • 我在我的游戏中使用了基于网格的碰撞检测,除了一件事外,其他一切都在运行,当玩家在瓷砖上向左移动时,他从瓷砖中跌落。之所以会发生这种情况,是因为当向左然后向右移动时,网格点更新得更快,因为玩家的网格位置基于坐标移动。例如:如果玩家在100,他将不会更新,直到他达到150,单元格范围是100-150(单元格大小是50),但如果你向左移动,你将在99,其中包括在50-100单元格区域。这里有一张图片可以

  • 我已经安装了Java,并且正在尝试在我的Windows10上安装NetBeans 11.3,但是在我运行了EXE之后。安装程序,弹出一条错误消息: 线程主java.lang.NoClassDeffounderRror java/util/jar/pack200中发生意外异常