Entrada & Eventos
Lide com eventos de teclado, mouse, gamepad e do jogo no Bevy - controles responsivos sem sistemas emaranhados.
Receita
fn jump(
keys: Res<ButtonInput<KeyCode>>,
mut q: Query<&mut PlayerState>,
) {
if keys.just_pressed(KeyCode::Space) {
for mut state in &mut q {
state.request_jump = true;
}
}
}Quando usar isso:
- Qualquer jogo controlado pelo jogador
- Sistemas de replay gravando bordas de entrada
- Botões de UI disparando gameplay via eventos
- Cooperativo local multijogador no sofá com vários gamepads
Exemplo de Trabalho
use bevy::prelude::*;
#[derive(Event)]
struct PlayerShot {
entity: Entity,
}
#[derive(Component)]
struct Cooldown(Timer);
fn shooting(
mouse: Res<ButtonInput<MouseButton>>,
mut commands: Commands,
mut reader_q: Query<(Entity, &mut Cooldown)>,
mut events: EventWriter<PlayerShot>,
time: Res<Time>,
) {
if !mouse.just_pressed(MouseButton::Left) {
return;
}
for (entity, mut cd) in &mut reader_q {
cd.0.tick(time.delta());
if cd.0.finished() {
events.write(PlayerShot { entity });
cd.0.reset();
}
}
}
fn on_shot(mut events: EventReader<PlayerShot>) {
for e in events.read() {
println!("shot from {:?}", e.entity);
}
}O que isso demonstra:
- Borda
just_pressedpara disparo único por clique - Temporizador de cooldown para evitar spam de eventos
- Consumidor
EventReaderseparado do escritor do sistema
Mergulho Profundo
Como Funciona
- Recursos de entrada atualizados uma vez por frame antes dos sistemas
Update. - Mapas de ação (o
leafwing-input-managerda comunidade ou um personalizado) vinculam teclas a intenções. - Eventos são filas drenadas por leitores; a ordem depende da ordenação do sistema.
- Nós de UI podem bloquear eventos de ponteiro quando interativos.
Tipos de Entrada
| Recurso | Uso |
|---|---|
ButtonInput<KeyCode> | Teclado |
ButtonInput<MouseButton> | Botões do mouse |
Axis<GamepadAxis> | Joysticks (via entidades de gamepad) |
Armadilhas
- Usar
pressedpara ações que precisam ser únicas - a repetição automática parece errada. Correção:just_pressedpara ações discretas. - Sem tempo delta para mira do mouse - a sensibilidade varia com o FPS. Correção: escalar por
time.delta_secs(). - Sistemas lendo eventos antes que os escritores sejam executados - lag de um frame. Correção: ordenar
.after(shooting)no leitor. - Milhares de eventos por frame - sobrecarga. Correção: mutação direta de componente para simulações em massa; eventos para sinais esparsos.
- Gamepad não atribuído - jogador 2 inativo. Correção: detectar conexões
Gamepadna inserção e mapear por dispositivo.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Apenas polling | Jam simples | Muitas ações reconfiguráveis |
| Canal de thread do SO | Controladores personalizados | Entrada Bevy suficiente |
| Sincronização de entrada em rede | Multiplayer online | Single-player local |
| Botões apenas de UI | Jogo com muitos menus | Gameplay de reação rápida |
FAQs
Teclas reconfiguráveis?
Armazene HashMap<Action, KeyCode> em um recurso; mapeie no sistema de entrada a cada frame.
Delta do mouse?
Recurso AccumulatedMouseMotion (Bevy 0.14+) para mira de câmera FPS.
Toque/mobile?
O suporte móvel do Bevy está evoluindo - mapeie toques para componentes de joystick virtuais.
Cliques de UI passando?
Componente Interaction em nós de UI; pule a entrada do mundo quando Hovered em um menu.
Replay?
Grave as bordas just_pressed com números de frame; a reprodução grava um recurso de entrada sintético.
Menu de pausa?
Enum State desabilita sistemas de gameplay com run_if(in_state(Playing)).
Múltiplos listeners?
Vários instâncias de EventReader recebem todos os eventos, a menos que usem grupos de ordenação de leitores.
Crate Leafwing?
Máquina de estados de ação de nível superior sobre botões brutos - bom para controles complexos.
Tempo?
Entrada lida em Update; resposta de física frequentemente em FixedUpdate - veja Loops de Jogo e Tempo.
Básicos do Bevy?
Exemplo de movimento de teclado em Básicos de Desenvolvimento de Jogos.
Relacionados
- Bevy Engine - ordenação de sistemas
- Loops de Jogo e Tempo - atualização fixa
- Básicos de Desenvolvimento de Jogos - exemplo de entrada
- Física e Áudio - SFX orientado a eventos
Versões da Pilha: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.