我遵循这个this教程,以便能够在我的javascript / canvas游戏中加载由平铺地图编辑器创建的json地图文件。
我已经实现了我自己的版本,并且在控制台或网络等的firebug中没有错误。
据我所知,通过输入console.logs和alert,脚本运行得非常好!
问题是画布留空了!什么时候它应该有一个tilemap。
以下是我在游戏中实施的教程版本:
function Level() {
var c;
var data;
var layers = [];
this.get_map = function(name,ctx){
c = ctx;
$.getJSON('maps/'+ name + '.json', function(json){
get_tileset(json);
});
};
function get_tileset(json) {
data = json;
this.tileset = $("<img />", { src: json.tilesets[0].image })[0];
this.tileset.onload = renderLayers(this);
}
function renderLayers(layers){
layers = $.isArray(layers) ? layers : data.layers;
layers.forEach(renderLayer);
}
function renderLayer (layer){
if (layer.type !== "tilelayer" || !layer.opacity) {
alert("Not a tileLayer");
}
var s = c.canvas.cloneNode(),
size = data.tileWidth;
s = s.getContext("2d");
if (layers.length < data.layers.length) {
layer.data.forEach(function(tile_idx, i) {
if (!tile_idx) { return; }
var img_x, img_y, s_x, s_y,
tile = 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(this.tileset, img_x, img_y, size, size,
s_x, s_y, size, size);
});
layers.push(s.canvas.toDataURL());
c.drawImage(s.canvas, 0, 0);
}
else {
layers.forEach(function(src) {
var i = $("<img />", { src: src })[0];
c.drawImage(i, 0, 0);
});
}
}
}
从我的主要javascript文件中调用它:
$(document).ready(function(){
var canvas = document.getElementById("TBG");
var ctx = canvas.getContext("2d");
var ui = new Gui();
var level = new Level();
//----------Login/Register Gui --------------
$('#TBG').hide();
$('#load-new').hide();
$('#reg').hide();
$('#login').hide();
//if login_but is clicked do ui.login function
$('#login_but').click(ui.login);
//if reg_but is clicked do ui.register function
$('#reg_but').click(ui.register);
$('#new_but').click(function(){
game_settings("new");
});
$('#load_but').click(function(){
game_settings("load");
});
//if login_sumbit button is clicked do ui.login_ajax function
$("#login_submit").click(ui.login_ajax);
$("#reg_submit").click(ui.register_ajax);
$("#welcome").on("click", "#logout_but", ui.logout);
//________________________
//Initialisation of game
function game_settings(state){
if(state == "load"){
ui.load_game();
//do ajax call to load user last save
level.get_map("level_01",ctx);
}
else{
//set beginning params
//Change screens
ui.new_game();
alert("new game");
}
}
// End Loop ------------------------------------------------------
});
我不认为你可爱的人会发现为什么瓷砖地图没有印在我的画布上?
感谢Tom的帮助
答案 0 :(得分:8)
Tiled + Canvas
我看了Shane Riley在http://blog.hashrocket.com/posts/using-tiled-and-canvas-to-render-game-screens上的Tiled + Canvas博客文章。一个有趣的帖子!
好消息......我从他的演示中抓取了他的代码,我的代码在我的开发计算机上本地工作。
在完成整个过程并查看代码时,我认为您可以通过处理两个问题来使代码工作:
1)你的get_tileset函数中有一个小错误。
2)您需要将所有的Shane演示文件指向位于您的本地计算机上的文件。我只是将所有这些文件放在一个文件夹中(为我工作)。您需要触摸这些文件(详情如下):
以下是详细信息。这些对我有用,他们应该为你工作。但如果没有,请告诉我,我可以发布完整的代码。
错误 - 在你的get_tileset()中,tileset.onload需要命名函数或内联函数,而不是函数调用。
// not this.tileset.onload=renderLayers(this)
this.tileset.onload=renderLayers;
// change the signature of renderLayers
// (you have “layers” in scope for visibility in this function so this s/b ok)
// So: not function renderLayers(layers)
function renderLayers()
请在$ .getJSON中添加错误捕获器,以便您了解失败的请求!
$.getJSON('maps/'+ name + '.json', function(json){
get_tileset(json);
}).fail( alert(“I think you should know that something has gone horribly wrong!”); );
以下是本地化文件所需的更改。
在mountain.html中:
<script src="render_scene.js" type="text/javascript"></script>
在render_scene.js中(如果你是从Gist下载的)
load: function(name) {
return $.ajax({
url: "mountain.json",
dataType: "text json"
}).done($.proxy(this.loadTileset, this));
}
在mountain.json中:
"image":"mountain_landscape_23.png",
在mountain.tmx:
<image source="mountain_landscape_23.png" width="512" height="512"/>
Mountain_landscape_23.png
重要!根据您设置开发环境的方式,您可能会遇到跨域安全错误,浏览器将拒绝绘制您的磁贴。如果是这样,请将此png文件放入像photoshop这样的编辑器中,并将其保存回dev域以消除CORS错误。