Tiled .json parsed Layers 之间的绘图播放器
Drawing player in-between Tiled .json parsed Layers
Hello world 第一次famed栈溢出!
我正在解析来自 Reading JSON Tiled map editor file and displaying to canvas
的 Tiled-made .json 地图(只是一个测试)
我不完全理解 renderLayer 函数,如果可以的话,我会就此提出一个新问题。根据我的粗略理解,它逐块渲染每一层并推送到将绘制的最终 "scene" img。
我的问题具体是如何在图层之间绘制 "player" 对象。我有顶层、中层和底层。中间层是空的,我打算在其中绘制玩家以增加深度。我不知道在代码的什么地方添加我的播放器更新功能,我也觉得在地图渲染中有一个播放器更新功能不是很OOP..
在评论中是如何获取图层名称的,我有一个播放器更新功能可以处理绘图。
提前感谢任何suggestions\explanation。
渲染地图的代码:
$(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();
}
你的理解是对的。
我建议分别绘制每一层。有了这个,您可以在指定层之间绘制您的播放器,并且您还可以更好地控制可见性。
您可能知道,在平铺中您可以添加多个图层。将它们分别加载到您的游戏中并一张一张地绘制。
所以你必须拆分你的 renderLayers() 方式,不是所有的层都被一次绘制(layers.forEach(this.renderLayer);)而是按照给定的顺序。
伪代码:
scene.renderLayer(0);
scene.renderLayer(1);
player.Draw()
scene.renderLayer(2);
Hello world 第一次famed栈溢出!
我正在解析来自 Reading JSON Tiled map editor file and displaying to canvas
的 Tiled-made .json 地图(只是一个测试)我不完全理解 renderLayer 函数,如果可以的话,我会就此提出一个新问题。根据我的粗略理解,它逐块渲染每一层并推送到将绘制的最终 "scene" img。
我的问题具体是如何在图层之间绘制 "player" 对象。我有顶层、中层和底层。中间层是空的,我打算在其中绘制玩家以增加深度。我不知道在代码的什么地方添加我的播放器更新功能,我也觉得在地图渲染中有一个播放器更新功能不是很OOP..
在评论中是如何获取图层名称的,我有一个播放器更新功能可以处理绘图。
提前感谢任何suggestions\explanation。
渲染地图的代码:
$(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();
}
你的理解是对的。 我建议分别绘制每一层。有了这个,您可以在指定层之间绘制您的播放器,并且您还可以更好地控制可见性。
您可能知道,在平铺中您可以添加多个图层。将它们分别加载到您的游戏中并一张一张地绘制。
所以你必须拆分你的 renderLayers() 方式,不是所有的层都被一次绘制(layers.forEach(this.renderLayer);)而是按照给定的顺序。
伪代码:
scene.renderLayer(0);
scene.renderLayer(1);
player.Draw()
scene.renderLayer(2);