【发布时间】:2017-05-27 21:59:01
【问题描述】:
我是haxe openfl 的新手,我以前用flash 和starling 开发游戏,我对从flash 到openfl haxe 的转换感到困惑。
public class StarlingPool
{
public var items:Array;
private var counter:int;
public function StarlingPool(type:Class, len:int)
{
items = new Array();
counter = len;
var i:int = len;
while(--i > -1)
items[i] = new type();
}
public function getSprite():DisplayObject
{
if(counter > 0)
return items[--counter];
else
throw new Error("You exhausted the pool!");
}
public function returnSprite(s:DisplayObject):void
{
items[counter++] = s;
}
public function destroy():void
{
items = null;
}
}
这是由 Lee Brimelow 创建的 Starling Pool Class 我想知道如何将其转换为 Haxe,
我试过了 -
class StarlingPool
{
public var items:Array<Class>;
private var counter:Int;
public function new(type:Class<Dynamic>, len:Int)
{
items = new Array<Class<Dynamic>>();
counter = len;
var i:Int = len;
while (--i > -1)
items[i] = type;
}
public function getSprite():Class<Dynamic>
{
if (counter > 0)
return items[--counter];
else
throw new Error("You exhausted the pool!");
return null;
}
public function returnSprite(s:Dynamic):Void
{
items[counter++] = s;
}
public function destroy():Void
{
items = null;
}
}
但是我不工作,也许我没有正确地投射它?, 例如 -
pool = new StarlingPool(Bullet, 100);
var b:Bullet = cast(pool.getSprite()); //or
var b:Bullet = cast(pool.getSprite(),Bullet)
【问题讨论】:
-
您将项目定义为
Array<Class>,然后将其重新定义为Array<Class<Dynamic>>?这对我来说相当荒谬。 -
即使你没有这样做,你实际上是在将一个
Class对象返回到一个被强制转换为该Class实例的东西。在您的池类中的某个地方,您需要实例化该对象,可能通过Typestdlib。 -
请注意原始代码中
items[i] = new type()的行。这实际上是在实例化该类的一个对象。你不是。 -
对不起,这只是一个粗略的例子,我这样做是因为我实际上不知道如何在 haxe 中做到
new type()。 Haxe 不会假设这种语法。 -
是的,这听起来可能比我的意思更消极。看看 std lib 中的
Type类,它应该有你需要的。
标签: html haxe starling-framework openfl