Как сократить этот код или сделать его более эффективным?

Я хочу знать, есть ли более эффективный / более короткий способ дать такой же результат. Функция get_action_strength (action) возвращает логическое значение, если клавиша нажата, спасибо.

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

person Mike Adamczak    schedule 16.04.2021    source источник
comment
Итак, желаемые возможные выходные значения: 0 °, 45 °, 90 °, 135 °, 180 °, 225 °, 270 °, 315 °?   -  person user32434999    schedule 16.04.2021
comment
Да, на основе логических значений ввода   -  person Mike Adamczak    schedule 16.04.2021


Ответы (3)


Функция get_action_strength (action) возвращает логическое значение, если клавиша нажата.

Нет, это не так. Возвращает get_action_strength плавать. Вы можете использовать это в своих интересах.

Ты можешь сделать это:

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

Кроме того, atan2 будет вернуть 0, если параметры равны 0. Это одно из преимуществ использования atan2 вместо atan: вам не нужно беспокоиться о делении на 0. Таким образом, вам не нужно проверять, не совпадают ли x и y с 0, просто используйте их.

Кстати, y предшествует x в atan2.

Еще одна вещь: есть 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))
person Theraot    schedule 16.04.2021
comment
Да, я заметил свою ошибку, подумал, что это логическое значение. Это второе решение определенно лучшее, может уместиться в одну строку, большое вам спасибо. - person Mike Adamczak; 16.04.2021

Вторую ветвь if можно изменить на что-то вроде этого:

degValue += -45 * int(Input.get_action_strength("move_right")) + 45 * int(Input.get_action_strength("move_left"))

Когда значение False и вы конвертируете его в int, оно становится 0, а результат умножения равен 0. Таким образом, добавляется только одно из значений.

Кроме того, если вопрос помечен как «python», почему вы объявляете переменную с ключевым словом «var»? знак равно

person Dan    schedule 16.04.2021
comment
Спасибо, это лучше, код теперь 9 строк вместо 17 строк. Код на самом деле является gdscript, но очень похож на python, поэтому я использовал тег python из-за большого сообщества. - person Mike Adamczak; 16.04.2021

Вы можете использовать векторы и вычислять угол по его составляющим:

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 °. Вы легко сможете преобразовать это в любые значения угла, которые вам нужны и которые вы сочтете нужными.

person user32434999    schedule 16.04.2021
comment
Идеально ! Я не знал об arctan2, мне удалось сократить это до 4 строк, думаю, я не могу стать короче. Спасибо вам. - person Mike Adamczak; 16.04.2021