2016-12-14 47 views
0

我正在設計一個庫存系統。現在,我需要測試一個物品是否在庫存中,以便階段知道是否在特定級別實例化該物品。作爲e.target傳遞的AS3對象不匹配通過其數組索引傳遞的相同對象

我添加的項目組中的電平,所以這種代碼位於陣列環路「卸載」對應於每個級別的項目的「包」中。

if (inv.indexOf(group[i]) == -1) { 
    //add item + item functionality 
} 

這種方法適用當我添加的項目清單,如這樣的:

inv.push(group[i]); 
if (inv.indexOf(group[i]) == -1) { 
    //add item + item functionality 
} 

但是,這並不工作,因爲我爲什麼要添加項目到庫存沒有收集用戶它首先?所以代碼實際上是構造成這樣:

  if (inv.indexOf(group[i]) == -1) { 

       //if item is not in inventory, add to stage 
       addChild(group[i]); 

       //when a user clicks this (any) item, 
       group[i].addEventListener(MouseEvent.CLICK, function itemFunctionality(e:MouseEvent){ 

        //target item clicked 
        var item = e.target; 
        //add the item to the inventory 
        inv.push(item); 
        //sidenote: if i were to check inv.indexOf(item) here, i 
        //would get a positive index. unfortunately, 
        //i cant check whether the item is in the inventory 
        //after its already been added to the level... 

        item.removeEventListener(MouseEvent.CLICK, itemFunctionality); 
      }); 
      } 

問題是,當你離開和回來的水平,你已經收集到的物品重新實例。如果您再次收集項目,則清單會添加您已收集的項目的副本。

inv.indexOf(group[i])檢查不理解的是,當陣列循環到達相應,item group[i] ==對象通過inv.push(item)或者換句話說添加到清單inv.push(e.target)(其中,當然,我無法直接寫入代碼) ...

當我跟蹤最新靜態數組inv,在陣列內環路什麼group[i],或者什麼e.target是,它們都輸出相同類型的項目爲「[object ITEMNAME]」,表示的indexOf內選中SHOULD匹配。

更新:
如果我看來,項目靜態以及它們屬於這種方法的陣列組的鼠標事件回調中的工作原理:

inv.push(item); 
group.splice(group.indexOf(item), 1); 

雖然我已刪除的項目以及來自他們自己的類的項目組,並將它們放在關卡類本身內......我覺得這種方法很糟糕,因爲一切都變得雜亂無章並且分組到同一個類中。

任何有幫助的建議?

+0

這是不是很清楚你是什麼意思下「離開並回來」,但據我所知你正在試圖檢查DisplayObject是否在數組inv中。而這種方法將無法工作。您需要爲每個項目添加一個ID,換句話說,您的關卡應該建立在某個模型上。在這個模型中,您可以描述關卡上存在的物品,已連接的物品。這是你的應用程序設計的問題,而不是語言。 – Nbooo

回答

2

對象與它們的引用相匹配。這意味着從同一個類創建的兩個對象不相同,它們是不同的對象。

爲您的物品分配唯一的ID並在清單中使用它們。喜歡;

inv.push(item.id); 
if (inv.indexOf(item.id) == -1) { 
    //add item + item functionality 
} 

使用ID對於序列化/反序列化也更好。

2

有你的問題:

問題是,當你離開和回來的水平,你已經收集到的物品重新實例

爲什麼會回到某種程度導致任何種類的重新定義?

您應該只創建一次每個關卡對象,並且該進程的一部分應創建該關卡中包含的所有對象。僅僅訪問一個級別就是與該對象的交互,這可能包括刪除對象並將其添加到清單中。一旦物體從關卡中消失,它們就消失了。

重新訪問時,沒有理由重新實例化一個關卡(或其中的任何對象)。如果你遇到這個問題,因爲你正在使用基於時間線的方法來處理幀和gotoAndStop()之間的切換水平,那麼這是你的問題的核心,你應該停止這樣做。

+0

即時消息不使用時間軸代碼,但我在他們之間旅行時重新實例化級別。當你離開一個級別時,它會自行刪除,並告訴舞臺創建一個你正在旅行的級別的新實例...我現在可以看到這是一個糟糕的設計選擇,哈哈。我還會怎麼做呢? – carrmx

+0

即時考慮將每個位置放在舞臺上並改變它們的座標來完成這個......但是我覺得這種方法太笨重了......它會減慢遊戲速度嗎? – carrmx