Как предотвратить мультибокс во флеш игре? - PullRequest
1 голос
/ 29 сентября 2011

У меня есть многопользовательская флеш-игра (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 Ответ

0 голосов
/ 29 сентября 2011

Использовать локальное соединение
Если соединение уже существует, вы знаете, что открыта другая игра, потому что соединение не будет установлено, если оно уже используется.
Конечно, это относится только к 1 компьютеру.

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