Je suis en train d'écrire une application flash en Flex/AS3, et je n'arrive pas à lui attribuer le focus clavier. J'ai été conscient de ce problème dès le début du développement et j'ai ajouté un écran d'accueil avec un bouton "jouer maintenant", pour inciter l'utilisateur à cliquer. Cependant, l'utilisateur doit ensuite cliquer une deuxième fois sur l'application pour que le clavier fonctionne !
Pour aggraver les choses, j'ai un raccourci in-game qui vous ramène au menu principal. Si vous revenez au menu principal puis cliquez sur le bouton "jouer maintenant", le SWF perd à nouveau le focus !
Je dois sûrement m'embrouiller avec les objets enfants ou détruire accidentellement un objet qui a capturé le focus clavier, mais je ne suis pas tout à fait sûr de comment cela fonctionne. Pouvez-vous m'aider à m'orienter dans la bonne direction ?
Mon application est un seul fichier .SWF, et je l'exécute directement dans mon navigateur (sans l'appeler via une page web, même si je le ferai éventuellement). Voici le fichier en question :
http://www.space-squid.com/game/Main.swf Lorsque vous cliquez sur "Normal", vous devez cliquer une deuxième fois pour réellement obtenir le focus clavier. :( N'hésitez pas à poser des questions !
Édition : Voici un peu de code que j'utilise.
Une partie du premier code qui s'exécute dans ma classe principale :
empty_sprite = new Sprite();
addChild(empty_sprite);
empty_sprite.stage.addEventListener(hooks clavier...);
J'ai aussi essayé ceci au cas où j'aurais dû définir les hooks sur mon objet racine :
this.stage.addEventListener(hooks clavier...);
En cas de problème avec le sprite vide :
background_image = new BackgroundImage();
background_image.x = etc etc données d'alignement;
addChild(background_image);
background_image.stage.addEventListener(hooks clavier...)
Dans tous ces exemples, mes hooks clavier fonctionnent bien, tant que je clique une deuxième fois... mais jamais la première. :(
DEUXIÈME ÉDITION : Eh bien, j'ai réduit le problème. Peut-être que quelqu'un peut m'aider à résoudre cela, c'est probablement un problème de structure :
public function Main {
Certaines choses...
empty_sprite = new Sprite(); // Créer un nouveau sprite de scène
addChild(empty_sprite);
empty_sprite.stage.addEventListener(hooks clavier...);
addChild(BackgroundImage); // Je place mon image de fond qui est persistante
addChild(PlayNowButton); // J'affiche mon bouton Jouer maintenant à l'écran
Plus de choses...
}
public function StartGame() {
removeChild(PlayNowButton); // C'est le point de défaillance ; cela supprime le focus.
removeChild(otherMenuOptions);
...
addChild(gameComponents);
}
Comme vous pouvez le voir, je crée le bouton Jouer maintenant - et il semble que cela devient l'objet de focus. Mes événements clavier ne sont pas capturés car c'est le fond qui cherche le focus. Pas sûr si cela a du sens, j'espère que quelqu'un pourra m'aider à résoudre cela !
Si je commente cette seule ligne (removeChild(PlayNowButton)), le jeu fonctionne parfaitement et conserve le focus clavier - avec le désavantage d'avoir un bouton "jouer maintenant" superposé à l'écran pour toujours.
Honnêtement, je ne suis même pas sûr si le jeu lui-même reçoit jamais le focus au premier clic mais je ne sais pas comment le tester.