首次加载游戏未定义变量时出现Phaser错误

时间:2017-01-10 16:06:40

标签: javascript undefined phaser-framework

当我在谷歌浏览器和Firefox中运行我的游戏时,游戏屏幕是黑色的,一旦我刷新它,它就会运行它。

屏幕为黑色时我在控制台中看到的错误是:

  

TypeError:paddle未定义(Firefox)

     

未捕获的TypeError:无法读取未定义的属性'x'(Chrome)

我也有警告:

  

Phaser.Loader - 有效加载已取消/重置(Firefox& Chrome)

我的代码的相关部分是:

var game = new Phaser.Game(800, 560, Phaser.AUTO, 'phaser-canvas', { preload: preload, create: create, update: update });

function setUpLevel(i) {
    $.getJSON("levels.json", function(json) {
            paddle.x = json.levels[i].paddle_startX;
    });
}

function processPaddle() {
    var paddle_loc = paddle.x + 80
}

function preload() {    
    //>Game assets
    game.load.image('paddle', 'assets/img/Paddle.png');

    // Load JSON file describing the level
    game.load.json('levels', 'levels.json');
}

//Paddle
var paddle;
var paddle_vel;

var json;

// The function below will be automatically invoked by Phaser when
// the assets in the preload() function finished loading

function create() {
    game.load.reset(true);

    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() {
    json = game.cache.getJSON('levels');

    game.physics.startSystem(Phaser.Physics.ARCADE);

    paddle = mid_layer.create(100, 400, 'paddle');
    game.physics.enable(paddle, Phaser.Physics.ARCADE);

    paddle.scale.setTo(0.7, 0.7);
    paddle.body.immovable = true;
    paddle.body.collideWorldBounds = true;

    setUpLevel(current_level);    
}

 function update() {
        processPaddle();
 }

我猜错误是因为loadComplete()函数还没有完成,并且update()函数已经启动,它使用的paddle变量尚未赋值 - 但我不是肯定的。

2 个答案:

答案 0 :(得分:3)

update函数将在create完成后立即开始触发,但在您的情况下,此时桨不存在,因此将开始抛出错误。我建议你将游戏分解为状态,'Boot'状态可以加载你的json + preloader资产,然后你可以换成'Preloader'状态,它可以获取你需要的所有资产(从json读取) 。完成后,您可以转到游戏状态或类似状态。它也有助于为你保持清洁(逻辑上)。

答案 1 :(得分:1)

同意之前的回答 - 你应该考虑将你的游戏分解为各州。使用时创建游戏会发生什么     var game = new Phaser.Game(800,560,Phaser.AUTO,&#39; phaser-canvas&#39;,{preload:preload,create:create,update:update});

您正在插入一个运行&#39; preload&#39;,&#39;创建&#39;和&#39;更新&#39;功能。您的函数processPaddle()在该对象之外,因为您将该对象中的函数设置为等于下面代码中的同名函数。

如果您在State对象中设置了代码,那么您就可以包含processPaddle()并使用this.processPaddle()来引用。

您可以通过在第一行中将{preload:preload,create:create,update:update}更改为{preload:preload,create:create,update:update,processPaddle:processPaddle}来解决问题。