2013-09-01 100 views
4

在AS3遊戲中(使用Flex 4.10.0),我希望允許玩家聊天,即使他們是in fullscreen modeFULL_SCREEN_INTERACTIVE模式:「允許」按鈕點擊傳遞給應用程序

所以我用以下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" /> 

這個作品在這個意義上,成功地進入全屏模式,用戶可以使用鍵盤也聊天。

不幸的是,在對話框中的「允許」按鈕(顯示「Allow full screen with keyboard controls?」)的點擊被傳遞給Web應用程序。

在我的情況下,它的點擊播放表大堂resuls,你可以在截圖中看到,因此(無用)加入遊戲:(?BUG)

enter image description here

這已被視爲Windows 7/64位和Flash Player 11,8800,115。

任何人都可以分享一個很好的解決方法嗎?

我正在考慮在我的web應用程序上添加一個透明的SpriteUIComponent,但問題是何時(即在哪些方法中)顯示/隱藏它?

UPDATE:

調用從handleFullScreen()event.stopPropagation()沒有什麼幫助。

更新2:

我Adobe公司提交Bug #3623333

UPDATE 3:對自己說明 - stage.allowsFullScreenInteractive是無用的,因爲只有在全屏模式下才能設置。

+1

我看到的唯一解決方案是放置一個透明圖層(精靈,圖像,無論)停止點擊。使用'FullScreenEvent'添加或刪除它。 – Pier

+0

因此,在'toggleFullScreen()'中創建一個「圖層」,並在'handleFullScreen()'中刪除它? –

+0

是的,類似的東西。 – Pier

回答

2

正如您所提到的,您需要創建透明圖層以避免不希望的點擊事件。當屏幕恢復到正常狀態或用戶接受全屏狀態時,您可以隱藏此圖層(將觸發FULL_SCREEN_INTERACTIVE_ACCEPTED事件)。

Demo(11.3的Adobe Flash需要)

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; 
} 
+0

'addChild()'在Flex程序中不起作用... –

+1

我從來沒有使用過Flex,本文可能會幫助你:http://stackoverflow.com/a/2996101/1696720 –

+1

@AlexanderFarber,我更新了我的flash親和爲你建立一個演示。我也修改了代碼。 –

1

實測一個解決方法。

允許和取消按鈕不是應用程序的組成部分,因此當您將其中一個按鈕懸停時,您會收到應用程序的rollOut事件。

<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; 
} 
相關問題