用于在线游戏更新的 ActionScript 3.0 Loop URLLoader

ActionScript 3.0 Loop URLLoader for online game update

如何在 AS3 中编写 URLLoader 从 URL 下载数据,更新游戏,然后无限期地再次调用自身。我已经使用了以下但收到错误:Error #2044: Unhandled ioError:. text=Error #2032: Stream Error.

function getState()
{
    var stateLoader=new URLLoader();
    stateLoader.addEventListener(Event.COMPLETE,loadState);
    stateLoader.load(new URLRequest("http://localhost/mySite/index.php"));
}
function loadState(event:Event)
{
    //game update goes here
    getState();
}
getState();

如果我从 loadState 函数中删除 getState();,代码将按预期工作,但显然不会循环。

首先,如果您希望您的游戏与服务器同步,请考虑不同的后端设置,允许您使用 TCP 套接字的设置:它们消耗更少的流量并允许构建另一种架构,其中服务器是负责更新客户端变化的人 - 这种设置会更快,响应更快。

然后,你的代码。该错误意味着服务器出于任何原因无法处理您的请求。除此之外,垃圾 HT​​TP 请求不是一个好的做法,因为浏览器对传出 HTTP 请求的数量有一定的限制(我不确定总限制,但肯定有一个相同的 URL,比如大约 10 ,因浏览器而异)。因此,在您从服务器获得答复和您下次请求更新之间插入一个小暂停是个好主意。这也将减轻您的服务器 GREAT 交易。

// Keep the reference to the URLLoader instance
// if you don't want it to be randomly garbage collected.
var stateLoader:URLLoader;

// Clean up the previous request.
function clearLoader():void
{
    if (!stateLoader) return;

    stateLoader.removeEventListener(Event.COMPLETE, loadState);
    stateLoader = null;
}

function getState():void
{
    // Create new instance.
    stateLoader = new URLLoader;

    // Subscribe for COMPLETE event.
    stateLoader.addEventListener(Event.COMPLETE, onState);

    // Obviously, handle I/O errors.
    stateLoader.addEventListener(IOErrorEvent.IO_ERROR, onError, false, 0, true);

    // Request the update.
    stateLoader.load(new URLRequest("http://localhost/mySite/index.php"));
}

// 
function onError(e:IOErrorEvent):void
{
    // Check if the error is from the current URLLoader instance.
    // If no, then ignore the event.
    if (e.target != stateLoader) return;

    // Remove the URLLoader instance, you don't need this one any more.
    clearLoader();

    // Call next update in 1 second.
    setTimeout(getState, 1000);
}

function onState(e:Event):void
{
    // Check if the error is from the current URLLoader instance.
    // If no, then ignore the event.
    if (e.target != stateLoader) return;

    // Game update goes here.

    // Remove the URLLoader instance, you don't need this one any more.
    clearLoader();

    // Call next update in 0.5 seconds.
    setTimeout(getState, 500);
}

getState();