如何移动 HaxeFlixel FlxNapeSprite?

How to move a HaxeFlixel FlxNapeSprite?

我正在尝试将 Nape 与 HaxeFlixel 一起使用。遗憾的是,几乎没有关于如何使用 addons.nape 包的文档,我只是想不通为什么这段代码没有移动白色矩形 (_test)。 (为简单起见,我省略了进口)

class PlayState extends FlxNapeState
{
    var _test = new FlxNapeSprite(16, 16);

    override public function create():Void
    {
        super.create();

        _test.makeGraphic(16, 16);
        _test.body.type = BodyType.KINEMATIC;
        add(_test);
    }

    override public function update():Void
    {
        _test.body.velocity.x = 100;
        super.update();
    }   
}

您的代码有两个问题:

  1. 直接初始化 _test 变量会导致 FlxNapeSprite 构造函数调用发生在 PlayState 的构造函数中。 create() 在 状态构造函数之后被调用 。这可能会导致崩溃和其他奇怪的行为,因为 Flixel 在 新状态的构造函数调用和 create() 之间进行内部清理 (例如,在这种情况下,图形被处理Nape Space 实例尚不存在,因为它是在 super.create() 调用中创建的。

  2. FlxNapeSprite 构造函数有一个 createRectangularBody 参数,默认为 true 并在 true 时调用同名函数。由于您没有将任何资产传递给构造函数,它最终会创建一个宽度和高度为 0 的 Shape。这会导致以下错误:

    Error: Cannot simulate with an invalid Polygon

    相反,您需要在 makeGraphic() 之后手动调用 createRectangularBody() 以创建与图形尺寸匹配的 Shape

完整的工作代码如下所示:

package;

import flixel.addons.nape.FlxNapeSprite;
import flixel.addons.nape.FlxNapeState;

class PlayState extends FlxNapeState
{
    override public function create():Void
    {
        super.create();

        var _test = new FlxNapeSprite(16, 16);
        _test.makeGraphic(16, 16);
        _test.createRectangularBody();
        _test.body.velocity.x = 100;
        add(_test);
    }
}

关于文档,FlxNape demo 是一个很好的学习资源。