59 lines
3.8 KiB
Markdown
59 lines
3.8 KiB
Markdown
---
|
|
id: aego/input
|
|
summary: Читает действия, отдельные клавиши, мышь и геймпады, управляет контекстами ввода и даёт игрокам переназначать управление.
|
|
---
|
|
|
|
Используйте действия (`Pressed("Jump")`, `Axis2("Move")`), а не отдельные клавиши: действия назначаются в проекте, игроки могут их переназначить, и они работают с любым устройством. Варианты с `P` читают одного игрока. В песочнице документации нет устройств, поэтому пример читает нулевые значения и сообщает, что устройство не использовалось; в игре тот же код двигает узел. См. [Ввод](ref:input).
|
|
|
|
## Выберите операцию
|
|
|
|
| Задача | С чего начать |
|
|
|---|---|
|
|
| Реагировать на действие | Pressed для нового нажатия, Down для удержания, Axis/Axis2 для движения |
|
|
| Читать одного игрока | Соответствующий вариант с `P` и индекс игрока |
|
|
| Разделить назначения интерфейса и игры | Контексты ввода и поглощение действий |
|
|
| Предложить переназначение | Операции переназначения и glyphs вместо жёстко заданных названий клавиш |
|
|
| Проверить устройство | ActiveDevice и низкоуровневые операции клавиатуры, мыши или геймпада |
|
|
|
|
Pressed для действия доставляется в первый фиксированный шаг после нажатия, в том числе после кадра отрисовки без фиксированного шага. Следующие шаги не повторяют это событие. Если действие уже обработано другим получателем, проверьте контексты ввода. Низкоуровневый KeyPressed обозначает событие кадра; не переносите на все низкоуровневые операции контракт очереди действий.
|
|
|
|
Кнопка Run ниже демонстрирует только исполнение скрипта и результат без устройств. Проверяйте реальное движение по [руководству по вводу](ref:input) в настольном проекте. Перезапуск скриптовой песочницы не является сбросом физического мира.
|
|
|
|
## Пример
|
|
|
|
```aes 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"))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|