6

このチュートリアルに従って、JavaScript/キャンバス ゲームでタイル マップ エディターによって作成された json マップ ファイルをロードできるようにします。

独自の種類のバージョンを実装するところまで来ましたが、コンソールやネットなどの firebug でエラーが発生していません。

そして、私が見る限り、console.logs とアラートを入力すると、スクリプトはまったく問題なく実行されます!

問題は、キャンバスが空白のままであることです! タイルマップが必要なとき。

私のゲームに実装されたチュートリアルの私のバージョンは次のとおりです。

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 ------------------------------------------------------





});

タイルマップが私のキャンバスに印刷されない理由を、素敵な人々が見つけられるとは思いませんか?

助けてくれてありがとうトム

4

1 に答える 1

9

タイル + キャンバス

Shane Riley によるhttp://blog.hashrocket.com/posts/using-tiled-and-canvas-to-render-game-screensの Tiled+Canvas ブログ投稿を見ました。興味深い投稿です!

グッド ニュース…私は彼のデモから彼のコードを取得しました。彼のコードは私の開発用コンピューターでローカルに動作しています。

プロセスを経てコードを見ると、次の 2 つの問題に対処することでコードを機能させることができると思います。

1) get_tileset 関数に小さなバグがあります。

2) Shane のすべてのデモ ファイルをローカル コンピューターにあるファイルに向ける必要があります。これらすべてのファイルを 1 つのフォルダーにまとめただけです (私にとってはうまくいきました)。これらのファイルに触れる必要があります (詳細は以下を参照)。

  • 山.html
  • 山.json
  • 山.tmx
  • mountain_landscape_23.png
  • render_scene.js

詳細はこちら。これらは私のために働いたし、あなたのために働くはずです. そうでない場合は、お知らせください。完全なコードを投稿できます。

バグ -- 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 ファイルをフォトショップなどのエディターに取り込み、開発ドメインに保存して CORS エラーを無効にします。

于 2013-03-29T04:23:46.700 に答える