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

时间:2018-01-21 15:34:56

标签: loops actionscript-3 flash urlloader urlrequest

如何在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();

如果我从getState();函数中删除loadState,但代码可以正常工作,但显然不会循环。

1 个答案:

答案 0 :(得分:0)

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

然后,你的代码。该错误意味着服务器无论出于何种原因都无法处理您的请求。除此之外,垃圾邮件发送HTTP请求不是一个好习惯,因为浏览器对传出的HTTP请求数量有一定的限制(我不确定总限制,但肯定有相同网址的一个,比如大约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();