如何缩短这段代码或使其更有效率?

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")

此外,如果参数为0atan2将return0这是使用 atan2 而不是 atan 的好处之一:您不必担心除以 0 因此,您不需要检查 xy 是否不是 0,只需使用它们即可。

顺便说一下,yatan2 中的 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))