2011-09-28 69 views
1

我有多人Flash遊戲(AS3),我想要防止多盒子,例如阻止用戶在一臺計算機上運行我的遊戲的兩個(或更多)實例。有沒有簡單可靠的方法如何做到這一點?我不想根據IP地址對它們進行過濾。如何防止Flash遊戲中的多盒?

我試圖使用LocalConnection,但它是不可靠的。它在大部分時間都有效,但由於某種原因,它有時會失敗。

然後我嘗試使用SharedObject向它寫入隨機值並檢查週期性間隔中的更改。想法是,當第二個實例啓動時,它會覆蓋以前的值,並在第一次檢查將失敗。

public function MultiboxPreventer(callback:Function) 
{ 
    uniqueKey = Math.random() * uint.MAX_VALUE; 

    so = SharedObject.getLocal("prefs"); 
    so.data.multiboxKey = uniqueKey; 
    so.flush(); 
    trace("MB init: " + so.data.multiboxKey); 
    so = null; 

    this.callback = callback; 

    var t:Timer = new Timer(10000, 0); 
    t.addEventListener(TimerEvent.TIMER, checkKey); 
    t.start(); 
} 

private function checkKey(event:TimerEvent):void { 
    so = SharedObject.getLocal("prefs"); 
    if(so.data.multiboxKey != uniqueKey) { 
     callback(); 
    } 
    trace("MB check: " + so.data.multiboxKey); 
} 

但是當我測試它時,它的行爲就好像每個實例都有自己的SharedObject,因此它們不會重寫對方的值。

完成此操作的最佳方法是什麼?

+0

有你在嘗試的getLocal使用本地路徑()?您的SWF文件(本地文件,託管)的上下文是什麼? –

+0

我正在測試它作爲本地文件以及託管在我的網站上,但它沒有任何工作方式。我沒有嘗試在getLocal()中設置路徑,我將按照原始問題中提到的方式研究它 – Lope

回答

0

使用本地連接
如果連接已經存在,則知道有另一個遊戲處於打開狀態,因爲如果已經使用連接將會失敗。
當然這隻適用於1臺電腦。

import flash.net.LocalConnection 
var lcReceiver:LocalConnection = new LocalConnection(); 
try { 
    lcReceiver.allowDomain('*') 
    lcReceiver.connect('_tectcon'); 
} catch (error:ArgumentError) { 
    trace('CONNECTION FAILURE ' + error.message) 
} 
+0

,我嘗試過,但它不是很可靠。我能夠不時開始2場比賽。但它仍然看起來像最好的解決方案,所以我可能會使用它 – Lope

+0

我一直在使用它,從來沒有可靠性問題。我能想到的唯一失敗的地方是如果一個連接是activeX而另一個是插件,但是我沒有測試它,所以不知道。至少它應該阻止他們打開新標籤並運行它。 –

+0

是的,我注意到很多人使用這個沒有任何問題,但沒有我:/我不知道這是否是關於我的遊戲的具體情況(我不知道它可能是什麼),或者如何一些遊戲門戶處理他們swf文件 – Lope