2016-08-30 2 views
-1

nodejs를 사용하여 게임을 만듭니다. 이번에는 Delete를 사용할 수 없습니다. 그것은 작동하지 않으며 나는 왜인지 전혀 모른다.자바 스크립트를 삭제해도 원하는 속성이 삭제되지 않습니다.

delete Bullet.list[i] 

그리고 Bullet.list이 특성이 선을 실행 한 후 목적은, 원하는 특성이 제거되지 :

I는이 광고를 수행한다.

여기 (여기 아래 맥락에서 위의 코드 라인을 볼 수 있습니다) 내 코드입니다 :

var Map = require("./Map.js") 
var Player = require("./Player.js"); 
var Bullet = require("./Bullet.js"); 
var Fly = require("./Fly.js"); 
var Settings = require("./Settings.js"); 

var Simulation = function(SOCKET_LIST){ 

//Update Bullets 
for(var i in Bullet.list){ 
    var bullet = Bullet.list[i]; 
    bullet.update(); 

    var shooter = Player.list[bullet.parent];  
    //Bullets collide with flies 
    for(var i in Fly.list){ 
     var fly = Fly.list[i]; 
     if(!bullet.toRemove && bullet.getDistance(fly) < 15){ 
      if(shooter){ 
       shooter.updateCoins(fly.killCoins); 
       shooter.updateXp(fly.killXp); 
      } 
      bullet.toRemove = true; 
      fly.toRemove = true; 
     } 
    } 
    //Collide with player 
    for(var i in Player.list){ 
     var player = Player.list[i]; 
     if(player.death) continue; 
     if(!bullet.toRemove && bullet.getDistance(player) < 32 && shooter !== player.id && shooter.team != player.team && !player.immune){ 
      player.hp -= 1; 
      player.hpChanged = true; 
      if(player.hp <= 0){ 
       if(shooter) 
        player.kill(shooter); 
       else 
        player.kill(); 
      } 
      bullet.toRemove = true; 
     } 
    } 
    //Collide with map 
    if(typeof shooter == "undefined" || shooter.shootsCollideMap && Map.isColliding(bullet)) 
     bullet.toRemove = true; 

    //Remove bullets 
    if(bullet.toRemove){ 
     delete Bullet.list[i]; /*HERE IS THE PROBLEM. THE PROPERTY IS NOT BEING DELETED*/ 
     Bullet.removePack.push[bullet.id]; 
    } 

} 

나는 재산 "I"개체에서 Bullet.list을 삭제할 수 없습니다입니다.

+1

[이해 부족] (http://perfectionkills.com/understanding-delete/)을 읽어야합니다. 'Bullet.list'는 배열이나 객체입니까? Javascript에서'delete'의 주요 목적은 객체의 속성을 제거하는 것입니다 (배열에서 요소를 제거하지 않기 위해서). – jfriend00

+0

@ jfriend00 Bullet.list는 키가 bullet.id 인 객체입니다. 다음과 같이 글 머리 기호에 액세스 할 수 있습니다. var Bullet = Bullet.list [bullet.id]. bullet.id는 배열 색인이 아닌 임의의 숫자입니다. –

+0

@ vol7ron Bullet.list가 개체이기 때문에 삭제를 사용하려고하면됩니다. 내가 분명하기는하지만 나는 언급하지 않았다.나는 또한 (Bullet.list의 var i)를 사용하고 있기 때문에 ... –

답변

2

세 개의 for 루프는 모두 동일한 변수 i을 공유하므로 사용자가 원하는 i 색인을 삭제하지 않습니다. 이는 var i이 범위가 기능 범위이므로 개별 for 루프로 범위가 지정되지 않았기 때문입니다.

당신이 할 때 :

delete Bullet.list[i]; 

i의 값은 어떤 i입니다 이전 for 루프 당신이 실제로 삭제할 아마 항목 후. 이전에 for 루프에서 벗어나서 i이 제거하려는 특정 항목이 될 것 같습니까?

또는 다른 변수에 제거 할 항목의 인덱스를 별도로 저장해야합니다. 또는 i 값이 최신 값일 때 for 루프 안의 항목을 제거하면됩니다.

var은 기능 범위입니다. 따라서 두 개의 중첩 된 for 루프의 var i 선언은 실제로 동일한 변수를 참조하며 새로운 변수는 선언하지 않습니다. 두 루프 중 하나에서 루프 인덱스의 이름을 별도의 변수로 변경하는 것이 좋습니다. 당신이 let이 완벽하게 지원하는 환경에서 실행하는 경우

, 당신은 let i 대신 var i 사용할 수있는 다음 i의 값이 고유하게 선언 된 경우에만 for 루프 범위가 될 것이다.

+0

정말입니까? 이 코드를 작성할 때 나는 "i"가 outter for 루프의 var "i"에 대한 참조라고 생각했습니다. –

+0

@DanielOliveira - 아니요. 'var'는 기능 영역입니다. 따라서 'var i' 선언은 모두 실제로 동일한 변수를 참조합니다. 'var' 대신에'let'을 사용했다면, 당신이 생각한 바가 그럴 것입니다. 그러나 내 책에서는 중첩 루프에 대해 동일한 변수를 사용해서는 안됩니다. – jfriend00

+0

고맙습니다. @ jfriend00이 효과가있었습니다! –

-1

배열 요소를 삭제할 때 배열 길이는 영향을받지 않습니다. 배열의 마지막 요소를 삭제하더라도 유지됩니다.

delete 대신 Bullet.list.splice(i, 1)을 시도해 볼 수 있습니다.

이 코드에서 많은 일이 일어나고 있습니다. 도움이되기를 바랍니다.

+0

Bullet.list는 배열이 아닙니다. 각 탄환의 ID는 열쇠입니다. –

+0

죄송합니다! 나는 그것이'list'라는 이름의 배열이라고 생각했습니다. 모든 문맥없이 질문에 대답하려고했습니다. – spoonscen

관련 문제