1

我有多人 Flash 游戏 (AS3),我想防止多选,例如防止用户在一台计算机上运行我的游戏的两个(或更多)实例。有没有简单可靠的方法来做到这一点?我不想根据 IP 地址过滤它们。

我尝试使用 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 一样,因此它们永远不会重写彼此的值。

实现这一目标的最佳方法是什么?

4

1 回答 1

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 )
}
于 2011-09-29T18:15:54.343 回答