Flash AS3 – Fullscreen Fail, stage.displayState=null

Flash AS3 – Fullscreen Fail, stage.displayState=null

正在幫客戶做的一個小遊戲, 原本一個很簡單的 Fullscreen 功能搞得我叫苦連天.

由於非常的不合理, 我們從基本的思路開始說述起.

首先來 谷高(Google)一下坊間的程式碼,

[code lang=”AS3″]
public function main(){
// 初始化
stage.scaleMode = StageScaleMode.SHOW_ALL;
stage.align = StageAlign.TOP_LEFT;
// 其他的 xxxbutton.addEventListener(MouseEvent.CLICK, toggleScreen);
}//fn
public function toggleScreen(e:MouseEvent):void{
trace("current stats : "+ stage.displayState);
if (stage.displayState == StageDisplayState.FULL_SCREEN) {
stage.displayState=StageDisplayState.NORMAL;
} else {
stage.displayState=StageDisplayState.FULL_SCREEN;
}//if
}//fn
[/code]

{#th_061_.gif}好罷!! 看起來非常簡單對不?
那接下來, 運行一下…. 沒反應啊…..{#th_010_.gif}
查看 trace 的時候竟然發現 current stats : null ….
那意思就是說 stage.displayState 跟本是 null 嘛, 不論 assign 前後也一樣….
這不是 Bug 嗎??

再仔細的研究…..接下來的時候, 總會有高人(身高?),他們會告訴你.
要在 HTML 裡加上 allowFullscreen=true;…. 喵的早就加了
一開始就在用 swfObject.js 來弄這個東東.
而且也有老外在說同一個問題, stage = null.
也給出一些思路, 例如 static stage:Stage = this.stage; 等等的 override 系統的不良寫法..
總之今天是沒戲的了..

16 小時後(第二天)
嗯!反正也沒別的辦法試試用 HTML 的寫法來試試.

[html]
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"

codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,18,0"

width="600" height="450" id="fullscreen" align="middle">

<param name="allowFullScreen" value="true" />

<param name="movie" value="testGame.swf" />

<param name="bgcolor" value="#333333" />

<embed src="testGame.swf" allowFullScreen="true" bgcolor="#333333" width="600" height="450"

name="fullscreen" align="middle" type="application/x-shockwave-flash"

pluginspage="http://www.macromedia.com/go/getflashplayer" />

</object>
[/html]

{#th_023_.gif}
又來試試看罷…
果然用 swfObject 跟 HTML 是沒關係的…仍然不能 Fullscreen.
在 38 小時的憤戰+丟東西+借Game消仇後..
我再抱著想丟電腦的衝動來作最後努力…..
打開 Flash 本身的 “發佈”功能….
完全依照初學者的腳步……使用發佈功能導出那篇又長又臭的 HTML Code… 在做到其中一步的時候.

終於……………找到因由了.
“解決方案”
翻到 “發佈設定>HTML>範本 = 僅適用於 Flash -允許全螢幕”
是的你沒看錯…這個就是本案導致 Flash 不能 fullscreen 的兇手…
不論你是不是使用 Flash 來進行發佈, 這個選項一定要勾選, 那個 stage.displayState 才能正常使用, 如果沒有勾選則被 奧多比(Adobe) 關掉變為 永遠是 null 的咀咒…

(偽)結論: 奧多比(Adobe) 不知道那幾個腦殘在想, 如果隨便給Dev使用 Fullscreen 可能會道致有惡意程式的出現,
於是把執行本功能的 API隔離了, 可是沒有告訴寫 用家手冊的團隊..
總之事情其實是 奧多比(Adobe) 的“白痴”所引致的。{#th_082_-1.gif}

(喵的, 我可是在英文版裡看了整個下午,要不是youtube可以fullscreen, 我基本懷疑本功能是不是廢掉了.)
{#th_004_.gif}{#th_030_.gif}{#th_076_.gif}

正在幫客戶做的一個小遊戲, 原本一個很簡單的 Fullscreen 功能搞得我叫苦連天.

由於非常的不合理, 我們從基本的思路開始說述起.

首先來 谷高(Google)一下坊間的程式碼,

[code lang=”AS3″]
public function main(){
// 初始化
stage.scaleMode = StageScaleMode.SHOW_ALL;
stage.align = StageAlign.TOP_LEFT;
// 其他的 xxxbutton.addEventListener(MouseEvent.CLICK, toggleScreen);
}//fn
public function toggleScreen(e:MouseEvent):void{
trace("current stats : "+ stage.displayState);
if (stage.displayState == StageDisplayState.FULL_SCREEN) {
stage.displayState=StageDisplayState.NORMAL;
} else {
stage.displayState=StageDisplayState.FULL_SCREEN;
}//if
}//fn
[/code]

{#th_061_.gif}好罷!! 看起來非常簡單對不?
那接下來, 運行一下…. 沒反應啊…..{#th_010_.gif}
查看 trace 的時候竟然發現 current stats : null ….
那意思就是說 stage.displayState 跟本是 null 嘛, 不論 assign 前後也一樣….
這不是 Bug 嗎??

再仔細的研究…..接下來的時候, 總會有高人(身高?),他們會告訴你.
要在 HTML 裡加上 allowFullscreen=true;…. 喵的早就加了
一開始就在用 swfObject.js 來弄這個東東.
而且也有老外在說同一個問題, stage = null.
也給出一些思路, 例如 static stage:Stage = this.stage; 等等的 override 系統的不良寫法..
總之今天是沒戲的了..

16 小時後(第二天)
嗯!反正也沒別的辦法試試用 HTML 的寫法來試試.

[html]
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"

codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,18,0"

width="600" height="450" id="fullscreen" align="middle">

<param name="allowFullScreen" value="true" />

<param name="movie" value="testGame.swf" />

<param name="bgcolor" value="#333333" />

<embed src="testGame.swf" allowFullScreen="true" bgcolor="#333333" width="600" height="450"

name="fullscreen" align="middle" type="application/x-shockwave-flash"

pluginspage="http://www.macromedia.com/go/getflashplayer" />

</object>
[/html]

{#th_023_.gif}
又來試試看罷…
果然用 swfObject 跟 HTML 是沒關係的…仍然不能 Fullscreen.
在 38 小時的憤戰+丟東西+借Game消仇後..
我再抱著想丟電腦的衝動來作最後努力…..
打開 Flash 本身的 “發佈”功能….
完全依照初學者的腳步……使用發佈功能導出那篇又長又臭的 HTML Code… 在做到其中一步的時候.

終於……………找到因由了.
“解決方案”
翻到 “發佈設定>HTML>範本 = 僅適用於 Flash -允許全螢幕”
是的你沒看錯…這個就是本案導致 Flash 不能 fullscreen 的兇手…
不論你是不是使用 Flash 來進行發佈, 這個選項一定要勾選, 那個 stage.displayState 才能正常使用, 如果沒有勾選則被 奧多比(Adobe) 關掉變為 永遠是 null 的咀咒…

(偽)結論: 奧多比(Adobe) 不知道那幾個腦殘在想, 如果隨便給Dev使用 Fullscreen 可能會道致有惡意程式的出現,
於是把執行本功能的 API隔離了, 可是沒有告訴寫 用家手冊的團隊..
總之事情其實是 奧多比(Adobe) 的“白痴”所引致的。{#th_082_-1.gif}

(喵的, 我可是在英文版裡看了整個下午,要不是youtube可以fullscreen, 我基本懷疑本功能是不是廢掉了.)
{#th_004_.gif}{#th_030_.gif}{#th_076_.gif}

補圖一張:

發佈設定>HTML>範本 = 僅適用於 Flash -允許全螢幕

補充: 果然… 用回 swfObject 也可以達成 Fullscreen 效果,
根本與使用 object, embred, stage, Stage 等等完全無關. 真是靠他媽的奧多比,吃x去罷.

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料