如何将值更改为零但不是在循环的第一次迭代中
How to change value to zero but not in the first iteration of a loop
我正在尝试在 PyBox2D 中实现前轮的转动,目前,我能够让它转动 left/right 但是当角度达到零时我无法停止它(使汽车直走)
我的目标是当轮子的角度达到零或类似于零的值时停止转动,但不是在开始时(有时当角度为零时它们根本不移动,如果可能的话我想使其独立于键盘上的按键(将这两个嵌套的 if 语句移出 if keyboard_is_pressed(hotkey) 部分没有帮助
我希望我说清楚了,非常感谢你的帮助
EDIT 我尝试实施答案中给出的解决方案,它有点奏效,但我试图改进它,现在我又被卡住了,轮子转动了,但是当它们return 他们停止移动到他们的初始位置。其中一个问题是,当我按下 "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
如果我理解正确的话,你可以有一个变量,比如 on_starting_race,设置为 false,然后检查它是否高于设定的数字(比如,当它高于 10 时你知道一个事实比赛已经开始并且汽车至少移动了几秒钟),然后将该值更改为 True,现在添加一个 if 语句以确定该值是否接近 0(比如 val<5)并且 on_starting_race 是真的。
可能有更优雅的方法,但这非常简单(假设您每帧或设定的时间段检查汽车的状态)。
抱歉,如果没有完整的代码,我不能 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() 函数)。
我正在尝试在 PyBox2D 中实现前轮的转动,目前,我能够让它转动 left/right 但是当角度达到零时我无法停止它(使汽车直走)
我的目标是当轮子的角度达到零或类似于零的值时停止转动,但不是在开始时(有时当角度为零时它们根本不移动,如果可能的话我想使其独立于键盘上的按键(将这两个嵌套的 if 语句移出 if keyboard_is_pressed(hotkey) 部分没有帮助
我希望我说清楚了,非常感谢你的帮助
EDIT 我尝试实施答案中给出的解决方案,它有点奏效,但我试图改进它,现在我又被卡住了,轮子转动了,但是当它们return 他们停止移动到他们的初始位置。其中一个问题是,当我按下 "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
如果我理解正确的话,你可以有一个变量,比如 on_starting_race,设置为 false,然后检查它是否高于设定的数字(比如,当它高于 10 时你知道一个事实比赛已经开始并且汽车至少移动了几秒钟),然后将该值更改为 True,现在添加一个 if 语句以确定该值是否接近 0(比如 val<5)并且 on_starting_race 是真的。 可能有更优雅的方法,但这非常简单(假设您每帧或设定的时间段检查汽车的状态)。
抱歉,如果没有完整的代码,我不能 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() 函数)。