Files
games/crates/apps/game-snake-poc-tauri/README.md
2026-09-21 08:11:36 +02:00

4.2 KiB
Raw Blame History

game-snake-poc-tauri

Host Tauri Android de référence du POC Snake. Cette application réutilise le gameplay Rust de game-snake-poc et l'unique adapter WebAssembly game-snake-poc-wasm ; elle ne possède aucune règle de jeu.

Responsabilités

La crate possède uniquement la frontière Tauri : initialisation du logging Rust, assemblage/plugins/commandes Tauri, contrat minimal de provenance native et frontend Vite/TypeScript exécuté dans la WebView Android.

L'organisation Rust suit le modèle des applications Desk KSP :

  • src/lib.rs reste une façade et réexporte les éléments partagés au crate-root ;
  • src/tauri.rs assemble Tauri et fait déléguer les commandes aux modules propriétaires ;
  • src/runtime.rs possède le petit contrat runtime/provenance ;
  • frontend/ contient le host WebView et consomme les bindings générés de game-snake-poc-wasm.

À partir de 0.3.1-0-pre.3, le frontend fournit aussi le Canvas, la boucle fixed-step, les contrôles clavier/touch et le chargement des assets canoniques. 0-pre.4 ajoute la suspension/reprise explicite, le suivi de visibilité et le resize/orientation.

Statut du POC

Ce host est conservé comme POC de référence et non comme template de production Android. La voie de jeu Android privilégiée reste SDL3 natif/Java/JNI, qui couvre déjà les besoins principaux avec une chaîne de build plus directe.

Tauri Android reste utile pour comparer une WebView/WASM à la voie native et pour tester ultérieurement des besoins spécifiques, par exemple la saisie texte. Une future distribution Tauri Desktop est une décision séparée, conditionnée à un bénéfice produit concret tel quune monétisation WebView exploitable.

Build

Les hooks beforeDevCommand et beforeBuildCommand de Tauri possèdent le build WASM et Vite. Aucun orchestrateur Python n'est utilisé. Les bindings WASM, la distribution Vite, les caches, node_modules/ et le projet Android généré restent hors des sources livrées ou dans des chemins générés ignorés.

Le host ne modifie pas le projet Android généré par Tauri. Pour 0.3.1, la chaîne Tauri 2.11.x est conservée telle que générée : Gradle 8.14.3 et Android Gradle Plugin 8.11.0. Le JDK Android de référence du projet est JDK 17, qui correspond au minimum et à la valeur par défaut documentés par AGP 8.11. Le Java 25 global et le JBR 25 de l'Android Studio actuellement installé ne doivent pas exécuter ce wrapper.

Voir USAGE.md pour l'initialisation locale et les smokes Android.

Lifecycle et Back Android

Le host suspend explicitement sa boucle requestAnimationFrame lorsque la WebView devient cachée et la reprend en réinitialisant son horloge locale. Une reprise après background ne doit donc pas simuler le temps passé hors écran. Resize et rotation passent par un ResizeObserver sur la zone de jeu et réévaluent aussi la provenance device.

Le POC reste mono-page et nenregistre volontairement aucun handler Tauri onBackButtonPress. La politique EngineGame::quit_requested de Snake est actuellement la politique moteur par défaut Exit, cohérente avec le Back Android/Tauri naturel. Un futur jeu retournant Continue devra introduire une intégration Back explicite au lieu de modifier ce POC silencieusement.

Le premier smoke ARM64 réel a mis en évidence un abort natif pendant un teardown déclenché par Back : FORTIFY: pthread_mutex_lock called on a destroyed mutex. Après correction du tunnel HMR afin que HTTP et WebSocket partagent tous deux 1436, le smoke 0-pre.4.fix.1 ne l'a pas reproduit. La beta a ensuite validé la construction d'un APK autonome universal et son installation/lancement sur ARM64 réel et AVD x86_64. La RC conserve le teardown/Back dans ses smokes finaux sans ajouter de handler ad hoc ni patcher le scaffold généré.

Limite ergonomique connue

Le D-pad tactile reste sous le Canvas dans ce POC et peut nécessiter un scroll sur petit écran. Des contrôles superposés ou des gestes swipe seraient techniquement possibles, mais ne sont pas introduits dans 0.3.1 : ils ne changent pas la conclusion darchitecture et appartiendraient à une UX produit réelle.