Javascript 在我的platformer游戏中,如何制作一个使玩家减速的对象?

Javascript 在我的platformer游戏中,如何制作一个使玩家减速的对象?,javascript,Javascript,我想制作一个像“泥”这样的物体,当玩家站在上面时,它会使玩家的x、y速度和跳跃速度变慢,我该怎么做?下面是我现在处理玩家速度的部分代码: var playerXSpeed = 7; Player.prototype.moveX = function(step, level, keys) { this.speed.x = 0; if (keys.left) this.speed.x -= playerXSpeed; if (keys.right) this.speed.x += pl

我想制作一个像“泥”这样的物体,当玩家站在上面时,它会使玩家的x、y速度和跳跃速度变慢,我该怎么做?下面是我现在处理玩家速度的部分代码:

var playerXSpeed = 7;

Player.prototype.moveX = function(step, level, keys) {
  this.speed.x = 0;
  if (keys.left) this.speed.x -= playerXSpeed;
  if (keys.right) this.speed.x += playerXSpeed;

  var motion = new Vector(this.speed.x * step, 0);
  var newPos = this.pos.plus(motion);
  var obstacle = level.obstacleAt(newPos, this.size);

  if (obstacle)
    level.playerTouched(obstacle);
  else
    this.pos = newPos;
};

var gravity = 34;
var jumpSpeed = 15:
var playerYSpeed = 6;

Player.prototype.moveY = function(step, level, keys) {
  // Accelerate player downward (always)
  this.speed.y += step * gravity;;
  var motion = new Vector(0, this.speed.y * step);
  var newPos = this.pos.plus(motion);
  var obstacle = level.obstacleAt(newPos, this.size);
  // The floor is also an obstacle -- only allow players to 
  // jump if they are touching some obstacle.
  if (obstacle) {
    level.playerTouched(obstacle);
    if (keys.up && this.speed.y > 0)
      this.speed.y = -jumpSpeed;
    else
      this.speed.y = 0;
  } else {
    this.pos = newPos;
  }
};

我认为你的问题一下子就获得了一票反对票,这有点刺耳和不应该。让我试着给你一些关于这个问题的建议

看起来您正在从移动功能中评估障碍物逻辑。这与让您的职能部门承担单一责任的最佳实践背道而驰。我建议重构您的代码,让移动函数只执行“移动”,并对其他地方的障碍进行评估,一个很好的位置应该在更新循环中

我将在这里提供一个轻量级的重构,以说明您可能会如何考虑重新组织代码。我希望这对你有帮助

YourGameController.prototype.update = function () {
  this.referenceToYourPlayer.movePlayer(this.keysReference);
  this.referenceToYourLevel.handleCollisions();
}

var gravity = 34;
var jumpSpeed = 15:
var playerYSpeed = 6;
var playerXSpeed = 7;

Player.prototype.movePlayer = function (keys) {
  this.moveX(keys);
  this.moveY();
}

Player.prototype.moveX = function(keys) {
  this.speed.x = 0;
  if (keys.left) this.speed.x -= playerXSpeed;
  if (keys.right) this.speed.x += playerXSpeed;

  var motion = new Vector(this.speed.x * step, 0);
  var newPos = this.pos.plus(motion);
};

Player.prototype.moveY = function() {
  // Accelerate player downward (always)
  this.speed.y += step * gravity;;
  var motion = new Vector(0, this.speed.y * step);
  var newPos = this.pos.plus(motion);
};