簡體   English   中英

Flash&Flex SDK / AS3 - 如何保持鍵盤焦點?

[英]Flash & Flex SDK/AS3 - How to keep keyboard focus?

我正在Flex / AS3中編寫一個flash應用程序,我似乎無法為其分配鍵盤焦點。 我在開發早期就注意到了這個問題,並添加了一個帶有“立即播放”按鈕的啟動畫面,以吸引用戶點擊。 但是,用戶必須再次單擊應用程序才能使鍵盤正常工作!

更糟糕的是,我有一個游戲中的快捷方式,可以返回主菜單。 如果您返回主菜單然后單擊“立即播放”按鈕,SWF將再次失去焦點!

我可能搞亂兒童物體或意外破壞捕獲鍵盤焦點的物體,但我不太確定它是如何工作的。 你能指點我正確的方向嗎?

我的應用程序是一個.SWF文件,我直接在我的瀏覽器中運行它(不是通過網頁調用它,盡管我最終會這樣做)。 這是有問題的文件:

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...)

在所有這些例子中,我的鍵盤掛鈎工作正常,只要我第二次點擊..但絕不是第一次。 :(

第二次編輯:我把問題縮小了。 也許有人可以幫我解決這個問題,這可能是一個結構問題:

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

正如您所看到的,我創建了“立即播放”按鈕 - 它似乎成為焦點對象。 我的鍵盤事件沒有被捕獲,因為它是尋找焦點的背景。 不確定這是否有意義,希望有人可以用這個來理順我!

如果我注釋掉那一行(removeChild(PlayNowButton))游戲工作得很好並且保持鍵盤焦點 - 在屏幕上永久覆蓋“playnow”按鈕的缺點。

說實話,我甚至不確定游戲本身是否能夠專注於第一次點擊,但我不確定如何測試。

您正在尋找的代碼是:

gameWorldObject.stage.focus = this;

由於Flash已獲得焦點,因此您的鍵盤事件處理程序根本不會集中在Flash應用程序本身中。 您可以使用上面的代碼切換當前焦點在應用程序中的位置。

或者,不是破壞PlayNow按鈕,而是使其不可見將成功。 然后在需要時再次將其顯示出來。 如果它是MovieClip或Sprite對象,則非常簡單:

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

(用這種方式寫給自己很難)

我假設這是一個瀏覽器項目?

我是這樣做的:

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和名稱屬性!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM