BdR Posted September 30, 2014 Share Posted September 30, 2014 Okay, here is a tough question I think. I'm working on a endless-runner game with one player and some enemies. When the game is over, the player's function kill() is called, and for any left over enemy kill() is also called. Then I start a new game, I revive() the same player object and in the onRevive its position is reset to the upper half of the screen. Enemies are also revive() and repositioned in the bottom half of the screen and the game restarts. The problem is that sometimes the player hits an enemies instantly at the very first frame of the new game. To find out what is happening, I added two console.log output inside the overlap hit handler function: player overlaps enemy ==> player.x,y=402,116 gameobj.x,y=240,620 player overlaps enemy ==> player.body.x,y->w,h=127,383->32,32 gameobj.body.x,y->w,h=64,347->64,64 The first line outputs the player/enemy position, the second shows the player.body position. It looks like the positions are reset to the correct positions, however their respective .body objects aren't. The .body x,y position still contain values from the previous game, as the enemies are recycled from a pool. And the body elements are infact overlapping so that's why the overlap handler is called. I tried calling the .update() function of each sprite directly after it is revived, but that didn't work. Can anyone point me in the right direction to fix this? Link to comment Share on other sites More sharing options...
J_Wotoo Posted September 30, 2014 Share Posted September 30, 2014 Could you post the OnRevive() function? Link to comment Share on other sites More sharing options...
BdR Posted October 1, 2014 Author Share Posted October 1, 2014 Btw when the game is over and then restarted, it stays in the same "state", I mean it doesn't state.start or someting. At game over, a "restart" button is made visible, and pressing that calls some functions that restart the game. The enemy pool is reused, and the player object is reused. Anyway this is the revive code:// en is a collection of enemy layout/start positionsfor (var i = 0; i < en.length; i++){ // get position or else random position var x = en[i].x; var y = en[i].y + yLevelOffset; // get inactive gameobj from gameobjs object pool var newobj = this._objGroup.getFirstDead(); // if there aren't any available, create a new one if (newobj === null) { newobj = new GameObj(this.game, x, y); this._objGroup.add(newobj); }; // else revive the newobj (set it's alive property to true) newobj.revive(); // set values newobj.init(en[i].objname, x, y, en[i].movetype, en[i].radius, en[i].angle); // TESTING!! console.log('spawnLevelPart -> initnew name='+en[i].objname+' x='+x+' y='+y);}; Link to comment Share on other sites More sharing options...
j0hnskot Posted October 1, 2014 Share Posted October 1, 2014 Did you try sprite.reset()? It resets the physics body as well so it may solve your problem. Link to comment Share on other sites More sharing options...
BdR Posted October 3, 2014 Author Share Posted October 3, 2014 Did you try sprite.reset()? It resets the physics body as well so it may solve your problem. Excellent thanks, that did the trick. Btw I now use sprite.reset(x, y) but the documentation says it expects 3 parameters sprite.reset(x, y, health) I don't use the health so I guess that doesn't matter.. Link to comment Share on other sites More sharing options...
j0hnskot Posted October 4, 2014 Share Posted October 4, 2014 Health got the tag "optional". Not passing an argument there is ok if you don't need it. Link to comment Share on other sites More sharing options...
Recommended Posts