首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在平铺的.json解析层之间绘制播放器

在平铺的.json解析层之间绘制播放器
EN

Stack Overflow用户
提问于 2018-05-27 09:00:32
回答 1查看 120关注 0票数 0

你好,世界第一次著名的堆栈溢出!

我正在解析来自Reading JSON Tiled map editor file and displaying to canvas的平铺制作的Reading JSON Tiled map editor file and displaying to canvas映射(只是一个测试)。

我不完全理解renderLayer函数,如果可取的话,我会就此提出一个新的问题。从我的粗略理解,它呈现每一层瓷砖,并推动到最终的“场景”img将被绘制。

我的问题是如何在层间画一个"player“对象。我有一个顶层、中间层和底层。中间层是空的,我打算在那里画玩家,以增加深度。我不知道在代码中添加了我的播放器更新函数,我也觉得在地图渲染中有一个播放器更新函数并不是很好的OOP。

在注释中,我可以获得图层名称,并且我有一个播放器更新函数来处理绘图。

谢谢您的建议和解释。

呈现地图的代码:

代码语言:javascript
运行
复制
$(function() {
  var c = document.getElementById("canvas").getContext('2d');

scene = {
  layers: [],
  renderLayer: function(layer) {

 /*
  if(layer.name == "Middle"){
    player.update();
  }
  */

  if (layer.type !== "tilelayer" || !layer.opacity) { return; }

  var s = c.canvas.cloneNode(),
      size = scene.data.tilewidth;
  s = s.getContext("2d");

  if (scene.layers.length < scene.data.layers.length) {
    layer.data.forEach(function(tile_idx, i) {
      if (!tile_idx) { return; }

      var img_x, img_y, s_x, s_y,
          tile = scene.data.tilesets[0];

      tile_idx--;
      img_x = (tile_idx % (tile.imagewidth / size)) * size;
      img_y = ~~(tile_idx / (tile.imagewidth / size)) * size;
      s_x = (i % layer.width) * size;
      s_y = ~~(i / layer.width) * size;
      s.drawImage(scene.tileset, img_x, img_y, size, size, s_x, s_y, size, size);
    });
    scene.layers.push(s.canvas.toDataURL());
    c.drawImage(s.canvas, 0, 0);
  }else {
    scene.layers.forEach(function(src) {
        //console.log(scene);
      var i = $("<img />", { src: src })[0];
      c.drawImage(i, 0, 0);
    });
  }
},
renderLayers: function(layers) {
  layers = Array.isArray(layers) ? layers : this.data.layers;
  layers.forEach(this.renderLayer);
},
loadTileset: function(json) {
  this.data = json;
  this.tileset = $("<img />", { src: json.tilesets[0].image })[0]
  this.tileset.onload = $.proxy(this.renderLayers, this);
},
load: function() {
  return $.ajax({
    url: "map.json",
    dataType: "text json"
  }).done($.proxy(this.loadTileset, this));
}
};
scene.load();
});

renderMap = function(){
  scene.renderLayers();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-28 09:29:18

你的理解是对的。我建议把每一层分别画出来。有了这个,你可以画你的玩家之间的指定层,你也有更多的控制视觉。

您可能知道,在平铺中您可以添加几个层。在你的游戏中分别加载它们,然后一个一个地画它们。

因此,您必须以这样的方式拆分renderLayers(),即不是所有层都一次绘制(layers.forEach(this.renderLayer);),而是按给定的顺序绘制。

伪码:

代码语言:javascript
运行
复制
scene.renderLayer(0);
scene.renderLayer(1);
player.Draw()
scene.renderLayer(2);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50550576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档