Javascript 如何在Phaser 3中移动相同距离的一组对象?

Javascript 如何在Phaser 3中移动相同距离的一组对象?,javascript,arrays,game-physics,phaser-framework,Javascript,Arrays,Game Physics,Phaser Framework,我在Phaser有场比赛。当一支箭在游戏中发射时,它会被推到一个阵列上。箭射中目标,目标在下一支箭发射前向后移动。如果这没有意义,那么已经固定在目标上的箭头需要在目标移动时与目标一起移动 我尝试了移动数组的x值,并尝试在数组中循环。我也尝试过移动this.arrows变量 代码 函数更新() { //声明用于移动的常量 常数=1500; this.player.setDrag(2000); //球员的轮换 if(this.cursors.up.isDown&&this.player.ang

我在Phaser有场比赛。当一支箭在游戏中发射时,它会被推到一个阵列上。箭射中目标,目标在下一支箭发射前向后移动。如果这没有意义,那么已经固定在目标上的箭头需要在目标移动时与目标一起移动

我尝试了移动数组的x值,并尝试在数组中循环。我也尝试过移动
this.arrows
变量

代码

函数更新()
{   
//声明用于移动的常量
常数=1500;
this.player.setDrag(2000);
//球员的轮换
if(this.cursors.up.isDown&&this.player.angle>-45){
this.player.angle-=angleModifier;}
if(this.cursors.down.isDown&&this.player.angle<0){
this.player.angle+=angleModifier;}
//用空格键射击
if(移相器.输入.键盘.JustDown(这个.空格键)){
//拍摄动画
这个.player.anims.play('shoot',true);
//射箭
设arrow=this.physics.add.sprite(this.player.x,(this.player.y+20),'arrow');
//确保箭头有一个点击框
arrow.enableBody=true;
//让箭头移动
arrow.body.immoved=false;
//编辑箭头点击框
箭头。设置大小(50,15)。设置偏移(5,50);
arrow.setGravityY(3600);//重力会影响箭头
//箭速
arrow.setVelocityX(arrowMoveAmt);
arrow.setVelocityY((this.player.angle*50));
this.arrows.push(arrow);//将arrow添加到先前创建的数组中
this.arrowSound.play();//播放声音
//重置角度修改器以增加难度
angleModifier=(Math.random()+.1)*2;
}
else if(target.body.toucting.left){
//循环变量
设i=0;
//确定新奖牌的初始位置
设firstMedalX=180;
//循环以创建多个箭头
而(i
我找到了一个解决方案:

  • 首先,从
    循环中删除以下代码块
  • 第二步,在
    循环中,在
    中添加这一行
  • 第三个,在
    循环的结束括号之后,添加以下代码:
请参考
update()
方法的完整代码片段:

function update ()
{   
    //Declare constants for movement
    const arrowMoveAmt = 1500;
    this.player.setDrag(2000);

    //Rotation of the player
    if (this.cursors.up.isDown && this.player.angle > -45) {
        this.player.angle -= angleModifier;}

    if (this.cursors.down.isDown && this.player.angle < 0) {
        this.player.angle += angleModifier;}

    //Shooting with the spacebar
    if (Phaser.Input.Keyboard.JustDown(this.spacebar)) {

        //Animate the shooting
        this.player.anims.play('shoot', true);

        //Arrow shooting
        let arrow = this.physics.add.sprite(this.player.x, (this.player.y + 20), 'arrow');

        //Make sure the arrow has a hitbox
        arrow.enableBody = true;
        //Let the arrow move
        arrow.body.immovable = false;
        //Edit arrow hitbox 
        arrow.setSize(50, 15).setOffset(5, 50);

        arrow.setGravityY(3600); //Gravity will affect the arrows
        //Arrow speeds
        arrow.setVelocityX(arrowMoveAmt);
        arrow.setVelocityY((this.player.angle * 50));

        this.arrows.push(arrow); //Add arrow to the array created earlier

        this.arrowSound.play(); //Play the sound

        //Reset the angle modifier for added difficulty
        angleModifier = (Math.random() + .1) * 2;
    }

    else if(target.body.touching.left) {

        //Variable for loop
        let i = 0;

        //Set initial position of new medals
        let firstMedalX = 180;

        //Loop to create multiple arrows
        while (i < this.arrows.length) {
            newArrows = this.arrows[i];
            newArrows.setGravityY(0);
            newArrows.setVelocityX(0);
            newArrows.setVelocityY(0);

            //Add 30 to the new medal's x position
            firstMedalX += 40;

            //Increment for every arrow shot
            i++;

            //Reset the player angle for difficulty
            this.player.angle = 0;

            // Move the arrows
            newArrows.x += 10

        }

        //Move the target
        target.x += 10;

        //Call the function to determine medal and pass the variable
        if(this.arrows.length <= 5) {
            //Only track the first five arrows
            getMedal(firstMedalX);
        }
    }

    //Function to decide medal, and where it goes
    getMedal = (value) => {
        //Gold medal
        if (410 < newArrows.y && newArrows.y < 435) {
            this.add.image(value, 175, 'gold_medal');
            score += 5;
        }
        //Silver medal
        else if (395 < newArrows.y && newArrows.y < 450) {
            this.add.image(value, 175, 'silver_medal');
            score += 3;
        }
        //Bronze medal
        else if (380 < newArrows.y && newArrows.y < 460) {
            this.add.image(value, 175, 'bronze_medal');
            score += 1;
        }
        else {
            this.add.image(value, 175, 'no_medal');
        }
        //Set the scoreboard to the new score
        scoreBoard.setText('SCORE: ' + score);
    }
}
函数更新()
{   
//声明用于移动的常量
常数=1500;
this.player.setDrag(2000);
//球员的轮换
if(this.cursors.up.isDown&&this.player.angle>-45){
this.player.angle-=angleModifier;}
if(this.cursors.down.isDown&&this.player.angle<0){
this.player.angle+=angleModifier;}
//用空格键射击
if(移相器.输入.键盘.JustDown(这个.空格键)){
//拍摄动画
这个.player.anims.play('shoot',true);
//射箭
设arrow=this.physics.add.sprite(this.player.x,(this.player.y+20),'arrow');
//确保箭头有一个点击框
arrow.enableBody=true;
//让箭头移动
arrow.body.immoved=false;
//编辑箭头点击框
箭头。设置大小(50,15)。设置偏移(5,50);
arrow.setGravityY(3600);//重力会影响箭头
//箭速
arrow.setVelocityX(arrowMoveAmt);
arrow.setVelocityY((this.player.angle*50));
this.arrows.push(arrow);//将arrow添加到先前创建的数组中
this.arrowSound.play();//播放声音
//重置角度修改器以增加难度
angleModifier=(Math.random()+.1)*2;
}
else if(target.body.toucting.left){
//循环变量
设i=0;
//确定新奖牌的初始位置
设firstMedalX=180;
//循环以创建多个箭头
而(i//Move the target
var x = target.x;
target.x += 10;
var x2 = target.x;
var arrowMove = x2 - x;
newArrows.x = newArrows.x + arrowMove;

console.log("Target X = " + target.x);
console.log("Arrows X = " + newArrows.x);
//Move the target
target.x += 10;
function update ()
{   
    //Declare constants for movement
    const arrowMoveAmt = 1500;
    this.player.setDrag(2000);

    //Rotation of the player
    if (this.cursors.up.isDown && this.player.angle > -45) {
        this.player.angle -= angleModifier;}

    if (this.cursors.down.isDown && this.player.angle < 0) {
        this.player.angle += angleModifier;}

    //Shooting with the spacebar
    if (Phaser.Input.Keyboard.JustDown(this.spacebar)) {

        //Animate the shooting
        this.player.anims.play('shoot', true);

        //Arrow shooting
        let arrow = this.physics.add.sprite(this.player.x, (this.player.y + 20), 'arrow');

        //Make sure the arrow has a hitbox
        arrow.enableBody = true;
        //Let the arrow move
        arrow.body.immovable = false;
        //Edit arrow hitbox 
        arrow.setSize(50, 15).setOffset(5, 50);

        arrow.setGravityY(3600); //Gravity will affect the arrows
        //Arrow speeds
        arrow.setVelocityX(arrowMoveAmt);
        arrow.setVelocityY((this.player.angle * 50));

        this.arrows.push(arrow); //Add arrow to the array created earlier

        this.arrowSound.play(); //Play the sound

        //Reset the angle modifier for added difficulty
        angleModifier = (Math.random() + .1) * 2;
    }

    else if(target.body.touching.left) {

        //Variable for loop
        let i = 0;

        //Set initial position of new medals
        let firstMedalX = 180;

        //Loop to create multiple arrows
        while (i < this.arrows.length) {
            newArrows = this.arrows[i];
            newArrows.setGravityY(0);
            newArrows.setVelocityX(0);
            newArrows.setVelocityY(0);

            //Add 30 to the new medal's x position
            firstMedalX += 40;

            //Increment for every arrow shot
            i++;

            //Reset the player angle for difficulty
            this.player.angle = 0;

            // Move the arrows
            newArrows.x += 10

        }

        //Move the target
        target.x += 10;

        //Call the function to determine medal and pass the variable
        if(this.arrows.length <= 5) {
            //Only track the first five arrows
            getMedal(firstMedalX);
        }
    }

    //Function to decide medal, and where it goes
    getMedal = (value) => {
        //Gold medal
        if (410 < newArrows.y && newArrows.y < 435) {
            this.add.image(value, 175, 'gold_medal');
            score += 5;
        }
        //Silver medal
        else if (395 < newArrows.y && newArrows.y < 450) {
            this.add.image(value, 175, 'silver_medal');
            score += 3;
        }
        //Bronze medal
        else if (380 < newArrows.y && newArrows.y < 460) {
            this.add.image(value, 175, 'bronze_medal');
            score += 1;
        }
        else {
            this.add.image(value, 175, 'no_medal');
        }
        //Set the scoreboard to the new score
        scoreBoard.setText('SCORE: ' + score);
    }
}