Phaser 2 确定哪个单元处于活动状态

Phaser 2 determining which unit is active

我有 3 个可点击对象。单击其中一个时,它将变为 'selected unit'。 我正在尝试为单位创建一些通用操作,例如移动到一个点。

在我的创建函数中,我初始化了单位,当一个单位被点击时 - 这应该变成 'selected unit' 这样我的移动和方向函数就适用于这个单位。但是,脚本无法识别哪个单元的意图,例如我收到此错误:

未捕获类型错误:无法读取未定义的 属性 'velocity'。

有没有办法使用变量来指示选定的用户并将其传递给函数?

window.onload = function() {
    
    var block_count   = 0;
    var block         = '';
    var selected_unit = '';
    var unit_clicked = 0;
    var tank1 = null;
    
    var game = new Phaser.Game(800, 600, Phaser.AUTO, '', { preload: preload, create: create, update: update, render: render});

    function preload () {
        game.load.image('block', 'block.png');
        game.load.image('tank1', 'tank.png');
        game.load.image('baddie', 'tank.png');
        game.load.image('mouse_btn', 'block.png');
        game.input.mouse.capture = true;
    }
            
    function create () {
        game.physics.startSystem(Phaser.Physics.ARCADE);
        
        mouse_btn = game.add.sprite(30,30, 'mouse_btn');
        mouse_btn.anchor.setTo(0.5, 0.5);
        
        
        //T1
        tank1 = game.add.sprite(30,30, 'tank1');
        initialise_player(tank1);
        game.physics.enable(tank1, Phaser.Physics.ARCADE);
        
        //T2
        tank2 = game.add.sprite(30,60, 'tank1');
        initialise_player(tank2);
        game.physics.enable(tank2, Phaser.Physics.ARCADE);
        
        game.world.setBounds(0, 0, 2000, 2000);
        game.camera.follow(tank1);
    }


            
    function update () {
    
        if(selected_unit == '') {
            mouse_btn.x = game.input.mousePointer.worldX
            mouse_btn.y = game.input.mousePointer.worldY
        }           
        
        if(game.input.activePointer.leftButton.isDown && block_count == 0 && unit_clicked == 0) {
            game.input.activePointer.leftButton.stop(event);
            block_count =1;
            block = game.add.sprite(game.input.mousePointer.worldX, game.input.mousePointer.worldY, 'block');
            game.physics.enable(block, Phaser.Physics.ARCADE);
            block.anchor.setTo(0.5, 0.5)
            lookAtObject(selected_unit, block, 0.005);
        }
        
        
        if(block.alive){
            game.physics.arcade.moveToObject(selected_unit, block, 260, 0)
        } else {
            console.log(selected_unit)
            selected_unit.body.velocity.x = 0;
            selected_unit.body.velocity.y = 0;
        }
        
        if(game.physics.arcade.collide(selected_unit, block)) {
            block_count--;
            block.kill();
        }
    }

    function render(){
        //console.log(game.physics.arcade.collide(tank1, block))
    }
    
    function lookAtObject(obj, target, rotspeed){
        var angle = Math.atan2(block.y - tank1.y, block.x - tank1.body.x);
        tank1.rotation = angle + game.math.degToRad(90);
    }

    function initialise_player(tank1){
      tank1.anchor.setTo(0.5, 0.5);
      tank1.inputEnabled = true;
      tank1.input.useHandCursor = true;
      tank1.events.onInputDown.add(t1_clicked,this);
      tank1.events.onInputOver.add(t1_over, this)
      tank1.events.onInputOut.add(t1_out, this)
   }
    
  function t1_clicked() { 
    selected_unit = tank1;
}

function t1_over() { 
    unit_clicked = 1
}

function t1_out () { 
    unit_clicked = 0
}
    
};

您在初始加载时遇到的错误是因为在 update 中您假设 selected_unit 存在并且具有 body.

更新您的第三个 if 以确保 selected_unit 已定义。

if (selected_unit !== '') {
    selected_unit.body.velocity.x = 0;
    selected_unit.body.velocity.y = 0;
}

但是,更好的选择是将它放在几行下面,而不是在其中杀死块。

if(game.physics.arcade.collide(selected_unit, block)) {
    selected_unit.body.velocity.x = 0;
    selected_unit.body.velocity.y = 0;
    block_count--;
    block.kill();
}

if (block.alive)moveToObject 也期望 selected_unit 存在并且有一个 body,但情况可能并非如此;用支票包裹它。

if (selected_unit !== '') {
    game.physics.arcade.moveToObject(selected_unit, block, 260, 0)
}

现在允许 tank1 旋转以查看您刚刚放置的项目,但它不会移动它,直到它或 tank2 被点击。

这也指出,一般来说,您需要对代码进行一些调整,因为您忽略了传入的参数。例如,t1_clicked 不是t 使用被点击的 sprite,而是硬编码 tank1lookAtObject 没有使用 objtarget,但同样具有硬编码的值。

您可能想要更改的另一件事如下:

if(selected_unit == '') {
    mouse_btn.x = game.input.mousePointer.worldX
    mouse_btn.y = game.input.mousePointer.worldY
}           

如果您按照以下方式进行操作,您将不会在屏幕上出现额外的精灵。

if (block_count === 0) {
    mouse_btn.x = game.input.mousePointer.worldX;
    mouse_btn.y = game.input.mousePointer.worldY;
}