首页 > 解决方案 > 碰撞后如何保持玩家位置?

问题描述

我在画布上制作游戏,我已经包含了一个库来为我处理碰撞。碰撞工作完美,但我不确定如何将玩家“冻结”到位并且在碰撞后不允许朝那个方向移动。谁能帮我吗 ?

我尝试了什么:

  moveRight() {
    this.pp.x = this.position.x;
    this.position.x += 20;
  }
  moveLeft() {
    this.pp.x = this.position.x;
    this.position.x -= 20;
  }
  moveUp() {
    this.pp.y = this.position.y;
    this.position.y += 20;
  }
  moveDown() {
    this.pp.y = this.position.y;
    this.position.y -= 20;
  }

我尝试跟踪“先前位置”并将其设置为碰撞时的位置,但它的行为非常奇怪,并没有真正起作用。

理想情况下,我想在我的玩家类中创建一个 stop() 函数,我会在玩家与世界碰撞时调用它。

非常感谢,非常感谢任何帮助!!!

我使用lib(https://github.com/RonenNess/SSCD.js/)为我做碰撞测试,代码如下:

export function collisionDetection(game) {
  let world = new SSCD.World({ grid_size: 1024 });
  let player = new SSCD.Rectangle(
    new SSCD.Vector(game.player.position.x, game.player.position.y),
    new SSCD.Vector(game.player.width, game.player.height)
  );
  let zombie = new SSCD.Rectangle(
    new SSCD.Vector(game.zombie.position.x, game.zombie.position.y),
    new SSCD.Vector(game.zombie.width, game.zombie.height)
  );
  let walls = game.walls;
  walls.forEach(wall => {
    world.add(
      new SSCD.Rectangle(
        new SSCD.Vector(wall.position.x, wall.position.y),
        new SSCD.Vector(wall.width, wall.height)
      )
    );
  });

  if (world.test_collision(player)) {
    game.player.speed = 0;
    return 
}

标签: javascripthtmlcanvascollision

解决方案


做到这一点的一种方法是拥有20property的班级。此属性将是一个 " speed" 属性。然后您可以使用“ this.speed”访问它。一旦检测到碰撞,将速度设置为0,您将“冻结”您的角色。

例如 moveRight 会变成

moveRight() {
    this.pp.x = this.position.x;
    this.position.x += this.speed;
  }

推荐阅读