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 中已经看到了这个(错误?)。

有人可以为此分享一个好的解决方法吗?

我正在考虑在我的 Web 应用程序上方添加一个透明SpriteUIComponent上方,但问题是何时(即以何种方法)显示/隐藏它?

更新:

调用event.stopPropagation()fromhandleFullScreen()没有任何帮助。

更新 2:

我已经在 Adob​​e 提交了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

找到了一种解决方法。

允许和取消按钮不是应用程序的一部分,因此当您悬停其中一个按钮时,您会收到应用程序的 rollOut 事件。

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


在事件处理程序中,您可以禁用子对象的鼠标事件。不要禁用应用程序,因为在那之后您不会收到翻转事件。

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 回答