Flash e Flex SDK / AS3 - Como manter o foco do teclado?
Estou escrevendo um aplicativo flash no Flex / AS3 e não consigo atribuir o foco do teclado a ele. Eu estava ciente desse problema no início do desenvolvimento e adicionei uma tela inicial com um botão "reproduzir agora", para atrair o usuário a clicar. No entanto, o usuário deve clicar uma segunda vez no aplicativo para que o teclado funcione!
Para piorar a situação, tenho um atalho no jogo que o leva ao menu principal. Se você retornar ao menu principal e clicar no botão "reproduzir agora", o SWF perde o foco novamente!
Provavelmente estou bagunçando objetos filhos ou destruindo acidentalmente um objeto que capturou o foco do teclado, mas não tenho muita certeza de como ele funciona. Você pode me ajudar a apontar na direção certa?
Meu aplicativo é um único arquivo .SWF e estou executando-o diretamente no meu navegador (sem chamá-lo por meio de uma página da Web, embora eu acabe). Aqui está o arquivo em questão:
http: //www.space-squid.com/game/Main.sw Quando você clica em "Normal", é necessário clicar uma segunda vez para realmente capturar o foco do teclado. :( Sinta-se livre para perguntar
Editar Aqui está um código que estou usand
Alguns dos primeiros códigos executados na minha classe principal:
empty_sprite = new Sprite();
addChild(empty_sprite);
empty_sprite.stage.addEventListener(keyboard hooks...);
Eu também tentei isso no caso de eu ter definido os ganchos no meu objeto raiz:
this.stage.addEventListener(keyboard hooks...);
Caso o sprite vazio estivesse causando problemas:
background_image = new BackgroundImage();
background_image.x = etc etc alignment data;
addChild(background_image);
background_image.stage.addEventListener(keyboard hooks...)
Em todos esses exemplos, meus ganchos de teclado funcionam bem, desde que eu clique na segunda vez ... mas nunca na primeira. :
SECOND EDIT: Bem, reduzi o problema. Talvez alguém possa me ajudar a resolver isso, provavelmente é um problema de estrutura:
public function Main {
Some stuff...
empty_sprite = new Sprite(); // Create a new stage sprite
addChild(empty_sprite);
empty_sprite.stage.addEventListener(keyboard hooks...);
addChild(BackgroundImage); // I lay down my background image which is persistant
addChild(PlayNowButton); // I display my PlayNow button to the screen
More stuff...
}
public function StartGame() {
removeChild(PlayNowButton); // This is the point of failure; this removes focus.
removeChild(otherMenuOptions);
...
addChild(gameComponents);
}
Como você pode ver, eu crio o botão play now - e parece que isso se torna o objeto de foco. Meus eventos de teclado não estão sendo presos, pois é o plano de fundo que está procurando o foco. Não tenho certeza se isso faz sentido, espero que alguém possa me esclarecer com isso!
Se eu comentar essa única linha (removeChild (PlayNowButton)), o jogo funcionará perfeitamente e manterá o foco do teclado - com a desvantagem de ter um botão "playnow" sobreposto na tela para sempr
Para ser sincero, nem tenho certeza se o jogo em si recebe o foco no primeiro clique, mas não sei como testar isso.