Aperosuz Posted May 26, 2016 Share Posted May 26, 2016 Hi Guys, I'm working on my first game with Phaser.io and i have a problems with my collisions. Quickly, i have enemies that spawning around me and shot on me, and with my player i need to return their bullet on their face. But the collision between the bullet and the enemies don't work, (actually, my bullet and my enemy overlaped when the game start so i activate my collide function between them when the bullet hit my player, each time the bullet is returned but she don't destroy the enemy) that part is in my update and it's my collide checking between shield and bullet. if(this.game.physics.arcade.collide(this.shield, this.bulletPool, this.Reditum)) { console.log("collide shield/bullet"); this.game.physics.arcade.collide(this.enemy, this.bullet, this.backSuccess); //this.game.physics.arcade.collide(this.RedPool, this.bullet, this.backSuccess); } And here my function backSuccess, but my code never go inside this function. backSuccess: function(enemy, bullet){ console.log('renvoi fctionnel'); this.enemy = enemy; this.bullet = bullet; this.enemy.kill(); this.bullet.kill(); this.score += 10; }, Any one have an idea please ? Thank you very much Link to comment Share on other sites More sharing options...
Tom Atom Posted May 26, 2016 Share Posted May 26, 2016 Hi, you are checking collision shield vs. bullet every frame. If this collision happen, you are, immediately in the same frame, testing collision between this bullet and enemy. In oher words, you are checking if in particular frame both collisions: shield vs. bullet and bullet vs. enemy happen. If I were in your place, I would create 2 Phaser.Groups - one for enemy bullets and second for repeled bullets. I would put bullets shoot by enemies into first group and in update I would check collision shield vs. whole enemy bullets group. If there is collision (bullet is repeled), then I would move it into group of repeled bullets. My second (independent, not based on result of first check) check in update would be for collisions between enemies and repeled bullets group. Link to comment Share on other sites More sharing options...
Aperosuz Posted May 26, 2016 Author Share Posted May 26, 2016 Cheers man, I will try this one. i have to create the group in my "Create" and I add the bullet as a child in my "update" no ? Link to comment Share on other sites More sharing options...
Tom Atom Posted May 26, 2016 Share Posted May 26, 2016 Yes, do your scene setup in create. You can also create objects during run in update ... or you can optimize and create some pool of bullets in create and during run only take free bullet from pool and return it back. Link to comment Share on other sites More sharing options...
Aperosuz Posted May 27, 2016 Author Share Posted May 27, 2016 Ok because i created my group in create and i make in my update. this.oldgroup.remove(this.bullet) / this.newgroup.add(this.bullet) but that say 'a is undifined' in my phaser file .... (and in the lane this.newgroup.add(this.bullet) ) ... But i don't understand why Link to comment Share on other sites More sharing options...
Aperosuz Posted May 30, 2016 Author Share Posted May 30, 2016 someone know why ? i created my new group exactly in the same way that the first one Link to comment Share on other sites More sharing options...
3ddy Posted May 30, 2016 Share Posted May 30, 2016 You should probably copy us part of code regarding those groups and give exact error message with specific line. You wrote that error is 'a is undefined' but there is no 'a' in two commands you wrote. Or this 'a' error comes from phaser.js? Link to comment Share on other sites More sharing options...
Aperosuz Posted May 30, 2016 Author Share Posted May 30, 2016 Yes sorry 3ddy, here it's my code and my error is in phaser.min.js setupBullets: function () { this.nbrbullet = 100; // Add an empty sprite group into our game this.bulletPool = this.add.group(); // Enable physics to the whole sprite group this.bulletPool.enableBody = true; this.bulletPool.physicsBodyType = Phaser.Physics.ARCADE; this.bulletPool.createMultiple(this.nbrbullet, 'bullet'); // Sets anchors of all sprites this.bulletPool.setAll('anchor.x', 0.5); this.bulletPool.setAll('anchor.y', 1); // Automatically kill the bullet sprites when they go out of bounds //this.bulletPool.setAll('outOfBoundsKill', true); //this.bulletPool.setAll('checkWorldBounds', true); this.nextShotAt = 500; }, setupBulletreturn: function () { this.nbrreturnbullet = 1; this.bulletreturnPool = this.add.group(); this.bulletreturnPool.enableBody = true; this.bulletreturnPool.physicsBodyType = Phaser.Physics.ARCADE; //this.bulletPool.createMultiple(this.nbrreturnbullet, 'bullet'); this.bulletreturnPool.setAll('anchor.x', 0.5); this.bulletreturnPool.setAll('anchor.y', 1); }, My two groups called in 'Create', and a part of my update: if(this.game.physics.arcade.collide(this.shield, this.bulletPool)) { console.log("collide shield/bullet"); this.bulletPool.removeChild(this.bullet); var lastbullet = this.bullet; this.bulletreturnPool.addChild(lastbullet); } And my error is : Quote TypeError: a is undefined phaser.min.js:6:31418 b.DisplayObjectContainer.prototype.addChildAt() phaser.min.js:6 b.DisplayObjectContainer.prototype.addChild() phaser.min.js:6 redi.Game2.prototype.update() Game2.js:64 c.StateManager.prototype.update() phaser.min.js:10 c.Game.prototype.updateLogic() phaser.min.js:12 c.Game.prototype.update() phaser.min.js:12 c.RequestAnimationFrame.prototype.updateRAF() phaser.min.js:18 c.RequestAnimationFrame.prototype.start/this._onLoop() phaser.min.js:18 Game2.js: 64 is my lane "this.bulletreturnPool.addChild(lastbullet);" I hope someone will find a solution. Or if someone know an other way to ensure that my bullet could destroy his own canon after impact on my shield, I'm interested ! Thank you for your help. I Link to comment Share on other sites More sharing options...
Tom Atom Posted May 31, 2016 Share Posted May 31, 2016 Hi, first, you can set your return group simply like this: this.bulletreturnPool = this.add.group(); all physics properties are already set on level of every single bullet. You just need container (group) to store them. Think of groups in your case just like scene graph/tree nodes and what you need is just move bullets from group to group - organize them (but not setup anymore as you did all setup in create method). Secondly, your code in update does not make sense. Calling collide retruns treu / false and just says: "yes, there is collision" or: "no, there is not collision" - good if you want to know if your player touched ANY from (for example) deadly lava sprites and you are not interested in details. Your call does not set tihs.bullet and it probably remains in its initial state - undefined - causing that error. In your case you need to know which bullet collided. So, you have to add callbacks to method call - look at this example: http://phaser.io/examples/v2/arcade-physics/sprite-vs-group (line 43). There is added callback for collision which will be called when collision happens and it will be called with parameters, that say which two bodies collided. Inside callback you will know which bullet collided and you can move it into another group. drhayes 1 Link to comment Share on other sites More sharing options...
Recommended Posts