2009-04-25 2 views
4

Ich schreibe eine Flash-Anwendung in Flex/AS3, und ich kann nicht scheinen, Tastaturfokus zu ihm zuzuweisen. Ich habe dieses Problem früh in der Entwicklung berücksichtigt und einen Begrüßungsbildschirm mit einem "Jetzt spielen" -Knopf hinzugefügt, um den Benutzer zum Klicken zu verleiten. Der Benutzer muss jedoch ein zweites Mal auf die Anwendung klicken, damit die Tastatur funktioniert.Flash & Flex SDK/AS3 - Wie Sie den Fokus der Tastatur erhalten?

Um die Sache noch schlimmer zu machen, habe ich eine In-Game-Verknüpfung, die Sie zum Hauptmenü zurückbringt. Wenn du zum Hauptmenü zurückkehrst und dann auf "Jetzt spielen" klickst, verliert die SWF wieder den Fokus!

Ich vermisse wahrscheinlich Kinder Objekte oder versehentlich ein Objekt zu zerstören, das den Fokus der Tastatur erfasst, aber ich bin mir nicht ganz sicher, wie es funktioniert. Kannst du mir helfen, in die richtige Richtung zu weisen?

Meine Anwendung ist eine einzelne .SWF-Datei, und ich führe es direkt in meinem Browser (nicht über eine Webseite aufrufen, obwohl ich irgendwann). Hier ist die Datei in Frage:

http://www.space-squid.com/game/Main.swf Wenn Sie auf "Normal" klicken, müssen Sie ein zweites Mal klicken, um tatsächlich den Tastaturfokus zu greifen. :(Fühlen Sie sich frei, Fragen zu stellen

Edit:!. Hier einige Code, den ich mit

Einige der ersten Code, der in meiner primären Klasse ausführt: Ich habe

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

auch versucht, dies für alle Fälle sollte ich die Haken an meinem Stammobjekt gesetzt haben:

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

Falls der ansonsten leeren Sprite wurde verursacht Probleme:

In all diesen Beispielen funktionieren meine Tastatur-Hooks gut, solange ich das zweite Mal klicke .. aber nie das erste Mal. :(

ZWEITE EDIT:. Nun habe ich das Problem eingegrenzt haben Vielleicht kann mir jemand dabei helfen zu begradigen, ist es wahrscheinlich ein Strukturproblem:

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

Wie Sie sehen können, erstelle ich die play now button - und es scheint, dass es zum Objekt des Fokus wird. Meine Tastaturereignisse werden nicht gefangen, weil es der Hintergrund ist, der nach dem Fokus sucht. Nicht sicher, ob das Sinn macht, hoffentlich kann mich jemand damit glätten!

Wenn ich diese einzelne Zeile auskommentieren (removeChild (PlayNowButton)) das Spiel w Orks perfekt in Ordnung und behält den Fokus der Tastatur - mit dem Nachteil, eine "Playnow" -Taste für immer auf dem Bildschirm überlagert.

Um ehrlich zu sein, bin ich mir nicht einmal sicher, ob das Spiel selbst jemals den Fokus auf den ersten Klick hat, aber ich bin mir nicht sicher, wie ich das testen soll.

+0

Wie genau funktioniert Ihre Splash-Screen funktioniert? Ist es Teil desselben swf? Verhält sich die App anders, wenn sie als eigenständiges SWF ausgeführt wird? – quoo

+0

Es ist Teil der gleichen SWF - und ich benutze keine Webseite, um die Datei anzuzeigen, ich lade nur die SWF direkt in meinem Browser. –

Antwort

13

Der Code Sie suchen, ist:

gameWorldObject.stage.focus = this; 

Da Flash-Fokus erhalten hat, wird die Tastatur Event-Handler einfach nicht in der Flash-Anwendung konzentriert sich. Mit dem obigen Code können Sie wechseln, wo der aktuelle Fokus innerhalb der Anwendung liegt.

Alternativ, anstatt die PlayNow-Taste zu zerstören, wird es unsichtbar machen. Dann mach es später wieder sichtbar, wenn du es brauchst. Sehr einfach, wenn es sich um eine MovieClip- oder ein Sprite-Objekt ist:

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

(Es ist schwer Schreiben mir diese Art und Weise)

+0

Diese Lösung hat für mich funktioniert. Ich habe immer noch keine Ahnung, warum das Entfernen eines untergeordneten Clips dieses Problem verursacht. – 1owk3y

2

Ich nehme an, das ist ein Browser-Projekt?

Hier ist, wie ich es tun:

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()"); 
     } 
     // ... 
    } 
    //... 
} 

Alle Schluckauf, stellen Sie sicher, Ihre embed/object Markup eine ID und Name-Attribut hat!

+0

Aktualisierte die Frage; Dies würde funktionieren, um der SWF den Fokus zu geben, aber durch Klicken auf "Jetzt abspielen" wird sie wieder entfernt. :( –

+0

Angenommen, es gibt nur eine SWF in Ihrem HTML/XML-Dokument, sobald es den Fokus hat, sollte es nie verlieren - es sei denn, etwas anderes im Dokument oder ein Browser-Add-on stört. Haben Sie live Demonstration oder ein Pastie der Seitenquelle? * (ed: wenn es nicht in einem Dokument ist, haben Sie kein Ende der Browser-Probleme) * –

+0

Ich habe ein Beispiel hier: http: // www. space-squid.com/game/Main.swf Wenn Sie auf "Normal" klicken, müssen Sie ein zweites Mal klicken, um tatsächlich den Tastaturfokus zu greifen. –

Verwandte Themen