2013-03-27 2 views
5

내자습서를 따르는 자습서는 자바 스크립트/캔버스 게임에서 타일 맵 편집기로 만든 json 맵 파일을로드 할 수 있습니다. 내가, console.logs에 넣어 버전의 내 자신의 종류를 구현, 등 콘솔 또는 순 최대한 멀리 볼 수JSON 바둑판 식으로 맵 편집기 파일을 읽고 캔버스에 표시

그리고에 불을 지르고에서 오류를 받고하지 오전 어디에

필자는 지점에 도착 그리고 경고, 스크립트는 절대적으로 잘 실행 중입니다!

문제는 캔버스가 비어있는 것입니다. 언제 타일 맵을 가져야하는지. 여기

튜토리얼의 나의 버전은 내 게임에서 구현됩니다

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); 
     }); 
    } 

} 

} 

이되는 자바 스크립트 파일 내 메인에서 호출 :

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





}); 

난 당신이 아름다운 생각하지 않습니다 타일 ​​맵이 내 캔버스에 인쇄되지 않는 이유를 사람들이 알아낼 수 있습니까? 톰

+0

좋은 json 데이터를 받으시겠습니까? $ .getJSON에 .done 및 .fail 함수를 추가 한 다음 거기에서 디버깅하여 유효한 데이터를 가져 오도록하십시오. – markE

+0

예, JSON 데이터는 훌륭하다고 생각합니다. 나는 그것이 함수로 가져온 후 콘솔 로그를 완료했고 또한 전달되고 데이터가 괜찮 았을 때 –

+0

누군가 이것에 대한 아이디어가 있습니까 ?? 나는 이유를 알아낼 것 같지 않은 이유는 그 그림! 아가씨. 하하. –

답변

6

타일 + 캔버스

내가 쉐인 라일리에 의해 http://blog.hashrocket.com/posts/using-tiled-and-canvas-to-render-game-screens에 타일 + 캔버스 블로그 게시물 보았다 어떤 도움

감사합니다. 재미있는 포스트!

좋은 소식 ... 데모에서 코드를 가져 와서 코드를 개발 컴퓨터에서 로컬로 사용하고 있습니다. 과정을 통해 당신의 코드를 찾고에가는

, 나는 당신이 당신의 코드가이 문제를 돌봐에 의해 작동시킬 수 있다고 생각 :

1) 당신은 당신의 get_tileset 기능의 작은 버그가 있습니다.

2) 당신은 당신의 로컬 컴퓨터에있는 파일을 향해 셰인의 데모 파일을 모두을 가리 키도록해야합니다. 나는이 모든 파일들을 하나의 폴더에 모아 둔다.

  • render_scene.js
  • 을 mountain_landscape_23.png

    • mountain.html
    • mountain.json
    • mountain.tmx
    • : 당신은이 파일 (자세한 내용은 아래)를 터치해야합니다

      여기에 자세한 내용이 있습니다. 이들은 나를 위해 일했고 그들은 당신을 위해 일해야합니다. 그러나 그렇지 않다면 알려주십시오. 완전한 코드를 게시 할 수 있습니다.

      벅스 - 당신의 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.json에서 (당신이 요지를 다운로드 한 경우) render_scene.js에서

      <script src="render_scene.js" type="text/javascript"></script> 
      

      load: function(name) { 
          return $.ajax({ 
          url: "mountain.json", 
          dataType: "text json" 
          }).done($.proxy(this.loadTileset, this)); 
      } 
      

      : mountain.html에서

      산에서

      "image":"mountain_landscape_23.png", 
      

      . tmx :

      <image source="mountain_landscape_23.png" width="512" height="512"/> 
      

      Mountain_landscape_23.png

      중요! 개발 환경을 어떻게 설정했는지에 따라 도메인 간 보안 오류가 발생하고 브라우저에서 타일 그리기를 거부합니다. 그렇다면 포토샵과 같은 편집기로이 png 파일을 가져 와서 CORS 오류를 무효화하기 위해 dev에 다시 저장하십시오.

    관련 문제