如何缩短这段代码或使其更有效率?
How to shorten this code or make it more efficient?
我想知道是否还有 efficient/shorter 方法可以得到相同的结果。
函数 get_action_strength(action) returns 一个布尔值,如果按键被按下,
谢谢
var degValue = 0
if (Input.get_action_strength("move_forward")):
degValue = 0
if (Input.get_action_strength("move_right")):
degValue += -45
if (Input.get_action_strength("move_left")):
degValue += 45
elif (Input.get_action_strength("move_backward")):
degValue = 180
if (Input.get_action_strength("move_right")):
degValue -= -45
if (Input.get_action_strength("move_left")):
degValue -= 45
else:
if (Input.get_action_strength("move_right")):
degValue = -90
if (Input.get_action_strength("move_left")):
degValue = 90
if的第二个分支可以改成这样:
degValue += -45 * int(Input.get_action_strength("move_right")) + 45 * int(Input.get_action_strength("move_left"))
当这个值为False,你把它转成int,就变成了0,相乘的结果是0,所以只加了其中一个值。
此外,如果问题被标记为 'python',为什么要用 'var' 关键字声明变量? =)
您可以使用向量并根据其分量计算角度:
motion_vec_x = 0
motion_vec_y = 0
if (Input.get_action_strength("move_forward")):
motion_vec_y = 1
if (Input.get_action_strength("move_backward")):
motion_vec_y = -1
if (Input.get_action_strength("move_left")):
motion_vec_x = -1
if (Input.get_action_strength("move_right")):
motion_vec_x = 1
degValue = None
if abs(motion_vec_x) > 0 or abs(motion_vec_y) > 0:
degValue = np.arctan2(motion_vec_x, motion_vec_y) / np.pi * 180
print(degValue
这将产生(取决于 arctan2 实现)向上的 0°,向左倾斜的向量的负度数和向右倾斜的向量的正值。笔直向下指向将是 180°。您可以轻松地将其转换为您需要并认为合适的任何角度值。
The function get_action_strength(action) returns a boolean if the key is pressed
不,不是。 get_action_strength
return 浮动。你可以利用它来发挥你的优势。
你可以这样做:
var x = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
var y = Input.get_action_strength("move_forward") - Input.get_action_strength("move_backward")
此外,如果参数为0
,atan2
将return0
。 这是使用 atan2
而不是 atan
的好处之一:您不必担心除以 0
。 因此,您不需要检查 x
和 y
是否不是 0
,只需使用它们即可。
顺便说一下,y
在 atan2
中的 x
之前。
另外,还有一个 rad2deg
函数,如果你有弧度并且想要度数:
var x = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
var y = Input.get_action_strength("move_forward") - Input.get_action_strength("move_backward")
var degValue = rad2deg(atan2(y, x))
如果实在需要,可以将变量内联,这样就单行了。
啊,不好意思,我可能理解错了。你希望它是离散的,对吧?你想要 ceil
:
var x = ceil(Input.get_action_strength("move_right")) - ceil(Input.get_action_strength("move_left"))
var y = ceil(Input.get_action_strength("move_forward")) - ceil(Input.get_action_strength("move_backward"))
var degValue = rad2deg(atan2(y, x))
我想知道是否还有 efficient/shorter 方法可以得到相同的结果。 函数 get_action_strength(action) returns 一个布尔值,如果按键被按下, 谢谢
var degValue = 0
if (Input.get_action_strength("move_forward")):
degValue = 0
if (Input.get_action_strength("move_right")):
degValue += -45
if (Input.get_action_strength("move_left")):
degValue += 45
elif (Input.get_action_strength("move_backward")):
degValue = 180
if (Input.get_action_strength("move_right")):
degValue -= -45
if (Input.get_action_strength("move_left")):
degValue -= 45
else:
if (Input.get_action_strength("move_right")):
degValue = -90
if (Input.get_action_strength("move_left")):
degValue = 90
if的第二个分支可以改成这样:
degValue += -45 * int(Input.get_action_strength("move_right")) + 45 * int(Input.get_action_strength("move_left"))
当这个值为False,你把它转成int,就变成了0,相乘的结果是0,所以只加了其中一个值。
此外,如果问题被标记为 'python',为什么要用 'var' 关键字声明变量? =)
您可以使用向量并根据其分量计算角度:
motion_vec_x = 0
motion_vec_y = 0
if (Input.get_action_strength("move_forward")):
motion_vec_y = 1
if (Input.get_action_strength("move_backward")):
motion_vec_y = -1
if (Input.get_action_strength("move_left")):
motion_vec_x = -1
if (Input.get_action_strength("move_right")):
motion_vec_x = 1
degValue = None
if abs(motion_vec_x) > 0 or abs(motion_vec_y) > 0:
degValue = np.arctan2(motion_vec_x, motion_vec_y) / np.pi * 180
print(degValue
这将产生(取决于 arctan2 实现)向上的 0°,向左倾斜的向量的负度数和向右倾斜的向量的正值。笔直向下指向将是 180°。您可以轻松地将其转换为您需要并认为合适的任何角度值。
The function get_action_strength(action) returns a boolean if the key is pressed
不,不是。 get_action_strength
return 浮动。你可以利用它来发挥你的优势。
你可以这样做:
var x = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
var y = Input.get_action_strength("move_forward") - Input.get_action_strength("move_backward")
此外,如果参数为0
,atan2
将return0
。 这是使用 atan2
而不是 atan
的好处之一:您不必担心除以 0
。 因此,您不需要检查 x
和 y
是否不是 0
,只需使用它们即可。
顺便说一下,y
在 atan2
中的 x
之前。
另外,还有一个 rad2deg
函数,如果你有弧度并且想要度数:
var x = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
var y = Input.get_action_strength("move_forward") - Input.get_action_strength("move_backward")
var degValue = rad2deg(atan2(y, x))
如果实在需要,可以将变量内联,这样就单行了。
啊,不好意思,我可能理解错了。你希望它是离散的,对吧?你想要 ceil
:
var x = ceil(Input.get_action_strength("move_right")) - ceil(Input.get_action_strength("move_left"))
var y = ceil(Input.get_action_strength("move_forward")) - ceil(Input.get_action_strength("move_backward"))
var degValue = rad2deg(atan2(y, x))