HaxeFlixel:使对象在特定区域消失

HaxeFlixel: make object disappear in certain area

我正在尝试制作一款游戏,您可以在其中捕捉在空中随机移动的浮动灯光。在游戏中将有 3 个不同的盒子,您可以在其中放置浮动灯,因此也将有 3 个不同的灯。

灯光正常工作,我可以随心所欲地拖动它们。

我的问题是如何捕捉它们并重新生成它们。我想使用您在 flixel.FlxNapeSprite.

中找到的 kill() 方法

当你抓住它们时,你应该将它们移到正确的盒子里,当它们进入盒子时,它们应该被杀死,你会得到分数,并重新生成一个新的随机灯。

Link to image 到目前为止的比赛

如何杀死某个区域内的光体?

我想这些盒子也是 FlxNapeSprite 吧?通常,您会在此处设置一个碰撞回调,每当两个颈背体(在本例中为灯光和盒子)的碰撞箱重叠时调用该回调。您可以使用 napeDebugEnabled = true 或按 flixel 调试器覆盖图右上角的 "N" 按钮显示颈背体。

这里有一个简单的例子,说明如何使用 Flixel + Nape 设置简单的碰撞回调:

package;

import flixel.addons.nape.FlxNapeSprite;
import flixel.addons.nape.FlxNapeState;
import flixel.util.FlxColor;
import nape.callbacks.CbEvent;
import nape.callbacks.CbType;
import nape.callbacks.InteractionCallback;
import nape.callbacks.InteractionListener;
import nape.callbacks.InteractionType;
import nape.phys.BodyType;
using flixel.util.FlxSpriteUtil;

class PlayState extends FlxNapeState
{
    override public function create()
    {
        super.create();
        bgColor = FlxColor.BLACK;
        napeDebugEnabled = true;

        var light = new Light(10, 10);
        var box = new Box(10, 100);

        add(light);
        add(box);

        light.body.velocity.y = 200;

        FlxNapeState.space.listeners.add(new InteractionListener(
            CbEvent.BEGIN, 
            InteractionType.COLLISION, 
            Light.CB_TYPE,
            Box.CB_TYPE,
            collideLightBox));
    }

    function collideLightBox(callback:InteractionCallback)
    {
        var light:Light = cast callback.int1.castBody.userData.sprite;
        light.kill();
    }
}

class Light extends FlxNapeSprite
{
    public static var CB_TYPE(default, null) = new CbType();

    public function new(x:Float, y:Float)
    {
        super(x, y);
        makeGraphic(10, 10, FlxColor.TRANSPARENT);
        var radius = 5;
        drawCircle(5, 5, radius, FlxColor.WHITE);
        createCircularBody(radius);
        body.cbTypes.add(CB_TYPE);
        // we need this to get the Light instance in the callback later
        body.userData.sprite = this;
    }
}

class Box extends FlxNapeSprite
{
    public static var CB_TYPE(default, null) = new CbType();

    public function new(x:Float, y:Float)
    {
        super(x, y);
        makeGraphic(100, 50, FlxColor.GREEN);
        createRectangularBody(width, height);
        body.cbTypes.add(CB_TYPE);
        body.type = BodyType.STATIC;
    }
}

一定要查看官方 FlxNape demo. The Nape website 还有一些非常有用的示例 + 文档。