4

Flex / AS3でフラッシュアプ​​リケーションを作成していますが、キーボードフォーカスを割り当てることができないようです。私は開発の早い段階でこの問題に気を配り、ユーザーにクリックを促すために「今すぐ再生」ボタン付きのスプラッシュ画面を追加しました。ただし、キーボードを機能させるには、ユーザーはアプリケーションをもう一度クリックする必要があります。

さらに悪いことに、メインメニューに戻るゲーム内ショートカットがあります。メインメニューに戻って[今すぐ再生]ボタンをクリックすると、SWFは再びフォーカスを失います。

おそらく、子オブジェクトを台無しにしたり、キーボードのフォーカスをキャプチャしたオブジェクトを誤って破壊したりしていますが、それがどのように機能するかはよくわかりません。私を正しい方向に向けるのを手伝ってもらえますか?

私のアプリケーションは単一の.SWFファイルであり、ブラウザーで直接実行しています(Webページ経由ではなく、最終的には呼び出します)。問題のファイルは次のとおりです。

http://www.space-squid.com/game/Main.swf [通常]をクリックすると、キーボードのフォーカスを実際に取得するためにもう一度クリックする必要があります。:(お気軽に質問してください!

編集:これが私が使用しているいくつかのコードです。

私のプライマリクラスで実行される最初のコードのいくつか:

empty_sprite = new Sprite();
addChild(empty_sprite);
empty_sprite.stage.addEventListener(keyboard hooks...);

ルートオブジェクトにフックを設定する必要がある場合に備えて、これも試しました。

this.stage.addEventListener(keyboard hooks...);

空のスプライトが問題を引き起こしていた場合:

background_image = new BackgroundImage();
background_image.x = etc etc alignment data;
addChild(background_image);
background_image.stage.addEventListener(keyboard hooks...)

これらのすべての例で、2回目にクリックする限り、キーボードフックは正常に機能しますが、1回目はクリックしません。:(

2番目の編集:問題を絞り込みました。おそらく誰かが私がこれを正すのを手伝ってくれるでしょう、それはおそらく構造の問題です:

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);
}

ご覧のとおり、[今すぐ再生]ボタンを作成すると、フォーカスの対象になるように見えます。フォーカスを探しているのは背景であるため、キーボードイベントがトラップされていません。それが理にかなっているかどうかはわかりませんが、うまくいけば、誰かがこれで私をまっすぐにすることができます!

その1行(removeChild(PlayNowButton))をコメントアウトすると、ゲームは完全に正常に動作し、キーボードのフォーカスを維持します。「playnow」ボタンが画面に永久にオーバーレイされるという欠点があります。

正直なところ、ゲーム自体が最初のクリックに焦点を合わせているかどうかさえわかりませんが、それをテストする方法はわかりません。

4

2 に答える 2

13

探しているコードは次のとおりです。

gameWorldObject.stage.focus = this;

Flashがフォーカスを取得したため、キーボードイベントハンドラーはFlashアプリケーション自体の中でフォーカスされていません。上記のコードを使用して、現在のフォーカスがアプリケーション内のどこにあるかを切り替えることができます。

または、PlayNowボタンを破棄する代わりに、ボタンを非表示にすることでうまくいきます。その後、必要なときに再び表示できるようにします。MovieClipまたはSpriteオブジェクトの場合は非常に簡単です。

PlayNowButton.visible = false; // or true obviously, as the case may be

(このように自分自身に書くのは難しいです)

于 2009-04-27T07:54:17.027 に答える
2

これはブラウザプロジェクトだと思いますか?

これが私がそれをする方法です:

package com.whatever.utilities {

    import flash.external.ExternalInterface; 

    public class Browsers {

        public static function FocusThisSwf():void {
            if(!ExternalInterface.available)
                return;
            ExternalInterface.call("eval", "document.getElementById('" +
                ExternalInterface.objectID + "').focus()");
        }
        // ...
     }
     //...
}

問題がある場合は、埋め込み/オブジェクトのマークアップにIDと名前の属性があることを確認してください。

于 2009-04-25T21:52:48.493 に答える