Как предотвратить мультибокс во флеш игре?
У меня есть многопользовательская флэш-игра (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, поэтому они никогда не перезаписывают значение друг друга.
Каков наилучший способ сделать это?
1 ответ
Использовать локальное соединение
Если соединение уже существует, вы знаете, что открыта другая игра, потому что соединение не будет установлено, если оно уже используется.
Конечно, это относится только к 1 компьютеру.
import flash.net.LocalConnection
var lcReceiver:LocalConnection = new LocalConnection();
try {
lcReceiver.allowDomain('*')
lcReceiver.connect( '_tectcon');
} catch (error:ArgumentError) {
trace('CONNECTION FAILURE ' + error.message )
}