Jump to content

OnComplete with tween(sprite.scale)


Recommended Posts

eat_candy: function(player, candy){  if(candy.flag){    candy.flag = false;    console.log("candy eaten");    this.score += candy.scale.x*10;    this.label_score.content = this.score;    this.add.tween(candy.scale)      .to({ x: 0, y: 0}, 2000, Phaser.Easing.Linear.None)      .start()      .onComplete.add(this.kill_candy, this);   }},kill_candy: function(candy){  console.log(candy);  candy.kill();  console.log("killed");},



It's my first post in this forum, I usually read the answer to resolve my problems but this time I didn't find anything about my problem.


When using tween(candy.scale) to tween the scale of my sprite, I'm not able to get my candy object on the function kill_candy() called by onComplete.add()


My console.log(candy) return me a Phaser.point object and not a Phaser.sprite and I cannot call kill() on it

Is it possible to get the candy object in the kill_candy() function ?


Thank you

Link to comment
Share on other sites


you have at least two possibilities.


1. Pass reference of candy and not 'this' when you add the callback.

eat_candy: function(player, candy){  if(candy.flag){    //...    this.add.tween(candy.scale)      .to({ x: 0, y: 0}, 2000, Phaser.Easing.Linear.None)      .start()      //.onComplete.add(this.kill_candy, this);      //pass candy not this      .onComplete.add(this.kill_candy, candy);   }},kill_candy: function(point){  console.log(this); //this points to candy as you created the callback with a reference of candy and not this (which would be the state, game or whatever)  this.kill();  console.log("killed");}, 

By the way: onComplete calls your registered callback method with the tweened object as the only parameter. In your case this is the scale object (candy.scale) which is a Phaser.Point instance. That's the reason why you do not get the object reference itself passed.


2. I guess Candy is s simple Phaser.Sprite ? You could create your own class inherited from Phaser.Sprite

This class would always know about itself and you can happily kill or do whatever you want in the callback.

Example for such a class:

//Class definitionCandy = function(game,x,y){  Phaser.Sprite.call(this, game,0,0, 'balls', 0);}Candy.prototype = Object.create(Phaser.Sprite.prototype);Candy.prototype.constructor = Candy;//define two methods eat and the callback (afterEat)Candy.prototype.eat= function(){  tween = this.game.add.tween(this.scale).to( { x:0, y:0 }, 1500)  tween.onComplete.add(this.afterEat, this)  tween.start()}Candy.prototype.afterEat= function(){  console.log('i've been eaten', this) //this points to the instance of candy    //now you could trigger events or signals to notify the outer world  //that you have been eaten.}//Later in your code:candy = new Candy(game)game.world.add(candy) //or another groupc.eat()
Link to comment
Share on other sites

Thank you for your answer, I found another method before seeing your response

var a = this.add.tween(candy.scale)			.to({ x: 0, y: 0}, 2000, Phaser.Easing.Linear.None)			.start();	        a.onComplete.add(function(){candy.kill(); console.log("killed");});

Calling the candy.kill() directly in a function inside onComplete.add worked for me

Link to comment
Share on other sites


  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Create New...