4

オブジェクト指向の JavaScript を学習しようとしていて、次の問題に遭遇しました。

次のようなオブジェクト コンストラクターがあります (正しい用語ですか?)。

function itemCreator(itemName, itemType, itemPositionX, itemPositionY) {
            this.itemName = itemName;
            this.itemType = itemType;
            this.itemPositionX = itemPositionX;
            this.itemPositionY = itemPositionY;
            allItems.push(this); //store all items in a global variable
            }//end itemCreator;


//then I use it to create an object

megaRocket = new itemCreator (
           'megarocket',
           'item_megarocket',
           108,
           475
           )

ここで、これらのオブジェクトをマップして、オブジェクトが持つ「itemType」に基づいてさまざまなグローバル変数を変更する必要があることに気付きました。これは私が立ち往生しているところです。特定の itemType プロパティを持つオブジェクトのみが変更できるグローバル変数を作成するにはどうすればよいですか?

たとえば、amountOfMegarockets という変数をインクリメントするオブジェクトを作成したいと思いますが、そのオブジェクトの itemType が「item_megarocket」の場合のみです。

後で、これらのアイテムの配列をループして、プレイヤー オブジェクトがアイテムに触れているかどうかを確認する予定です (アイテムを収集するため)。

function checkForItems(){ 
                var itemLen =allItems.length;
                for (i=0; i < itemLen; i++){
                var itemObject = allItems[i];

                if ( //checking for "collisions" here
                (ship.x < (itemObject.itemBitmap.x + itemObject.size) &&  (ship.x + shipWidth) > itemObject.itemBitmap.x) &&
                (ship.y < (itemObject.itemBitmap.y + itemObject.size) &&  (ship.y + shipWidth) > itemObject.itemBitmap.y)
                ){
                itemObject.actor.y = -500; //just removing the item from canvas here (temporary solution)
                // Here comes pseudo code for the part that I'm stuck with  
                variableBasedOnItemObject.itemType++;

                }

私の説明が誰かにとって意味があることを願っています!

編集:

Bergiの答えは私にとって最も理にかなっていますが、構文を正しく理解できません。Bergiのコードを使用しようとしている方法は次のとおりです。

var amounts = {},
allItems = [];
function itemCreator(itemName, itemType, itemPositionX, itemPositionY) {
this.itemName = itemName;
this.itemType = itemType;
this.itemPositionX = itemPositionX;
this.itemPositionY = itemPositionY;

(amounts[itemType]=2); // this is different from bergi's example because I need to set the initial value of the item to two
//I also shouldn't increase the item amount on creation of the item, but only when it's specifically called from another function
this.increaseCount = amounts[itemType]++; //this should IMO increase the itemType amount inside the amounts object when called, but it doesn't seem to work
}

//creating the object the way bergi suggested:
allItems.push(new itemCreator('shootUp001', 'item_up', 108, 475)); 

さて、問題の部分は次のとおりです。

function checkForItems(){ 
                var itemLen =allItems.length;
                for (i=0; i < itemLen; i++){
                var itemObject = allItems[i];

                if ( my condition here)
                ){

//code below is not increasing the value for the current itemType in the amounts object. 
//Probably a simple syntax mistake?
                itemObject.itemType.increaseCount; 

                }

           }

           }

itemObject.itemType.increaseCount; の呼び出しはなぜですか? amount.itemType の値を増やしていませんか?

4

2 に答える 2

1

amountOfMegarockets というグローバル変数をインクリメントしますが、そのオブジェクトの itemType が「item_megarocket」の場合のみです。

これらの項目タイプごとにグローバル変数を使用しないでください。プロパティで各タイプの金額をカウントする 1 つのオブジェクト (グローバルまたはローカル スコープ) を使用してください。

var amounts = {},
    allItems = [];
function Item(itemName, itemType, itemPositionX, itemPositionY) {
    this.itemName = itemName;
    this.itemType = itemType;
    this.itemPositionX = itemPositionX;
    this.itemPositionY = itemPositionY;

    amounts[itemType]++ || (amounts[itemType]=1); // count by type
    allItems.push(this); // store all items
}

デフォルトでは、すべてのインスタンスを配列に入れるわけではないことに注意してくださいItem。その行を省略して、呼び出し元を実行させたほうがよいでしょう。

allItems.push(new Item('megarocket', 'item_megarocket', 108, 475));
于 2013-10-10T10:53:44.600 に答える