Haxe for 循环只使用最后一项
Haxe for loop only uses last item
经过几个小时的测试后,我发现我的地图包含正确的值,但我正在使用的循环似乎只使用了这张地图中最后添加的值。我在这里遗漏了一些明显的东西吗?
向地图添加项目的函数:(控件是地图变量)
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
}
欢迎各种解释!
已添加控制单元class:
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);
}
}
您确定 getLastCreatedActor()
每次都返回一个单独的实例吗?如果它每次都返回相同的实例,您可能会看到您得到的结果。
这不是因为您所有的键都映射到相同的值吗?尝试将它们映射到不同的值并进行测试。
您刚刚在 class 定义中对变量使用了 static
- 它们不是实例 aware/based。
在 https://haxe.org/manual/class-field-property.html
中检查 'properties'、getter、setter 等
经过几个小时的测试后,我发现我的地图包含正确的值,但我正在使用的循环似乎只使用了这张地图中最后添加的值。我在这里遗漏了一些明显的东西吗?
向地图添加项目的函数:(控件是地图变量)
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
}
欢迎各种解释!
已添加控制单元class:
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);
}
}
您确定 getLastCreatedActor()
每次都返回一个单独的实例吗?如果它每次都返回相同的实例,您可能会看到您得到的结果。
这不是因为您所有的键都映射到相同的值吗?尝试将它们映射到不同的值并进行测试。
您刚刚在 class 定义中对变量使用了 static
- 它们不是实例 aware/based。
在 https://haxe.org/manual/class-field-property.html