2015-05-25 93 views
1

我正在使用Haxe瞄准JavaScript使用phaser游戏框架。Haxe:覆盖`动态`类属性类型

此框架有一个Sprite类,它可以受益于两个不同的物理引擎(但不是两者),可以是ArcadeP2

我延伸它是这样的:

class Player extends Sprite { 

    public function new() { 
     super(/* ... */); 
     game.physics.enable(this, Physics.ARCADE); // choose the engine to use on this sprite 
     body.velocity.x = 500; // use the physics engine through the body attribute 
    } 

因为它是一个JavaScript框架,该body属性要么成为Arcade.BodyP2.Body取决于你绑定到精灵哪个物理引擎。

所以bodySprite类定义类型为Dynamic,我想在我的Player类指定无论是Arcade.BodyP2.Body这样我就可以有利于自动完成和类型安全的。

我迄今为止的研究:

  • 我试图重写属性像var body: Arcade.Body。编译器不高兴
  • 我在Player的每个方法中使用了一个局部变量,如var arcadeBody = cast(body as Arcade.Body)。不优雅,多余

在此先感谢!

+1

将'arcadeBody'作为类级变量存储,而不是在每个函数中作为局部变量来存储?我想不出一个优雅的解决方案。 – MSGhero

+0

我会坚持使用这个解决方案。我只是想知道是否有任何奇怪的方式来做到这一点在Haxe – YannP

+0

我查找了'haxe.extern.EitherType'的用法后,我刚刚删除了我的答案,因为它不适合在这里。它只适用于可能需要多种类型参数的外部函数参数的定义。我在想,我在想:\ –

回答

1

我使用类属性来解决该问题,该属性参考了body,但使用了cast。

var arcadeBody: Arcade.Body; 

public function new() { 
    //... 
    this.arcadeBody = cast(this.body, Arcade.Body); 
} 

作为@ d侧指出的那样,它也可以从被赋予一个铸造body属性的ArcadeSprite类继承Sprite