Problem with physics.moveToObject, object go out

hi,

When i use this example :

I click and the sprite go the position.

But when i do the same with a window.setTimeOut the sprite go out my target…why ?
Thanks for your help.

Below the snippet.

var config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    parent: 'phaser-example',
    physics: {
        default: 'arcade'
    },
    scene: {
        preload: preload,
        create: create,
        update: update
    }
};  

var debug;
var source;
var target={}
var distanceText;

new Phaser.Game(config);

function preload ()
{
    this.load.image('flower', 'assets/sprites/flower-exo.png');
}

function create ()
{
    source = this.physics.add.sprite(100, 300, 'flower');

    debug = this.add.graphics();

    this.input.on('pointerdown', function (pointer) {
        console.log("on")

        target.x = pointer.x;
        target.y = pointer.y;
        
        // Move at 200 px/s:
        this.physics.moveToObject(source, target, 200);

        debug.clear().lineStyle(1, 0x00ff00);
        debug.lineBetween(0, target.y, 800, target.y);
        debug.lineBetween(target.x, 0, target.x, 600);

    }, this);

    distanceText = this.add.text(10, 10, 'Click to set target', { fill: '#00ff00' });
    window.setTimeout(()=>{
        let target={}
        target.x = 100
        target.y = 100
                this.physics.moveToObject(source, target, 200);
                console.log(target.y)

    },5000)
}

function update ()
{
    var distance = Phaser.Math.Distance.Between(source.x, source.y, target.x, target.y);

    if (source.body.speed > 0)
    {
        distanceText.setText('Distance: ' + distance);

        //  4 is our distance tolerance, i.e. how close the source can get to the target
        //  before it is considered as being there. The faster it moves, the more tolerance is required.
        if (distance < 4)
        {
            source.body.reset(target.x, target.y);
        }
    }
}

hi,

Nobody ?

I made a jsfiddle to prove my bug:

the first window.setTimeout don’t works and the second with 5000ms works perfectly and however the code is the same…could you tell me where is the mistake ?

var config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    parent: 'phaser-example',
    physics: {
        default: 'arcade'
    },
    scene: {
        preload: preload,
        create: create,
        update: update
    }
};  

var debug;
var source;
var target={}
var distanceText;
    var to={}

new Phaser.Game(config);

function preload ()
{
    this.load.image('flower', 'assets/sprites/flower-exo.png');
}

function create ()
{
    source = this.physics.add.sprite(100, 300, 'flower');

    debug = this.add.graphics();

    this.input.on('pointerdown', function (pointer) {
        console.log("on")

        target.x = pointer.x;
        target.y = pointer.y;
        
        // Move at 200 px/s:
        this.physics.moveToObject(source, target, 200);

        debug.clear().lineStyle(1, 0x00ff00);
        debug.lineBetween(0, target.y, 800, target.y);
        debug.lineBetween(target.x, 0, target.x, 600);


    }, this);

    distanceText = this.add.text(10, 10, 'Click to set target', { fill: '#00ff00' });
    window.setTimeout(()=>{
            // let target={}
            target.x = 100
            target.y = 100
            this.physics.moveToObject(source, target, 200);
    },5000)

    window.setTimeout(()=>{
            to.x =200
            to.y =200
            this.physics.moveToObject(source, to, 200);
    },1500)
}

function update ()
{
    var distance = Phaser.Math.Distance.Between(source.x, source.y, target.x, target.y);

    if (source.body.speed > 0)
    {
        distanceText.setText('Distance: ' + distance);

        //  4 is our distance tolerance, i.e. how close the source can get to the target
        //  before it is considered as being there. The faster it moves, the more tolerance is required.
        if (distance < 4)
        {
            source.body.reset(target.x, target.y);
        }
    }
}

really nobody about that ?

always nobody please ?

Hi @espace,
To stop the object you have to calc the distance between the object and the target:

var distance = Phaser.Math.Distance.Between(source.x, source.y, target.x, target.y);

And then reset the object position when the distance is almost 0:

if (distance < 4)
        {
            source.body.reset(target.x, target.y);
        }

In your first post, the target variable declared in setTimeout function is not the same than in the update function, and in your second post, the distance between source and to is never calculated.

Hi @jjcapellan,

Sometimes we don’t see the stupid thing that keeps you from moving forward and I do.

Thanks for your light.