移相器,流体扫射(对角线输入)
Phaser, fluid strafing (diagonal input)
我一直在玩精灵,试图让它以我期望的方式扫射 - 毁灭战士风格。
所以问题是我可以设置精灵的角度,我使用 velocityFromRotation
相对于当前角度上下左右移动它。
到目前为止,太可爱了。
问题是我不能沿对角线移动,也就是说,我需要能够相对于精灵的角度同时向上和向左移动。
我有一个针对每个移动的函数,向上、向下、向左和向右 - 因为所有人都在使用 velocityFromRotation
,所以最后按下的键将覆盖第一个的移动。
据推测,我也可以简单地为每个对角线创建函数,尽管我不完全确定我将传递给 velocityFromRotation
方法的什么来实现这一点——但即使这样可行,它然后可能会阻止我使用模拟输入类型,因为对角线逻辑将被硬编码。我没有使用模拟输入,但我正在尝试将我的预制件构建为 'drop-in' 尽可能可重复使用。
这是我当前的代码:
Ship.prototype.moveForward = function() {
// Move the player up
this.game.physics.arcade.velocityFromAngle(this.angle - 90, this.speed, this.body.velocity);
}
Ship.prototype.moveBackward = function() {
this.game.physics.arcade.velocityFromAngle(this.angle + 90, this.speed, this.body.velocity);
}
Ship.prototype.bankLeft = function() {
// Move the player left
this.game.physics.arcade.velocityFromAngle(this.angle + 180, this.speed, this.body.velocity);
}
Ship.prototype.bankRight = function() {
// Move the player left
this.game.physics.arcade.velocityFromAngle(this.angle, this.speed, this.body.velocity);
}
没关系,我找到了。
对我来说,诀窍是记录精灵当前正在做什么,并在函数中进行检查以手动调整角度。
因此,我在我的更新函数中存储了一些变量 - 它们在各种移动函数中被覆盖:
this.movement.movingForward = false;
this.movement.movingBackward = false;
this.movement.moving = false;
那么我的运动函数是这样的:
// Player movement
Ship.prototype.moveForward = function() {
// Move the player up
this.game.physics.arcade.velocityFromAngle(this.angle - 90, this.speed, this.body.velocity);
this.movement.moving = true;
this.movement.movingForward = true;
}
Ship.prototype.moveBackward = function() {
// Move the player down
this.game.physics.arcade.velocityFromAngle(this.angle + 90, this.speed, this.body.velocity);
this.movement.moving = true;
this.movement.movingBackward = true;
}
Ship.prototype.bankLeft = function() {
// Move the player left
this.game.physics.arcade.velocityFromAngle(this.angle + 180 - ((this.movement.movingForward ? -45 : 0) + (this.movement.movingBackward ? 45 : 0)), this.speed, this.body.velocity);
this.movement.moving = true;
this.movement.bankingLeft = true;
}
Ship.prototype.bankRight = function() {
// Move the player left
this.game.physics.arcade.velocityFromAngle(this.angle + ((this.movement.movingForward ? -45 : 0) + (this.movement.movingBackward ? 45 : 0)), this.speed, this.body.velocity);
this.movement.moving = true;
this.movement.bankingRight = true;
}
如果你想知道为什么我将角度调整为 90 度,那是因为精灵朝上,而 Phaser 似乎将 0 度作为指向右侧。
我一直在玩精灵,试图让它以我期望的方式扫射 - 毁灭战士风格。
所以问题是我可以设置精灵的角度,我使用 velocityFromRotation
相对于当前角度上下左右移动它。
到目前为止,太可爱了。
问题是我不能沿对角线移动,也就是说,我需要能够相对于精灵的角度同时向上和向左移动。
我有一个针对每个移动的函数,向上、向下、向左和向右 - 因为所有人都在使用 velocityFromRotation
,所以最后按下的键将覆盖第一个的移动。
据推测,我也可以简单地为每个对角线创建函数,尽管我不完全确定我将传递给 velocityFromRotation
方法的什么来实现这一点——但即使这样可行,它然后可能会阻止我使用模拟输入类型,因为对角线逻辑将被硬编码。我没有使用模拟输入,但我正在尝试将我的预制件构建为 'drop-in' 尽可能可重复使用。
这是我当前的代码:
Ship.prototype.moveForward = function() {
// Move the player up
this.game.physics.arcade.velocityFromAngle(this.angle - 90, this.speed, this.body.velocity);
}
Ship.prototype.moveBackward = function() {
this.game.physics.arcade.velocityFromAngle(this.angle + 90, this.speed, this.body.velocity);
}
Ship.prototype.bankLeft = function() {
// Move the player left
this.game.physics.arcade.velocityFromAngle(this.angle + 180, this.speed, this.body.velocity);
}
Ship.prototype.bankRight = function() {
// Move the player left
this.game.physics.arcade.velocityFromAngle(this.angle, this.speed, this.body.velocity);
}
没关系,我找到了。
对我来说,诀窍是记录精灵当前正在做什么,并在函数中进行检查以手动调整角度。
因此,我在我的更新函数中存储了一些变量 - 它们在各种移动函数中被覆盖:
this.movement.movingForward = false;
this.movement.movingBackward = false;
this.movement.moving = false;
那么我的运动函数是这样的:
// Player movement
Ship.prototype.moveForward = function() {
// Move the player up
this.game.physics.arcade.velocityFromAngle(this.angle - 90, this.speed, this.body.velocity);
this.movement.moving = true;
this.movement.movingForward = true;
}
Ship.prototype.moveBackward = function() {
// Move the player down
this.game.physics.arcade.velocityFromAngle(this.angle + 90, this.speed, this.body.velocity);
this.movement.moving = true;
this.movement.movingBackward = true;
}
Ship.prototype.bankLeft = function() {
// Move the player left
this.game.physics.arcade.velocityFromAngle(this.angle + 180 - ((this.movement.movingForward ? -45 : 0) + (this.movement.movingBackward ? 45 : 0)), this.speed, this.body.velocity);
this.movement.moving = true;
this.movement.bankingLeft = true;
}
Ship.prototype.bankRight = function() {
// Move the player left
this.game.physics.arcade.velocityFromAngle(this.angle + ((this.movement.movingForward ? -45 : 0) + (this.movement.movingBackward ? 45 : 0)), this.speed, this.body.velocity);
this.movement.moving = true;
this.movement.bankingRight = true;
}
如果你想知道为什么我将角度调整为 90 度,那是因为精灵朝上,而 Phaser 似乎将 0 度作为指向右侧。