【问题标题】:Haxe : Override `Dynamic` class attribute typeHaxe:覆盖“动态”类属性类型
【发布时间】:2015-05-25 23:34:11
【问题描述】:

我正在使用 phaser 游戏框架的 Haxe 目标 JavaScript。

这个框架有一个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.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


【解决方案1】:

我使用引用body 的类属性解决了这个问题,但使用了强制转换。

var arcadeBody: Arcade.Body;

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

正如@D-side 所指出的,也可以从ArcadeSprite 类继承Sprite,该类被赋予了body 属性。

【讨论】:

    猜你喜欢
    • 2013-04-05
    • 2019-09-29
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    相关资源
    最近更新 更多