Files

3.8 KiB
Raw Permalink Blame History

id, summary
id summary
aego/input Читает действия, отдельные клавиши, мышь и геймпады, управляет контекстами ввода и даёт игрокам переназначать управление.

Используйте действия (Pressed("Jump"), Axis2("Move")), а не отдельные клавиши: действия назначаются в проекте, игроки могут их переназначить, и они работают с любым устройством. Варианты с P читают одного игрока. В песочнице документации нет устройств, поэтому пример читает нулевые значения и сообщает, что устройство не использовалось; в игре тот же код двигает узел. См. Ввод.

Выберите операцию

Задача С чего начать
Реагировать на действие Pressed для нового нажатия, Down для удержания, Axis/Axis2 для движения
Читать одного игрока Соответствующий вариант с P и индекс игрока
Разделить назначения интерфейса и игры Контексты ввода и поглощение действий
Предложить переназначение Операции переназначения и glyphs вместо жёстко заданных названий клавиш
Проверить устройство ActiveDevice и низкоуровневые операции клавиатуры, мыши или геймпада

Pressed для действия доставляется в первый фиксированный шаг после нажатия, в том числе после кадра отрисовки без фиксированного шага. Следующие шаги не повторяют это событие. Если действие уже обработано другим получателем, проверьте контексты ввода. Низкоуровневый KeyPressed обозначает событие кадра; не переносите на все низкоуровневые операции контракт очереди действий.

Кнопка Run ниже демонстрирует только исполнение скрипта и результат без устройств. Проверяйте реальное движение по руководству по вводу в настольном проекте. Перезапуск скриптовой песочницы не является сбросом физического мира.

Пример

package demo

import (
    "aego/input"
    "aego/log"
)

script Player {
    @export var Speed float = 4

    var jumps int
    var frames int

    func Update(dt float) {
        move := input.Axis2("Move")
        node.SetPosition(node.Position() + move * Speed * dt)
        if input.Pressed("Jump") {
            jumps++
        }
        if input.Down(input.KeyF1) || input.MousePressed(input.MouseLeft) {
            log.Info("cursor at " + string(input.MouseWorld().X) + ", " + string(input.MouseWorld().Y))
        }
        frames++
        if frames % 60 == 0 {
            device := input.ActiveDevice()
            if device < 0 {
                log.Info("no input yet; move " + string(move.X) + ", " + string(move.Y) + ", jumps " + string(jumps))
            } else {
                log.Info("device " + string(device) + ", jump is " + input.Glyph("Jump"))
            }
        }
    }
}