【问题标题】:Haxe for loop only uses last itemHaxe for 循环仅使用最后一项
【发布时间】:2017-07-06 10:59:49
【问题描述】:

经过几个小时的测试,我发现我的地图包含正确的值,但我正在使用的循环似乎只使用了这张地图中的最后一个附加值。我在这里遗漏了什么明显的东西吗?

向地图添加项目的函数:(控件是地图变量)

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

【问题讨论】:

  • 你确定这三个“检查距离”轨迹都来自同一帧吗?可能是 Actor 3 是循环的第一个条目并且距离合适,因此循环停止 (break)。尝试在for 之前放置类似trace("------"); 的内容以作为分隔符。
  • 是的,我确定。我实际上并没有在我的测试中使用跟踪,但我使用它是为了便于阅读。在实际测试中,我将这些跟踪添加到一个列表中,该列表在开始循环之前被清除,并在屏幕上显示。
  • 你在循环内调试过unit.GetCenter()、touch.GetPosition()和GetDistance(unit.GetCenter(), touch.GetPosition())吗?

标签: haxe stencyl


【解决方案1】:

您刚刚在类定义中使用static 来表示变量——它们不是实例感知/基于实例的。 检查https://haxe.org/manual/class-field-property.html中的“属性”、getter、setter 等

【讨论】:

  • 这听起来可能是问题所在。我回家后先试试。我之所以选择静态是因为我不断收到诸如“不能在静态函数中使用非静态变量”(或类似的东西)之类的错误,所以默认情况下我将它们声明为静态。使用这些 getter 和 setter 时,我是否将变量设为静态仍然重要吗?
  • 理解所有这些依赖关系很重要,遗憾的是它们没有得到清楚的解释。随意玩try.haxe.org/#807e4
【解决方案2】:

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

【讨论】:

  • 是的。在第一个日志中,您可以看到每个映射键包含不同的演员。
  • 但如果在初始循环中的每一步都返回并重命名相同的实例,您将获得相同的输出。
  • 不是同一个实例。 Actor1、Actor2 和 Actor3 是 3 个不同的实例。您可以在第一个日志中清楚地看到,它使用不同的键将这 3 个不同的演员添加到我的地图中。
【解决方案3】:

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

【讨论】:

  • 他们没有。检查第一个日志。您可以清楚地看到键“Thumbstick1、Thumbstick2、Thumbstick3”持有“Actor1、Actor2、Actor3”。这是他们被添加到我的地图的时刻。
猜你喜欢
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
相关资源
最近更新 更多