js游戏中的相机,跟随玩家

camera in a js game, follow player

所以最近我一直在尝试制作一款类似 2D 塞尔达传说的游戏。我想做一个相机跟随玩家。

所以我在搜索中查看了 https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/translate, https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Transformations 和其他一些内容(MDN 上有一篇关于它的文章,但我无法关注,尽管它看起来不像我要找的东西)。

我也不想只让玩家居中,我想要一个有限制的相机,所以你必须离开相机一定距离才能让地图开始滚动。

function camera(data) {
    var x, y;

    if(I.x <= 2 && I.x >= -2 && I.y <= 2 && I.y >= -2) { x = 0; y = 0;}
    if(I.x >  2) { x = -I.size; y = 0; }
    if(I.x < -2) { x =  I.size; y = 0; }
    if(I.y >  2) { x = 0; y = -I.size; }
    if(I.y < -2) { x = 0; y =  I.size; }

    ctx.translate(x, y);

    draw.map();
    draw.camera();
    draw.players(data);

    ctx.resetTransform();
}

draw.map() 绘制方块。 draw.camera() 画了一个小虚线框,所以我知道相机的边界。 draw.players(data) 吸引所有玩家。 I.size 是指每个图块的大小(在本例中为 16)。 I.x & I.y 是不言自明的。

我有一个工作版本(使用节点和 socket.io): http://dais-jaackotorus.codeanyapp.com:8080/

编辑:

差点忘了!这段代码的问题是它只跟随玩家一个方块,然后就不再跟随玩家了,它超出了摄像机范围而不是留在摄像机范围内,我不明白为什么。

这是一个简化的例子:

https://jsfiddle.net/2xbo0kas/

诀窍是开始绘制玩家周围的世界。因此,在 jsfiddle 中,您可以看到玩家静止但地图移动,因此玩家始终位于视口的中心。

fiddle 没有显示的是到达地图边缘后玩家的最终位置(您将在此处绘制静止地图但更新玩家矩形)。

function draw() {
  var startx = Math.max([player.x - size.width], 0);
  var endx = Math.min(startx + size.width, map.length);
  var starty = Math.max([player.y - size.height], 0);
  var endy = Math.min(starty + size.height, map[0].length);

  for (var x = startx; x < endx; x++) {
    for (var y = starty; y < endy; y++) {
      var drawx = x - startx;
      var drawy = y - starty;

      //draw tile
    }
  }

  //draw player
}