ActivePointer 位置未更新

ActivePointer location not updating

我正在使用 Phaser(最新版本)制作横向卷轴器,我希望玩家的射弹在玩家点击时朝向指针,就像他们在本例中所做的那样 http://phaser.io/examples/v2/games/tanks。我使用了示例中的一些代码,但在我的游戏中,activePointer x 和 y 坐标似乎只在游戏开始时初始化并且永远不会改变。所以当玩家射击时,它总是朝向相同的坐标。

我有以下代码(请注意,我删除了一些关于物品收集、敌人等的信息,以便在此处发布):

var SideScroller = SideScroller || {};

var startPosX = 100;
var startPosY = 300;

var shooter;

var playerBullets;
var nextFire = 0;
var fireRate = 100;
var cursors;
var currentLoc;

SideScroller.Game = function () {};

SideScroller.Game.prototype = {

    create: function () {

        //create player
        //params = (game, startPositionX,startPositionY, key, frame)
        this.player = this.game.add.sprite(startPosX, startPosY, 'player');

        //get canvas width and height for later use
        canvasWidth = this.game.canvas.width;
        canvasHeight = this.game.canvas.height;

        //create enemy
        var x = this.game.rnd.between(80, this.game.world.width);
        var y = this.game.rnd.between(0, 113);

        //  Point to shoot projectiles from
        // allows rotation, if this had been done on the player object, the graphic would have rotated, which we don't want
        this.shooter = this.game.add.sprite(startPosX, startPosY, 'blank');
        this.shooter.anchor.setTo(0.5, 0.5);

        //make a group of player projectiles
        playerBullets = this.game.add.group();
        playerBullets.enableBody = true;
        playerBullets.physicsBodyType = Phaser.Physics.ARCADE;
        playerBullets.createMultiple(1000, 'peePower');

        playerBullets.setAll('anchor.x', 0.5);
        playerBullets.setAll('anchor.y', 0.5);
        playerBullets.setAll('outOfBoundsKill', true);
        playerBullets.setAll('checkWorldBounds', true);

        //enable physics on the player
        this.game.physics.arcade.enable(this.player);

        //bring player shooting point to the top (not totally necessary)
        this.shooter.bringToTop();

        //player gravity
        this.player.body.gravity.y = gravity;

        //player collides with all four edges of the game world
        this.player.body.collideWorldBounds = true;

        this.player.anchor.setTo(0.5, 0.5);

        //the camera will follow the player in the world
        this.game.camera.follow(this.player);

        //move player with cursor keys
        cursors = this.game.input.keyboard.createCursorKeys();
    },

    update: function () {
        currentLoc = this.game.input.activePointer;
        //collision between player and platforms
        this.game.physics.arcade.collide(this.player, this.blockedLayer, null, null, this);

        //make co-ordinates match
        this.shooter.x = this.player.x;
        this.shooter.y = this.player.y;

        //this.shooter's angle towards
        this.shooter.rotation = this.game.physics.arcade.angleToPointer(this.shooter, this.game.input.activePointer);

        //only respond to keys if the player is alive
        if (this.player.alive) {
            this.player.body.velocity.x = 0;

            if (this.game.input.activePointer.isDown) {
                console.log("pointer is down");
                this.fire();
            }
            else if (cursors.right.isDown) {
                this.playerForward();
            }   
            else if (cursors.left.isDown) {
                this.playerBack();
            }
            else if (cursors.up.isDown) {
                this.playerJump();
            } 
            else if (cursors.down.isDown) {
                this.fire();
                this.playerDuck();
            }            
        }
    },

    fire: function () {    
        //for debugging
        console.log("fire was called");
        console.log(this.game.input.activePointer.x);
        console.log(this.game.input.activePointer.y);

        if (this.game.time.now > nextFire && playerBullets.countDead() > 0)
        {
            nextFire = this.game.time.now + fireRate;
            var bullet = playerBullets.getFirstExists(false);
            bullet.reset(this.shooter.x, this.shooter.y);

            currentLoc = this.game.input.activePointer;
            bullet.rotation = this.game.physics.arcade.moveToPointer(bullet, 1000, currentLoc, 1000);

            console.log(this.game.input.activePointer);
        }

    },
    playerForward: function () {
        this.player.loadTexture('player');
        this.player.body.setSize(this.player.standDimensions.width, this.player.standDimensions.height);
        this.player.body.velocity.x = 700;
        this.player.isMoving = true;
        //console.log("Forward height:" + this.player.standDimensions.height);
        //console.log("Forward width:" + this.player.standDimensions.width);  
    },

    playerBack: function () {
        this.player.loadTexture('playerBack');
        this.player.body.velocity.x -= 700;
        this.player.isMoving = true;
    },

    playerJump: function () {
        if (this.player.body.blocked.down) {
            this.player.body.velocity.y -= 700;
            this.player.loadTexture('playerJump');
            //console.log("Jump height:" + this.player.jumpDimensions.height);
            //console.log("Jump width:" + this.player.jumpDimensions.width);    
        }
    },

    playerDuck: function () {
        //change image and update the body size for the physics engine
        this.player.loadTexture('playerDuck');
        this.player.body.setSize(this.player.duckedDimensions.width, this.player.duckedDimensions.height); 

        //keep track of whether player is ducked or not
        this.player.isDucked = true;
    },

    playerDead: function () {
        //set to dead (this doesn't affect rendering)
        this.player.alive = false;

        //stop moving to the right
        this.player.body.velocity.x = 0;

        //change sprite image
        this.player.loadTexture('playerDead');

    },

};

Shooter 是玩家上方的空白精灵(很像坦克示例中的炮塔),允许在玩家不旋转的情况下进行旋转(如果有更好的方法,请告诉我!)。

我尝试将更新方法中的 currentLoc 变量更新到 activePointer 位置,但这没有用。

此外,这个条件从未被命中:

if (this.game.input.activePointer.isDown) {
    console.log("pointer is down");
    this.fire();
}

所以一定是检测鼠标点击出了问题,我不知道这是否是问题的一部分?

我认为你应该在 API 中查找它。您的代码中有几点值得怀疑。 http://phaser.io/docs/2.3.0/Phaser.Pointer.html http://phaser.io/docs/2.3.0/Phaser.Physics.Arcade.html#moveToPointer

关键是你实际上是在给指针(到 currentLoc)而不是位置的引用。所以它应该总是触发到 0;0.

而对于isDown检测,你是在update函数里做的还是在别的什么地方做的?

希望能帮到你!