2017-01-10 5 views
0

Google ChromeとFirefoxでゲームを実行すると、ゲーム画面が黒くなり、一度リフレッシュすると正常に実行されます。ゲームの未定義変数の最初の読み込みでフェイザーエラーが発生する

画面が黒のときに私がコンソールに表示されるエラーは次のとおりです。

TypeError: paddle is undefined (Firefox)

Uncaught TypeError: Cannot read property 'x' of undefined (Chrome)

私も警告している:私のコードの関連部分が

Phaser.Loader - active loading canceled/reset (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()関数がstartまだ値を割り当てられていないパドル変数を使用しています。しかし、わかりません。

答えて

3

createが完了するとファンクションが起動しますが、その場合はパドルが存在しないため、エラーがスローされます。私はあなたがあなたのゲームを国家に落とし、「Boot」状態であなたのjson + preloaderアセットをロードして、あなたが必要とするすべてのアセットを引く「Preloader」状態にスワップすることができます(jsonから読んで) 。完了すると、ゲームの状態に移動することができます。それは物事をあなたのために(論理的に)清潔に保つのにも役立ちます。

+0

**ブート状態からゲーム状態に切り替えるにはどうすれば知りますか? (つまり、どのようにプリロードが完了したかはわかります) – RashaMatt

1

前の回答に同意してください。あなたのゲームを状態に分解してください。 でゲームを作成するとどうなりますかvar game = new Phaser.Game(800,560、Phaser.AUTO、 'phaser-canvas'、{preload:preload、create:create、update:update});

'preload'、 'create'、および 'update'関数を実行するオブジェクトを挿入しています。あなたの関数processPaddle()は、そのオブジェクト内の関数を下のコードの同じ名前の関数と等しく設定しているので、そのオブジェクトの外にあります。

Stateオブジェクトにコードを設定していれば、processPaddle()をインクルードし、this.processPaddle()を参照することができます。

{preload:preload、create:create、update:update}を{preload:preload、create:create、update:update、processPaddle:processPaddle}に変更することで、そのまま修正することができます。

関連する問題