Haxe for循环仅使用最后一项

时间:2017-07-06 10:59:49

标签: haxe stencyl

经过几个小时的测试后,我发现我的地图包含正确的值,但我使用的循环似乎只是使用了此地图中的最后一个添加值。我错过了一些明显的东西吗?

将项目添加到地图的功能:(控件是地图变量)

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
}

欢迎所有解释!

添加了ControlUnit类:

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);
    }
}

3 个答案:

答案 0 :(得分:3)

您刚刚在类定义中使用static作为变量 - 它们不是基于实例的/基于。 在https://haxe.org/manual/class-field-property.html

中查看“属性”,获取者,设置者等

答案 1 :(得分:1)

您确定getLastCreatedActor()每次都返回一个单独的实例吗?如果每次您可能会看到您正在获得的内容,它会返回相同的实例。

答案 2 :(得分:1)

不是因为你的所有键映射到相同的值吗?尝试将它们映射到不同的值并进行测试。