Flash & Flex SDK / AS3 - Как сохранить фокусировку клавиатуры? - PullRequest
4 голосов
/ 26 апреля 2009

Я пишу флеш-приложение во Flex / AS3 и не могу назначить ему фокус клавиатуры. Я помнил об этой проблеме на ранней стадии разработки и добавил заставку с кнопкой «играть сейчас», чтобы побудить пользователя нажать. Тем не менее, пользователь должен затем нажать второй раз на приложение, чтобы клавиатура работала!

Что еще хуже, у меня есть ярлык в игре, который возвращает вас в главное меню. Если вы вернетесь в главное меню и нажмете кнопку «воспроизвести сейчас», SWF снова потеряет фокус!

Возможно, я испортил дочерние объекты или случайно уничтожил объект, который захватил фокус клавиатуры, но я не совсем уверен, как это работает. Можете ли вы помочь направить меня в правильном направлении?

Мое приложение представляет собой один файл .SWF, и я запускаю его прямо в своем браузере (не вызывая его через веб-страницу, хотя в конечном итоге я это сделаю). Вот этот файл:

http://www.space -squid.com / игра / main.swf Когда вы нажимаете «Normal», вам нужно нажать второй раз, чтобы фактически захватить фокус клавиатуры. Не стесняйтесь задавать вопросы!

Редактировать: Вот код, который я использую.

Некоторые из первых кодов, которые выполняются в моем основном классе:

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» накладывается на экран навсегда.

Если честно, я даже не уверен, получает ли игра когда-нибудь фокус на первом клике, но я не уверен, как это проверить.

Ответы [ 2 ]

13 голосов
/ 27 апреля 2009

Код, который вы ищете:

gameWorldObject.stage.focus = this;

Поскольку Flash получил фокус, ваш обработчик событий клавиатуры просто не фокусируется внутри самого приложения Flash. Вы можете переключиться, где текущий фокус находится внутри приложения, используя приведенный выше код.

В качестве альтернативы, вместо того, чтобы уничтожить кнопку PlayNow, сделайте ее невидимой. Затем сделайте его снова видимым позже, когда вам это нужно. Очень просто, если это MovieClip или объект Sprite:

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

(Трудно так себе писать)

2 голосов
/ 26 апреля 2009

Я предполагаю, что это проект браузера?

Вот как я это делаю:

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 и Name!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...