2015-04-22 57 views
1

爲了演示目的,我用Phaser創建了一個小遊戲。在贏或輸之後,你可以重新開始遊戲。這是與國家完成的。當遊戲重新啓動後我試圖發射一顆子彈時,發生空引用錯誤並且遊戲凍結。看起來空引用發生是因爲this.game屬性在重啓狀態後沒有在Weapon類中正確設置。重啓狀態後的空引用

var PhaserGame = function() { 

    this.background = null; 
    this.stars = null; 

    this.player = null; 
    this.enemies = null; 
    this.cursors = null; 
    this.speed = 300; 

    this.weapons = []; 
    this.currentWeapon = 0; 
    this.weaponName = null; 

    this.score = 0; 

}; 

PhaserGame.prototype = { 

    init: function() { 

     this.game.renderer.renderSession.roundPixels = true; 

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

    }, 


    preload: function() { 

     this.game.time.advancedTiming = true; 

    }, 

    create: function() { 

     this.background = this.add.tileSprite(0, 0, this.game.width, this.game.height, 'background'); 
     this.background.autoScroll(-40, 0); 

     this.stars = this.add.tileSprite(0, 0, this.game.width, this.game.height, 'stars'); 
     this.stars.autoScroll(-60, 0); 

     this.weapons.push(new Weapon.SingleBullet(this.game)); 
     //this.weapons.push(new Weapon.FrontAndBack(this.game)); 
     this.weapons.push(new Weapon.ThreeWay(this.game)); 
     //this.weapons.push(new Weapon.EightWay(this.game)); 
     this.weapons.push(new Weapon.ScatterShot(this.game)); 
     this.weapons.push(new Weapon.Beam(this.game)); 
     this.weapons.push(new Weapon.SplitShot(this.game)); 
     //this.weapons.push(new Weapon.Pattern(this.game)); 
     this.weapons.push(new Weapon.Rockets(this.game)); 
     this.weapons.push(new Weapon.ScaleBullet(this.game)); 
     //this.weapons.push(new Weapon.Combo1(this.game)); 
     //this.weapons.push(new Weapon.Combo2(this.game)); 

     this.currentWeapon = 0; 

     for (var i = 1; i < this.weapons.length; i++) 
     { 
      this.weapons[i].visible = false; 
     } 

     this.player = this.add.existing(new Spaceship(this.game, 100, 200, 'player')); 

     this.player.events.onKilled.add(this.toGameOver, this); 

     this.physics.arcade.enable(this.player); 

     this.player.body.collideWorldBounds = true; 

     this.player.animations.add('flame', [0, 1, 2, 3], 10, true); 
     this.player.animations.play('flame'); 

     //Enemies 
     this.enemies = this.add.group(); 

     //Enable Physics for Enemies 
     //this.physics.arcade.enable(this.enemies); 
     this.enemies.enableBody = true; 

     for (var i = 0; i < 24; i++) { 
      //create a star inside the group 
      var enemy = this.enemies.add(new Enemy(this.game, 1000 + (i * 50), 10 + Math.random() * 300, 'enemy')); 
      enemy.events.onKilled.add(this.raiseCounter, this); 
     } 

     //this.weaponName = this.add.bitmapText(8, 364, 'shmupfont', "ENTER = Next Weapon", 24); 

     // Cursor keys to fly + space to fire 
     this.cursors = this.input.keyboard.createCursorKeys(); 

     this.input.keyboard.addKeyCapture([ Phaser.Keyboard.SPACEBAR ]); 

     var changeKey = this.input.keyboard.addKey(Phaser.Keyboard.ENTER); 
     changeKey.onDown.add(this.nextWeapon, this); 
    }, 

    nextWeapon: function() { 

     // Tidy-up the current weapon 
     this.weapons[this.currentWeapon].visible = false; 
     this.weapons[this.currentWeapon].callAll('reset', null, 0, 0); 
     this.weapons[this.currentWeapon].setAll('exists', false); 

     // Activate the new one 
     this.currentWeapon++; 

     if (this.currentWeapon === this.weapons.length) 
     { 
      this.currentWeapon = 0; 
     } 

     this.weapons[this.currentWeapon].visible = true; 

     //this.weaponName.text = this.weapons[this.currentWeapon].name; 

    }, 

    enemyHit: function (bullet, enemy) { 
     bullet.kill(); 
     enemy.dealDamage(2); 
    }, 

    playerHit: function (player, enemy) { 
     player.dealDamage(10); 
     enemy.dealDamage(1); 
    }, 

    raiseCounter: function() { 
     this.score++; 
    }, 

    toGameOver: function() { 
     this.game.state.start('GameOver', true, false, this.score); 
    }, 

    update: function() { 

     //Framerate 
     this.game.debug.text(this.time.fps || '--', 2, 14, "#00ff00"); 
     this.game.debug.text('Health: ' + this.player.health || 'Health: ---', 2, 30, "#00ff00"); 
     this.game.debug.text('Counter: ' + this.score || 'Counter: ---', 2, 44, "#00ff00"); 

     this.game.physics.arcade.overlap(this.weapons[this.currentWeapon], this.enemies, this.enemyHit, null, this); 
     this.game.physics.arcade.overlap(this.player, this.enemies, this.playerHit, null, this); 


     this.player.body.velocity.set(0); 
     this.enemies.setAll('body.velocity.x', -50); 

     if (this.cursors.left.isDown) 
     { 
      this.player.body.velocity.x = -this.speed; 
     } 
     else if (this.cursors.right.isDown) 
     { 
      this.player.body.velocity.x = this.speed; 
     } 

     if (this.cursors.up.isDown) 
     { 
      this.player.body.velocity.y = -this.speed; 
     } 
     else if (this.cursors.down.isDown) 
     { 
      this.player.body.velocity.y = this.speed; 
     } 

     if (this.input.keyboard.isDown(Phaser.Keyboard.SPACEBAR)) 
     { 
      this.weapons[this.currentWeapon].fire(this.player); 
     } 

    } 

}; 

武器類是從移相器,編碼,提示7-7:發生在重新啓動狀態之後的所有武器類一致

Weapon.SingleBullet = function (game) { 

    console.log(game); 

    Phaser.Group.call(this, game, game.world, 'Single Bullet', false, true, Phaser.Physics.ARCADE); 

    this.nextFire = 0; 
    this.bulletSpeed = 600; 
    this.fireRate = 200; 

    for (var i = 0; i < 64; i++) 
    { 
     this.add(new Bullet(game, 'bullet5'), true); 
    } 

    return this; 

}; 

Weapon.SingleBullet.prototype = Object.create(Phaser.Group.prototype); 
Weapon.SingleBullet.prototype.constructor = Weapon.SingleBullet; 

Weapon.SingleBullet.prototype.fire = function (source) { 
    //Here occurs the problem, because this.game is null after restarting the state 
    if (this.game.time.time < this.nextFire) { return; } 

    var x = source.x + 50; 
    var y = source.y + 15; 

    this.getFirstExists(false).fire(x, y, 0, this.bulletSpeed, 0, 0); 

    this.nextFire = this.game.time.time + this.fireRate; 

}; 

的問題。

回答

0

create開始 - weapons之前的方法填滿了,我忘了清空數組。有趣的是:我試圖清空陣列之前,它不工作。當我登錄weapons的長度時,它突然開始按預期工作。也許原因是JavaScript引擎做出的一個奇怪的優化。

相關問題