2016-08-30 22 views
-1

nodejsを使用してゲームを作成しています。今度は、私はDeleteを使うことができません。それは動作していないと私は理由が分からない。Javascriptの削除で目的のプロパティが削除されない

私はこの行を実行:

delete Bullet.list[i] 

そしてBullet.listはプロパティを持つオブジェクトであり、このラインを実行した後、所望の特性が除去されません。

はここ(あなたがここで以下のコンテキストで上記のコード行を見ることができます)私のコードです:

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

あなたの3つのforループはすべて同じ変数iを共有していますので、あなたはのインデックスを削除していません。これは、var iが関数スコープであり、個々のforループにスコープされていないためです。

あなたがこれを行うとき:

delete Bullet.list[i]; 

iの値がiがあなたの前のforループ、おそらくないあなたが実際に削除したい項目の後にあるものは何でもあります。おそらくforループから脱出して、iが削除したい特定のアイテムになるということでしょうか?

または、削除するアイテムのインデックスを別の変数に別途保存する必要があります。または、iの値が最新の場合は、forループ内の項目を削除してください。

varが機能スコープであることを覚えておいてください。したがって、2つのネストされたforループ内のvar i宣言は、実際には全く同じ変数を参照しており、新しい変数を宣言していません。 2つのループのうちの1つのループインデックスの名前を別の変数に変更することをお勧めします。

あなたはletが完全にサポートされている環境で実行している場合は、代わりにvar ilet iを使用することができ、その後、iの値が一意にそれが宣言されただけforループにスコープされるだろう。

+0

本当ですか?私がこのコードを書いたとき、私は "i"がoutter forループのvar "i"への参照であると考えていました。 –

+0

@DanielOliveira - Nope。 'var'は関数スコープです。したがって、両方の 'var i'宣言は実際には同じ変数を参照します。もし 'var'の代わりに' let'を使ったなら、あなたが考えていたことはうまくいくかもしれません。しかし、私の本では、ネストされたループに同じ変数を使うべきではありません。 – jfriend00

+0

ありがとう@ jfriend00それは働いた! –

-1

配列要素を削除すると、配列の長さには影響しません。これは、配列の最後の要素を削除しても保持されます。

deleteの代わりにBullet.list.splice(i, 1)を試してみることもできます。

このコードには多くのことがありますが、これが役立つことを願っています!

+0

Bullet.listは配列ではありません各弾丸のIDをキーとするオブジェクトです。 –

+0

申し訳ありません!私はそれが 'list'という名前の配列であると思いました。すべての文脈なしに質問に答えようとしました。 – spoonscen

関連する問題