2016-05-09 11 views
2

移動オブジェクトの衝突が機能していません。私はあなたがそれを見ることができ、すべてのコードとすべてが含まれている私の問題を見ることができるようにデモを作成しました。移動オブジェクトの衝突Phaser

左から右に2つのブロックがあり、タンクショット撮影があります>すべての方向で試してみましたが、いつも同じ結果が得られます。 zipファイルの例ではブロック値の速度は300pxまでしか動作しません。ブロックの速度に応じて、ブロックの速度をより大きい値に変更すると、衝突は同じ数のピクセルで機能します。それは本当に奇妙です。

私はちょうどすべてを間違ってやっているのか、それとも私の問題があるのだろうと思っていましたか?私はこの問題を解決するのに役立つ指針やアイディアを感謝します。ありがとう。

Demo source code

BasicGame.Game = function (game) { 

    // When a State is added to Phaser it automatically has the following properties set on it, even if they already exist: 

    this.game;  // a reference to the currently running game (Phaser.Game) 
    this.add;  // used to add sprites, text, groups, etc (Phaser.GameObjectFactory) 
    this.camera; // a reference to the game camera (Phaser.Camera) 
    this.cache;  // the game cache (Phaser.Cache) 
    this.input;  // the global input manager. You can access this.input.keyboard, this.input.mouse, as well from it. (Phaser.Input) 
    this.load;  // for preloading assets (Phaser.Loader) 
    this.math;  // lots of useful common math operations (Phaser.Math) 
    this.sound;  // the sound manager - add a sound, play one, set-up markers, etc (Phaser.SoundManager) 
    this.stage;  // the game stage (Phaser.Stage) 
    this.time;  // the clock (Phaser.Time) 
    this.tweens; // the tween manager (Phaser.TweenManager) 
    this.state;  // the state manager (Phaser.StateManager) 
    this.world;  // the game world (Phaser.World) 
    this.particles; // the particle manager (Phaser.Particles) 
    this.physics; // the physics manager (Phaser.Physics) 
    this.rnd;  // the repeatable random number generator (Phaser.RandomDataGenerator) 

    // You can use any of these from any function within this State. 
    // But do consider them as being 'reserved words', i.e. don't create a property for your own game called "world" or you'll over-write the world reference. 

    this.bulletTimer = 0; 

}; 

BasicGame.Game.prototype = { 

    create: function() { 

          //Enable physics 

// Set the physics system 
      this.game.physics.startSystem(Phaser.Physics.ARCADE); 


     //End of physics 


     // Honestly, just about anything could go here. It's YOUR game after all. Eat your heart out! 

     this.createBullets(); 
     this.createTanque(); 

     this.timerBloques = this.time.events.loop(1500, this.createOnebloque, this); 

    }, 

    update: function() { 


     if(this.game.input.activePointer.isDown){ 
      this.fireBullet(); 
     } 

     this.game.physics.arcade.overlap(this.bullets, this.bloque, this.collisionBulletBloque, null, this); 

    }, 

    createBullets: function() { 

    this.bullets = this.game.add.group(); 
    this.bullets.enableBody = true; 
    this.bullets.physicsBodyType = Phaser.Physics.ARCADE; 
    this.bullets.createMultiple(100, 'bulletSprite'); 
    this.bullets.setAll('anchor.x', 0.5); 
    this.bullets.setAll('anchor.y', 1); 
    this.bullets.setAll('outOfBoundsKill', true); 
    this.bullets.setAll('checkWorldBounds', true); 


    }, 

    fireBullet: function(){ 

    if (this.bulletTimer < this.game.time.time) { 
      this.bulletTimer = this.game.time.time + 1400; 
      this.bullet = this.bullets.getFirstExists(false); 
     if (this.bullet) { 
      this.bullet.reset(this.tanque.x, this.tanque.y - 20); 
      this.game.physics.arcade.enable(this.bullet); 
     this.bullet.enableBody = true; 
      this.bullet.body.velocity.y = -800; 
      } 
     } 

    }, 

    createOnebloque: function(){ 


     this.bloquecs = ["bloqueSprite","bloquelSprite"]; 
     this.bloquesr = this.bloquecs[Math.floor(Math.random()*2)]; 
     this.bloque = this.add.sprite(0, 360, this.bloquesr); 
     this.game.physics.arcade.enable(this.bloque); 
     this.bloque.enableBody = true; 
     this.bloque.body.velocity.x = 300; 
     this.bloque.body.kinematic = true; 
     this.bloque.checkWorldBounds = true; 
     this.bloque.outOfBoundsKill = true; 
     this.bloque.body.immovable = true; 

    }, 

     createTanque: function() { 

     this.tanqueBounds = new Phaser.Rectangle(0, 600, 1024, 150); 

     this.tanque = this.add.sprite(500, 700, 'tanqueSprite'); 
     this.tanque.inputEnabled = true; 
     this.tanque.input.enableDrag(true); 
     this.tanque.anchor.setTo(0.5,0.5); 
     this.tanque.input.boundsRect = this.tanqueBounds; 


    }, 

     collisionBulletBloque: function(bullet, bloque) { 


     this.bullet.kill(); 

    }, 


    quitGame: function (pointer) { 

     // Here you should destroy anything you no longer need. 
     // Stop music, delete sprites, purge caches, free resources, all that good stuff. 

     // Then let's go back to the main menu. 
     this.state.start('MainMenu'); 

    } 

}; 
+0

読みやすくするために段落を区切ることができます。また、あなたのコードをここに掲載する方が良いでしょう。 –

+0

コードを投稿しようとしましたが、あまりにも多く、残念です。( – Rafahc

+0

コードを入力すると管理されますが、これは主に私の全デモです – Rafahc

答えて

1

コードは間違いなく助けになりますが、実際にゲームをプレイするだけで何が起こっているのかを実際に知ることができます。

ブロックが進行中であるとき、中央のブロックの右端に当たって発射すると、実際に弾丸が消えることがあります。

何が起こっているのは、弾丸とブロックの衝突をチェックしていますが、左側の画面に新しいブロックを追加するたびにブロックが再定義されるということです。

ブロックプール(たとえばbloquePool)を作成することは、弾丸プール(bulletsと呼んでいます)でcreateBulletsに行っているのとほぼ同じです。

次に、箇条書きのグループとブロックのグループの衝突を確認します。

this.game.physics.arcade.overlap(
    this.bullets, this.bloquePool, this.collisionBulletBloque, null, this 
); 

あなたは、個々の弾丸とあなたがいるように、あなたはまだ弾丸を殺すことができるcollisionBulletBloqueに渡さ衝突し、個々のブロックを取得する必要があります。

+0

ありがとうございますどうして私はあなたに感謝の男の前にそれを試しませんでしたか?)、今夜試して更新します。 – Rafahc

+0

私はそれらをグループ化するときに、グループと一緒に遊んでいますが、画像は小さな黒いボックスとしてのみ表示されます。 – Rafahc

+0

ブラウザでコンソールをプルアップすると、エラーが表示されますか?画像が読み込まれていないように聞こえますが、色はオフです。新しいグループに追加されたオブジェクトが正しく作成されていることを確認できます。 –

関連する問題