Crate orbit_input_core
Protocolo de traits para construir sistemas de input compatibles con Orbit Engine.
Este crate define únicamente las interfaces (traits) necesarias para implementar
un runtime de entrada compatible con el ecosistema de Orbit Engine.
No contiene implementaciones concretas — solo el contrato que deben cumplir.
¿Para quién es este crate?
👥 Para usuarios finales de Orbit Engine
Si solo quieres usar el sistema de input en tu juego, NO necesitas este crate.
Usa directamente la implementación oficial:
[]
= "0.1"
🔧 Para implementadores de backends personalizados
Si quieres crear tu propio runtime de input compatible con Orbit Engine (por ejemplo, para un dispositivo custom, sistema embebido, o un backend experimental), este es el crate que necesitas:
[]
= "0.1"
Filosofía de diseño
orbit_input_core sigue el principio de inversión de dependencias:
- Orbit Engine depende de
orbit_input_core(los traits), no de implementaciones concretas - Cualquier runtime que implemente estos traits es compatible con Orbit Engine
- Los usuarios pueden elegir entre la implementación oficial (
orbit_input) o crear la suya
Esto permite:
- ✅ Máxima flexibilidad para casos de uso especializados
- ✅ Testing más sencillo (mocks que implementan los traits)
- ✅ Soporte para dispositivos no estándar
- ✅ Backends experimentales sin modificar el motor
Contenido del crate
Este crate solo define traits, sin tipos concretos:
Traits de conversión
- [
KeyExt<B, N>]: Convierte entre teclas del backend nativo y teclas normalizadas - [
KeyStateExt<I, O>]: Convierte entre estados del backend y estados normalizados
Traits de gestión de estado
- [
InputStateExt<K, S>]: Interfaz para consultar el estado actual del input (frame actual) - [
WithHistoryExt<K, S, T>]: ExtiendeInputStateExtcon sistema de historial temporal - [
InputEvent]: Representa un evento individual en el historial
Ejemplo: Implementación básica
use ;
use HashMap;
// 1. Define tus propios tipos
// 2. Implementa la conversión desde tu backend nativo
// 3. Crea tu estructura de estado
// 4. Implementa el trait principal
¡Y listo! Tu runtime ya es compatible con cualquier parte de Orbit Engine que
acepte impl InputStateExt<K, S>.
Casos de uso
🎮 Gamepad personalizado
🕹️ Arcade stick
🖱️ Input combinado (teclado + mouse)
🧪 Testing y mocks
Implementación oficial
Para la mayoría de casos de uso, la implementación oficial orbit_input
es suficiente. Incluye:
- ✅ Soporte nativo para Linux (evdev) y Windows (winapi)
- ✅ Tipos
KeyCodeyKeyStatepredefinidos - ✅ Sistema de historial completo (
WithHistoryExt) - ✅ Detección de combos, secuencias y doble tap
- ✅ Runtime asíncrono con Tokio
- ✅ API ergonómica lista para usar
Características
- 🔌 Arquitectura plugin — cualquier backend puede implementar los traits
- 🎯 Type-safe — los tipos genéricos previenen errores en tiempo de compilación
- 📦
no_stdcompatible — puede usarse en sistemas embebidos - 🧩 Sin dependencias — solo traits, cero dependencias externas
- 🔄 Versionado semántico estricto — cambios breaking solo en versiones mayores
Convenciones de tipos genéricos
Los traits usan nombres consistentes para sus parámetros genéricos:
-
KeyExt<B, N>:B= Backend (tipo nativo del sistema, ej:evdev::Key,u16)N= Normalized (tipo normalizado del runtime, ej:KeyCode)
-
KeyStateExt<I, O>:I= Input (estado externo/nativo del sistema)O= Output (estado interno/normalizado del runtime)
-
InputStateExt<K, S>:K= Key (tipo de tecla, debe serCopy + PartialEq + Hash)S= State (tipo de estado, debe serCopy + PartialEq)
-
WithHistoryExt<K, S, T>:K= Key (mismo que arriba)S= State (mismo que arriba)T= Type (tipo de evento, debe implementarInputEvent)
Roadmap
Futuras versiones del protocolo incluirán:
- 🎮 Traits para otros dispositivos (mouse, gamepad, touch)
- 📝 Trait para interpretación de texto y layouts de teclado
- 🔊 Trait para feedback háptico
- 🎯 Trait para gestión de contextos de input (menú, gameplay, diálogo)
Módulos
- [
traits]: Todos los traits disponibles para implementación