2017-11-21 5 views
0

나는 현재 캔버스 (자바 스크립트)를 사용하여 하향식 사수의 HTML5 게임을 만들고있어, 여기에 내 문제입니다 적 또는 예, 가끔 (무작위로) 게임 chashes을 적의와 총알,하지만를 파괴하고 오류를 반환 아닌 경우,이 오류에오류 (이 정의 된 반면) 정의되지 않은 객체

uncaught TypeError: Cannot read property 'x' of undefined 
at collides (game.js:274) 
at checkBulletHits (game.js:177) 
at Game (game.js:346) 

을 "정의되지 않은"내가 촬영 마지막 총알입니다, 하지만 이번에는 총알이 undefined인데, 이유는 모르겠습니다. 여기

var bullets = []; 
var enemies = []; 

function checkBulletHits() { 
    if (bullets.length > 0 && enemies.length > 0) { 
     for (j = bullets.length - 1; j >= 0; j--) { 
      for (k = enemies.length - 1; k >= 0; k--) { 
       if (collides(enemies[k], bullets[j])) { 
        enemies.splice(k, 1); 
        bullets.splice(j, 1); 
        player.points += 10;  
       } 
      } 
     } 
    } 
} 

function collides(a, b) { 
    return a.x < b.x + b.w && 
     a.x + a.w > b.x && 
     a.y < b.y + b.h && 
     a.y + a.h > b.y; 
} 

checkBulletHits(); 

전체 코드 : 당신이 충돌이있을 때 https://pastebin.com/H2Cw1g5j

+0

'collides' 함수는'a.x'와'b.x'를 사용하려고 시도하고 있지만'x'는 거기에 있지 않습니다. 'x'를 선언 한 곳을 찾아서'collides()'가 그것을 사용하려고 할 때까지 적절한 값을 가지고 있는지 확인해야합니다. 귀하의 주요 문제에 관해서는,'collides()'는 두 개의 인수를받는 것으로되어 있지만, 오류는 단지 하나만 호출되거나, 두 번째 인수는 사용될 때 'undefined'값을가집니다. –

+0

@ScottMarcus : 스코프는 여기서 문제와 관련이 없습니다. – Cerbrus

답변

2

, 당신은 인덱스 j에서 총알을 제거 여기

관련된 코드입니다. 그런 다음 루프는 다음 적에게 계속되고 인덱스 j에 총알에 대한 또 다른 검사가 있습니다.

총알이 더 이상 존재하지 않으므로 collides(enemy, undefined) (으)로 전화하고 있습니다.
그렇다면 collides에서 이것은 분명히 오류 : undefined.x을 던집니다.

히트가있을 때 루프에서 벗어납니다. if 블록 끝에 return 문을 추가하십시오.

+0

우수, @ 잭스! 이 질문에 대한 대답이 되었습니까? 아니면 여전히 명확하지 않은 부분이 있습니까? – Cerbrus

+0

'bullets' 배열의 마지막 요소에 대해 일치 항목이 발견되면 실제로 만 true입니다. 여기서'j === bullets.length -1'입니다. 그렇지 않으면 배열을 접합하고 색인을 사용하여 요소를 참조하면 '정의되지 않음'이되지 않습니다 (이전 글 머리 기호 만 다시 검사합니다). – cstricklan

+0

그것은 내 질문에 대한 답변, 나는 게임이 매번 충돌하지 않고 일할 수 finaly : D 조 –