【问题标题】:How to change value to zero but not in the first iteration of a loop如何将值更改为零但不在循环的第一次迭代中
【发布时间】:2019-12-08 03:31:10
【问题描述】:

我正在尝试在 PyBox2D 中实现前轮的转动,目前,我能够使其向左/向右转动,但当角度达到零时我无法停止它(使汽车直行)

我的目标是在车轮的角度达到零或接近于零的值时停止转动,但不是在开始时(有时当角度为零时,它们根本不会移动,如果可能的话,我想让它独立于键盘上的按键(将这两个嵌套的 if 语句移出 if keyboard_is_pressed(hotkey) 部分没有帮助

我希望我说清楚了,非常感谢你的帮助

编辑我尝试实施答案中给出的解决方案,它有点工作,但我试图改进它,现在我又被卡住了,轮子转动,但是当它们返回到初始位置时他们停止移动。问题之一可能是当我按下“a”或“d”键时,我的变量 self.ticking 变化不止一个,因为我无法在这么短的时间内按下该键。

变量 self.on_the_beginning 等同于下面答案中的 on_starting_race:

    def control(self): # This makes control independent from visualisation
        #Front left suspension: index 2
        #Front right suspension: index 3
        print(self.ticking)
        if keyboard.is_pressed("a"):
            self.suspensions[2].motorSpeed = -5
            self.suspensions[3].motorSpeed = -5
            self.ticking -= 1 


        if keyboard.is_pressed("d"):                
            self.suspensions[2].motorSpeed = 5
            self.suspensions[3].motorSpeed = 5
            self.ticking += 1


        if self.ticking <= -3:
            self.ticking = -3
            self.on_the_beginning = True

        elif self.ticking >= 3:
            self.ticking = 3
            self.on_the_beginning = True

        if np.radians(-5) <= self.tires[2].wheel.angle  <= np.radians(5) and self.on_the_beginning == True and self.ticking !=0:
            self.suspensions[2].motorSpeed = 0
            self.suspensions[3].motorSpeed = 0
            self.tires[2].SetAngularVelocity = 0
            self.tires[3].SetAngularVelocity = 0
            self.ticking = 0
            on_the_beginning = False

【问题讨论】:

  • 能否包含所有相关代码?如果我们甚至无法运行您的程序,就很难找到答案。请参阅:minimal reproducible example

标签: python if-statement box2d


【解决方案1】:

如果我理解正确,您可以设置一个变量,比如 on_starting_race,设置为 false,然后检查它是否高于设定的数字(例如,当它高于 10 时,您知道比赛已经开始并且汽车至少移动了几秒钟),然后将该值更改为 True,现在添加一个 if 语句以确定该值是否接近 0(例如 val

【讨论】:

  • 非常感谢,我知道一个月后可能听起来很奇怪,我尝试实施您的解决方案,效果令人满意,但后来我尝试修改它以更好地工作,但我发现了一个问题,如果您愿意帮助我,请参阅编辑以获取详细信息。
【解决方案2】:

抱歉,如果没有完整代码,我不能 100% 确定您的问题。

我认为解决方案可能是在您的函数中使用输入参数,比如说 first_run,您可以从函数内部和外部进行控制。

def control(self, first_run=True):

这样,您可以开始比赛(从您的主程序)将 first_run 设置为 True,因此您不必关心角度。并在其余时间使用相同的函数将 first_run 设置为 False。

您也可以使用 self.first_run 变量,您可以在 init 中将其设置为 True,然后将 self.first_run 设置为 False,如果它为 True(这实际上是您第一次使用control() 函数)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    相关资源
    最近更新 更多