【发布时间】:2015-05-25 23:34:11
【问题描述】:
我正在使用 phaser 游戏框架的 Haxe 目标 JavaScript。
这个框架有一个Sprite 类,可以受益于两个不同的物理引擎(但不能同时使用两者),Arcade 或P2。
我是这样扩展的:
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.Body 或 P2.Body,具体取决于您绑定到精灵的物理引擎。
所以body 在Sprite 类定义中输入为Dynamic,我想在我的Player 类中指定它是Arcade.Body 还是P2.Body,这样我就可以受益于自动-完成和类型安全。
到目前为止我的研究:
- 我试图覆盖
var body: Arcade.Body之类的属性。编译器对此不满意 - 我在
Player的每个方法中都使用了一个局部变量,例如var arcadeBody = cast(body as Arcade.Body)。不优雅,多余
提前致谢!
【问题讨论】:
-
将
arcadeBody存储为类级变量,而不是在每个函数中将其作为局部变量?我想不出一个优雅的解决方案。 -
我会坚持这个解决方案。我只是想知道在 Haxe 中是否有任何奇特的方法可以做到这一点
-
我只是在查找
haxe.extern.EitherType的用法后删除了我的答案,因为它不适合这里。它仅适用于可能采用多种类型参数的外部函数的参数定义。我在想,我在想:\ -
到目前为止,我看到的唯一明智的出路是将
Sprite子类化,每个物理系统一次。这样您就可以确定您的Sprite实际包含什么物理体。 -
@YannP 有机会想出一个更好的名字,呵呵 :D 写一个关于你最终做了什么的答案。
标签: dynamic types attributes haxe phaser-framework