我仍在努力解决这一切,我遇到了一个非常奇怪的错误。
我使用的是getJSON但是在搜索了这个问题的解决方案后,我发现尝试使用AJAX函数更好(用于错误捕获 - >这不是解雇)。
在firebug中使用断点,如果我慢慢浏览正在运行的代码,它(通常)工作正常(只需更改一些坐标以获得更好的绘图)。但是如果我让它以正常速度运行,它会在返回json对象之前尝试进行回调。 firebug控制台说一切正常(代码200),但在检查ship对象/函数内的jobj时,它似乎是“未定义或为空”
在断点之后,ajax调用似乎是“错误”而不是“成功”。但它没有触发警报......
此外,响应需要300-500ms ....这是正常的吗?还是我需要找一个更好的服务器?
编辑代码:
var init = (function(){
thisplayer = new player();
jQuery.ajax({type: "GET", url: "shipdata.php", processData: true, data: {shipid:1}, dataType: "json",
success: function(json) {
var pship = new ship(json);
player_ship = $.extend(thisplayer, pship);
starfield = new starfield();
for(var i = 0; i < player_ship.enemytotal; i++) {
$.ajax({
type: "GET",
url: "shipdata.php",
processData: true,
data: {shipid:Math.round((Math.random()*2+2))},
dataType: "json",
success: function(json) {
var enemy = new ship(json);
game.enemies.push(enemy);
},
error: function(x,y,z) {
// x.responseText should have what's wrong
alert(x.responseTest);
}
});
}
game.initialized = true;
},
error: function(x,y,z) {
// x.responseText should have what's wrong
alert(x.responseTest);
}
});
})
..............................
var ship = (function(json){
var self = this;
jobj = jQuery.parseJSON(json.responseText);
self.height = jobj.height;
self.width = jobj.width;
self.xinit = jobj.xinit;
self.yinit = jobj.yinit;
self.speed = jobj.speed;
self.weapons = jobj.weapons;
self.maxlasers = jobj.maxlasers;
self.imagesrc = jobj.imgurl;
self.lasers = [];
self.x = self.xinit;
self.y = self.yinit;
发送的JSON:
{"height":75,"width":50,"xinit":275,"yinit":525,"speed":3,"weapons":[1,2],"maxlasers":2,"imgurl":"images\/ship.png"}
现场演示:
http://www.schennshome.net/medicalmmj/practice/index.html(代码远非完美,我正在通过它来尝试捕捉动画之前的各种错误,但是无法通过它。)
答案 0 :(得分:1)
我已经挖掘了您的源代码,问题实际上并未显示在您的问题中。问题出在这一行,它跟随你的Ajax调用:
player_ship = $.extend(thisplayer, game.pship);
game.pship
是指ajax调用返回的数据,但由于这是异步的,因此将首先评估上面的行,这意味着将不会定义game.pship
。
要解决此问题,您需要在init
回调中直接包含当前位于ajax调用之下的success
函数中的所有代码。这将阻止在返回ajax调用之前评估代码。
它与断点一起使用的原因是这会中断评估,这允许在引用game.pship
之前完成ajax调用。
修改强>
我现在在第489行收到错误,指出player_ship
未定义。这又是因为异步代码的评估顺序。问题是player_ship
现在正在init
中的ajax函数中定义,但在此回调之外的gameLoop
中被引用。
这就是我重写gameLoop
的方式:
var callback = function() {
game.canvas.clearCanvas();
drawStarfield();
if(player_ship.alive && game.initialized && !(game.loading)) {
drawPlayer();
drawLaser();
drawEnemies();
}
};
if(game.initialized==false) {
init(callback);
} else {
callback();
}
然后修改init
以接受在success
回调底部调用的回调方法。这样,如果游戏尚未初始化(并且尚未定义player_ship
),则将在ajax调用之后执行。