2013-06-03 3 views
0

node.js + socket.io를 사용하여 승수 HTML5 캔버스 게임을 만들려고합니다. 불행히도 모든 플레이어를 그릴 때마다 모든 이미지가 서로 겹쳐집니다.Javascript가 서로의 위에 이미지를 그립니다.

socket.on('drawPlayers', function(players){ 
    context.clearRect (0 , 0 , gameWidth , gameHeight); //clear canvas 

    for(var i=0; i<players.length; i++){ 
     var cur = players[i]; 
     var playerSprite = new Image(); 
     playerSprite.onload = function() { 
     return context.drawImage(playerSprite, cur.x, cur.y); 
     }; 
     playerSprite.src = 'images/sprite.png'; 
     console.log("drawing player "+cur.un+" at ("+cur.x+","+cur.y+")"); 
    } 
    }); 

console.log()는 다른 x 및 y 값을 올바르게 기록하지만 모든 이미지는 서로 위에 쌓입니다.

function player(id,username){ 
    this.id = id; 
    this.un = username; 
    this.y = Math.floor(Math.random() * 501); 
    this.x = Math.floor(Math.random() * 801); 
    this.src = 'images/mobile_md_logo.png'; 
} 

I

+0

이 playerSprite.onload ='내부 디버깅을 넣어보십시오 루프 내부에서 호출 :

사용이 루프에 하나 cur의 범위를 분리하는 function() {'? – Isaac

+1

관련 : http://stackoverflow.com/q/1451009. 선언의 배치에도 불구하고,'cur'와'playerSprite'는 한번만 선언되고 루프의 모든 반복에 의해 공유됩니다. [당신은 클로저를 원할 것입니다.] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures#Creating_closures_in_loops.3A_A_common_mistake) 각각의 반복문에는 'cur'과'playerSprite'가 있습니다. . –

답변

1

조나단 Lonowski는 권리입니다. onload 트리거 각각에 대해 cur은 같은 플레이어, 마지막 플레이어를 가리 킵니다. drawPlayers 이벤트 처리기 내에는 cur이 하나만 있습니다.

function draw(sprite,cur){ 
    return function() { 
    context.drawImage(sprite, cur.x, cur.y); 
    }; 
} 

그런

for(var i=0; i<players.length; i++){ 
    var cur = players[i]; 
    var playerSprite = new Image(); 
    playerSprite.onload = draw(playerSprite,cur); 
    playerSprite.src = 'images/sprite.png'; 
    console.log("drawing player "+cur.un+" at ("+cur.x+","+cur.y+")"); 
} 
관련 문제