2017-07-06 60 views
1

經過一段時間的測試後,我發現我的地圖包含正確的值,但我使用的循環似乎只是使用此地圖中最後一個添加的值。我在這裏錯過了很明顯的東西嗎Haxe for loop只使用最後一項

,增加項目添加到地圖的功能:(對照是地圖變量)

public static function CreateThumbstick(mActorType:ActorType, mLocation:Int, mDirectionLock:Int) 
    { 
     var controllerName = "Thumbstick"+mLocation; 
     if(!controls.exists(controllerName)){ 

      createRecycledActor(mActorType, 0, 0, Script.FRONT); 
      var lastActor = getLastCreatedActor(); 
      var myPosition = GetPosition(controllerName, lastActor); 
      lastActor.setX(myPosition.x); 
      lastActor.setY(myPosition.y); 
      var myPos = new Vector2(lastActor.getXCenter(), lastActor.getYCenter());    
      var controlUnit = new ControlUnit(lastActor, myPos, -1); 
      controls.set(controllerName, controlUnit); 

      trace("added key: " + controllerName +" with value: "+ lastActor); 
     } else { 
      trace("!!WARNING!! Control unit already exists in this position. Command ignored!"); 
     } 
    } 

在創建3個搖桿,該日誌的狀態執行以下操作:

added key: Thumbstick1 with value: [Actor 1,Thumbstick] 
added key: Thumbstick2 with value: [Actor 2,Thumbstick] 
added key: Thumbstick3 with value: [Actor 3,Thumbstick] 

當屏幕被觸摸,它應該循環遍歷我地圖中的每個項目,但它使用最後一次添加的項目3次來檢查距離,而不是所有3個項目一次。這裏是正在調用的時候,屏幕被觸摸監聽器:

addMultiTouchStartListener(function(event:TouchEvent, list:Array<Dynamic>):Void 
     { 
      for (unit in controls){ 
       trace(lastDebugLine + "checking distance to " + unit.GetActor()); 
       if(GetDistance(unit.GetCenter(), touch.GetPosition()) < 64){ 
        break; 
       } 
      } 
     }); 
// used "touch.GetPosition()" instead of actuall code for easy reading. This is not causing any problems! 

在觸摸屏幕時,日誌指出以下幾點:

checking distance to [Actor 3,Thumbstick] 
checking distance to [Actor 3,Thumbstick] 
checking distance to [Actor 3,Thumbstick] 

我很新的HAXE語言,所以我的猜測是我錯過了一些明顯的東西,即使我非常密切地關注了Haxe API。這是從Haxe API頁面使用的示例:

var map4 = ["M"=>"Monday", "T"=>"Tuesday"];  
for (value in map4) { 
    trace(value); // Monday \n Tuesday 
} 

歡迎所有解釋!

新增控制單元類:

import com.stencyl.models.Actor; 

class ControlUnit 
{ 
    static var actor; 
    static var center; 
    static var touchID; 

    public function new(mActor:Actor, mPosition:Vector2, mTouchID:Int) 
    { 
     actor = mActor; 
     center = mPosition; 
     touchID = mTouchID; 
    } 

    public function GetActor():Actor{ 
     return(actor); 
    } 

    public function GetCenter():Vector2{ 
     return(center); 
    } 

    public function GetTouchID():Int{ 
     return(touchID); 
    } 
} 
+0

你確定這三個「檢查距離」痕跡都來自同一幀?可能是Actor 3是第一個循環並且距離適合的入口項目,所以循環停止('break')。嘗試在'for'之前加上'trace(「------」);''之前要有分隔符。 – Gama11

+0

是的,我確定。我在測試中實際上並沒有使用痕跡,但我使用它來輕鬆閱讀。在實際測試中,我將這些曲線添加到開始循環前清除的列表中,並將它們顯示在屏幕上。 – sdieters

+0

你調試過'unit.GetCenter()','touch。GetPosition()'和'GetDistance(unit.GetCenter(),touch.GetPosition())'在循環內? –

回答

3

您剛剛在類定義中使用'static'作爲變量 - 它們不是實例感知/基於的。 檢查「屬性」,獲得者,制定者等在https://haxe.org/manual/class-field-property.html

+0

聽起來可能是這個問題。當我回家時,我會先試試它。我之所以做靜態的原因是因爲我不斷收到錯誤,如「不能在靜態函數中使用非靜態變量」(或沿着這些行的東西),所以默認情況下我聲明它們是靜態的。當使用這些getter和setter時,它是否仍然很重要,我使變量是靜態的還是不變的? – sdieters

+0

這是問題!感謝你們所有人的解釋! – sdieters

+0

這對了解所有這些依賴者很重要,可悲的是他們沒有清楚解釋。 隨意使用https://try.haxe.org/#807e4 – xadm

1

你肯定getLastCreatedActor()正在返回每次一個單獨的實例?如果它每次都會返回相同的實例,那麼您可能會看到自己正在獲取的內容。

+0

是的。在第一個日誌中,您可以看到每個映射鍵都擁有不同的演員。 – sdieters

+0

但是,如果在初始循環中每個步驟都返回並重命名相同的實例,則會得到相同的輸出。 –

+0

這不是同一個實例。 Actor1,Actor2和Actor3是3個不同的實例。您可以在第一個日誌中清楚地看到它使用不同的鍵將這3個不同的演員添加到我的地圖中。 – sdieters

1

是不是因爲你所有的鍵映射到相同的值?嘗試將它們映射到不同的值並進行測試。

+0

他們沒有。檢查第一個日誌。您可以清楚地看到按鍵「Thumbstick1,Thumbstick2,Thumbstick3」正在持有「Actor1,Actor2,Actor3」。這是他們被添加到我的地圖的時刻。 – sdieters

1

我的猜測是,這3個相同的痕跡實際上來自不同的回調/不同的框架。

Map iteration order is undefined,並且因目標而不同。例如,在JavaScript目標上運行您的獨立示例,它會跟蹤Monday, Tuesday,它通過巧合符合與條目添加順序相同。在Python中,順序顛倒:Tuesday, Monday

如果「Actor 3」碰巧是循環迭代的第一個項目,它匹配GetDistance()條件,break語句將立即停止循環,因此不檢查/跟蹤任何其他項目。

+0

我應該更清楚「觸摸屏幕」。但是當我這樣做的時候,我觸摸屏幕外的距離。就像我在另一個回覆中評論的那樣,在我自己的測試中,我實際上是將這些跟蹤添加到進入循環之前清除的列表中,並將它們顯示在屏幕上。所以這是事實並非如此。 – sdieters

+1

然後我建議更多的隔離這個問題,我認爲你的問題沒有足夠的上下文來找出問題所在。一個可編譯的小代碼片段將會有很大幫助。 – Gama11

+0

好吧,當我再次回家時,請看我能做些什麼。問題在於,這是Stencyl遊戲引擎的擴展的一部分,因此您必須下載該代碼才能使用代碼段。 – sdieters