2017-07-06 62 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