Javascript 移相器缓存加载问题
我正在做一个phaser游戏。我正在加载一个背景图像,它的信息文件位置存储在一个JSON文件中。当我尝试加载它时,背景是黑色和空的,在控制台中我得到: Phaser.Cache.getImage:在缓存中找不到密钥背景0 以下是我的代码的相关摘录:Javascript 移相器缓存加载问题,javascript,phaser-framework,Javascript,Phaser Framework,我正在做一个phaser游戏。我正在加载一个背景图像,它的信息文件位置存储在一个JSON文件中。当我尝试加载它时,背景是黑色和空的,在控制台中我得到: Phaser.Cache.getImage:在缓存中找不到密钥背景0 以下是我的代码的相关摘录: function create() { //>Load JSON file and background images found inside the file $.getJSON("levels.json", functi
function create() {
//>Load JSON file and background images found inside the file
$.getJSON("levels.json", function(json) {
for (var i = 0; i < json.levels.length; i++) {
game.load.image('background' + i.toString(), json.levels[i].background);
}
game.load.start();
});
back_layer = game.add.group();
var i = 0;
var level_finished = 0;
$.getJSON("levels.json", function(json) {
if (i < json.levels.length) {
console.log("Level " + (i + 1).toString());
var current_background = back_layer.create(0, 0, 'background' + i.toString());
check = setInterval(function() {
if (level_finished == 1) {
i++;
current_background.destroy();
clearInterval(check);
}
}, 500)
}
});
}
使用Chrome、Firefox和Opera进行测试,每次我打开页面时,似乎都会随机出现错误,或者加载背景并正常工作。我正在使用WAMP在本地托管页面。在Phaser中加载资产是异步的,如果您在请求加载某个内容后立即尝试访问该内容,它将以这种方式失败。移动预加载逻辑以预加载Phaser的另一个方法。与create-Phaser一样的状态将确保在调用您的create方法时,预加载中请求的所有内容都已加载。在Phaser中加载资产是异步的,如果您在请求加载内容后立即尝试访问某些内容,它将以这种方式失败。移动预加载逻辑以预加载Phaser的另一个方法。状态与create一样-Phaser将确保在调用您的create方法时,预加载中请求的所有内容都已加载。Phaser加载资产、JSON、图像、,etc是通过在预加载函数中使用game.load.*API或为此指定的API实现的。在您的情况下,代码应为:
// Use your game instance here
var game = new Phaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: preload, create: create });
function preload() {
// Load JSON file describing the level
game.load.json('levels', 'levels.json');
}
// The function below will be automatically invoked by Phaser when
// the assets in the preload() function finished loading
function create() {
var json = game.cache.getJSON('levels');
// Enque the load of the background images found inside the level file
for (var i = 0; i < json.levels.length; i++) {
game.load.image('background' + i.toString(), json.levels[i].background);
}
// Specify loadComplete() as a callback to be called when all assets finished loading
game.load.onLoadComplete.add(loadComplete, this);
// Load the newly enqued assets
game.load.start();
}
// The function below will be automatically invoked by Phaser when
// the assets in the create() function finished loading
function loadComplete() {
var json = game.cache.getJSON('levels');
back_layer = game.add.group();
var i = 0;
var level_finished = 0;
if (i < json.levels.length) {
console.log("Level " + (i + 1).toString());
var current_background = back_layer.create(0, 0, 'background' + i.toString());
check = setInterval(function() {
if (level_finished == 1) {
i++;
current_background.destroy();
clearInterval(check);
}
}, 500)
}
}
随机行为有时正常,有时不正常的原因是使用jQuery$.getJSON而不是Phaser内置系统来加载JSON文件
由于jQuery与Phaser无关,因此在调用期间它们既不同步也不排序。因此,有时$.getJSON加载JSON文件的速度足够快,以便在调用Phaser的create方法时准备就绪。在这种情况下,一切都按预期进行。当$.getJSON不够快时,将在加载JSON文件之前调用create,从而导致错误。加载JSON、图像等资产的Phaser方法是使用预加载函数中的game.load.*API或为此指定的API。在您的情况下,代码应为:
// Use your game instance here
var game = new Phaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: preload, create: create });
function preload() {
// Load JSON file describing the level
game.load.json('levels', 'levels.json');
}
// The function below will be automatically invoked by Phaser when
// the assets in the preload() function finished loading
function create() {
var json = game.cache.getJSON('levels');
// Enque the load of the background images found inside the level file
for (var i = 0; i < json.levels.length; i++) {
game.load.image('background' + i.toString(), json.levels[i].background);
}
// Specify loadComplete() as a callback to be called when all assets finished loading
game.load.onLoadComplete.add(loadComplete, this);
// Load the newly enqued assets
game.load.start();
}
// The function below will be automatically invoked by Phaser when
// the assets in the create() function finished loading
function loadComplete() {
var json = game.cache.getJSON('levels');
back_layer = game.add.group();
var i = 0;
var level_finished = 0;
if (i < json.levels.length) {
console.log("Level " + (i + 1).toString());
var current_background = back_layer.create(0, 0, 'background' + i.toString());
check = setInterval(function() {
if (level_finished == 1) {
i++;
current_background.destroy();
clearInterval(check);
}
}, 500)
}
}
随机行为有时正常,有时不正常的原因是使用jQuery$.getJSON而不是Phaser内置系统来加载JSON文件
由于jQuery与Phaser无关,因此在调用期间它们既不同步也不排序。因此,有时$.getJSON加载JSON文件的速度足够快,以便在调用Phaser的create方法时准备就绪。在这种情况下,一切都按预期进行。当$.getJSON不够快时,将在加载JSON文件之前调用create,从而导致错误。我将后台加载逻辑移到了预加载程序中,但我遇到了相同的问题-它有时加载,有时不加载。我将后台加载逻辑移到了预加载程序中,但我也有同样的问题——它有时会加载,有时不会加载。谢谢你的回答,它真的很有帮助!但是,在刷新页面之前第一次运行游戏时,我收到一个错误“Phaser.Loader-active loading canceled/reset”。刷新可以解决此问题,但并不理想。您是否尝试加载示例中提供的资产以外的任何其他资产?这可能是由于在加载其他资产的同时,相位器加载了某些东西造成的。您可以尝试通过在创建函数的开头调用game.load.reset或game.load.resettrue硬重置来阻止警告消息。我正在预加载函数中加载图像。向create函数添加reset不会更改错误。我也有一个错误,桨是未定义的。桨是loadComplete中定义的精灵。但是,当我尝试从更新中访问它时,我得到一个错误,即它未定义。请尝试在示例中声明var游戏的同一范围内声明将由多个函数使用的桨和任何其他var。它应该使所有函数都可以访问变量,并防止您提到的错误。这并没有改变错误,我已经创建了一个新问题来解决这个问题,谢谢您的帮助!谢谢你的回答,真的很有帮助!但是,在刷新页面之前第一次运行游戏时,我收到一个错误“Phaser.Loader-active loading canceled/reset”。刷新可以解决此问题,但并不理想。您是否尝试加载示例中提供的资产以外的任何其他资产?这可能是由于在加载其他资产的同时,相位器加载了某些东西造成的。您可以尝试通过在创建函数的开头调用game.load.reset或game.load.resettrue硬重置来阻止警告消息。我正在预加载函数中加载图像。向create函数添加reset不会更改错误。我也有一个错误,桨是未定义的。垫
le是loadComplete中定义的精灵。但是,当我尝试从更新中访问它时,我得到一个错误,即它未定义。请尝试在示例中声明var游戏的同一范围内声明将由多个函数使用的桨和任何其他var。它应该使所有函数都可以访问变量,并防止您提到的错误。这并没有改变错误,我已经创建了一个新问题来解决这个问题,谢谢您的帮助!