4

AS3 ゲーム (Flex 4.10.0 を使用) で、プレイヤーがフルスクリーン モードであってもチャットできるようにしたいと考えています。

そこで、次の ActionScript コードを使用しています (_fullBoxチェックボックスは、Web アプリケーションでフルスクリーン モードをトリガーします)。

public function init():void {
    if (stage.allowsFullScreenInteractive)
        stage.addEventListener(FullScreenEvent.FULL_SCREEN, handleFullScreen, false, 0, true);
}

private function toggleFullScreen(event:MouseEvent):void {
    stage.displayState = 
        stage.displayState == StageDisplayState.NORMAL ?
        StageDisplayState.FULL_SCREEN_INTERACTIVE :
        StageDisplayState.NORMAL;
}

private function handleFullScreen(event:FullScreenEvent):void {
    _fullBox.selected = event.fullScreen;
}

<s:CheckBox id="_fullBox" click="toggleFullScreen(event)" label="Full Screen" />

これは、フルスクリーン モードが正常に開始され、ユーザーがキーボードを使用してチャットできるという意味で機能します。

残念ながら、ダイアログの [許可] ボタン ([キーボード コントロールで全画面表示を許可しますか?] が表示されます) のクリックは、Web アプリケーションに渡されます。

そして、私の場合、スクリーンショットでわかるように、ロビーのプレイテーブルをクリックして、(望ましくない) ゲームに参加することになります:

ここに画像の説明を入力

この (バグ?) は、Windows 7 / 64 ビットおよび Flash Player 11,8,800,115 で見られます。

誰かがこれに対する良い回避策を共有できますか?

透明SpriteまたはUIComponent上に Web アプリケーションを追加することを考えていましたが、問題はいつ (つまり、どのメソッドで) 表示/非表示にするかです。

アップデート:

event.stopPropagation()から電話しhandleFullScreen()ても何の役にも立ちません。

更新 2:

Adobe にBug #3623333を提出しました。

更新 3:自分へのメモ -stage.allowsFullScreenInteractiveフルスクリーン モードで既に設定されている場合にのみ設定されるため、役に立ちません。

4

2 に答える 2

2

おっしゃったように、望ましくないクリック イベントを避けるために透明なレイヤーを作成する必要があります。画面が通常の状態に戻ったとき、またはユーザーがフルスクリーン状態を受け入れたときに、このレイヤーを非表示にすることができます (FULL_SCREEN_INTERACTIVE_ACCEPTEDイベントが発生します)。

デモ(Flashplayer 11.3 が必要)

var transparentLayer:Sprite=new Sprite();
var timer:Timer = new Timer(50, 1);
init();
function init():void {
    transparentLayer.graphics.beginFill(0,0.1);
    transparentLayer.graphics.drawRect(0,0,stage.stageWidth,stage.stageHeight);
    transparentLayer.graphics.endFill();
    transparentLayer.visible=false;
    addChild(transparentLayer);
    timer.addEventListener(TimerEvent.TIMER_COMPLETE,handleTimerComplete);
    stage.addEventListener(FullScreenEvent.FULL_SCREEN_INTERACTIVE_ACCEPTED,handleFSIA);
    _fullBox.addEventListener(MouseEvent.CLICK,toggleFullScreen);
    stage.addEventListener(FullScreenEvent.FULL_SCREEN, handleFullScreen);
}
function toggleFullScreen(e:MouseEvent):void {
    if(stage.displayState == StageDisplayState.NORMAL){
        stage.displayState=StageDisplayState.FULL_SCREEN_INTERACTIVE;

        transparentLayer.visible=ExternalInterface.available;

    }else
        stage.displayState=StageDisplayState.NORMAL;
}
function handleFullScreen(e:FullScreenEvent):void {
    _fullBox.selected = e.fullScreen;
    if(stage.displayState == StageDisplayState.NORMAL)
        transparentLayer.visible=false;
}
function handleFSIA(e:FullScreenEvent):void{
    timer.reset();
    timer.start();
}
function handleTimerComplete(e:TimerEvent):void{
    transparentLayer.visible=false;
}
于 2013-09-04T19:18:10.283 に答える
1

1 つの回避策が見つかりました。

許可ボタンとキャンセル ボタンはアプリケーションの一部ではないため、これらのボタンのいずれかにカーソルを合わせると、アプリケーションのロールアウト イベントを受け取ります。

<s:Application
    rollOut="application_rollOutHandler(event)"
    rollOver="application_rollOverHandler(event)">


イベント ハンドラー内で、子オブジェクトのマウス イベントを無効にできます。その後、rollOver イベントを取得しないため、アプリケーションを無効にしないでください。

private function application_rollOutHandler(event:MouseEvent):void
{
    this.mouseChildren = false;
}

private function application_rollOverHandler(event:MouseEvent):void
{
    this.mouseChildren = true;
}
于 2013-09-06T08:41:21.863 に答える