有没有办法将 alpha 蒙版应用于 FlxCamera?

Is there a way to apply an alpha mask to a FlxCamera?

我正在尝试实施 this camera but one of the obstacles I'm facing right now, is the merging of two cameras (what he describes here)。

起初我尝试制作一个非矩形相机,但我认为如果不改变 HaxeFlixel 渲染方式中的很多东西是不可能的。

然后我在 FlxSpriteUtil 包中找到了 alphaMask() 函数,我认为这将是一个更好的解决方案。 它不仅可以解决我的问题,它实际上还允许使用各种形状奇特的相机,您只需要创建正确的遮罩即可!

但新的问题是我不知道如何(再说一次,如果可以不改变一点 FlxCamera)将它应用于相机。

在内部,FlxCamera 可能会使用 FlxSprite,但仅限于 blit 渲染模式,而我处于平铺渲染模式(尚未找到如何更改,不够好的解决方案我的意见),它使用 Flash Sprite 代替,我不知道如何处理它。

简而言之,您知道如何将 AlphaMask 应用于 FlxCamera 吗?或实现我想要做的事情的另一种方式?

PS: 想看(丑陋且法文评论)的代码,完了here

您可以将 FlxCamera 的内容呈现为 FlxSprite(尽管它确实需要基于呈现模式的条件代码)。 TurnBasedRPG tutorial game战斗界面的波浪效果就是用这个,见CombatHUD.hx:

if (FlxG.renderBlit)
    screenPixels.copyPixels(FlxG.camera.buffer, FlxG.camera.buffer.rect, new Point());
else
    screenPixels.draw(FlxG.camera.canvas, new Matrix(1, 0, 0, 1, 0, 0));

下面是一个使用它来创建 HaxeFlixel 形状相机的代码示例:

package;

import flixel.tweens.FlxTween;
import flash.geom.Matrix;
import flixel.FlxCamera;
import flixel.FlxG;
import flixel.FlxSprite;
import flixel.FlxState;
import flixel.graphics.FlxGraphic;
import flixel.system.FlxAssets;
import flixel.util.FlxColor;
import openfl.geom.Point;
using flixel.util.FlxSpriteUtil;

class PlayState extends FlxState
{
    static inline var CAMERA_SIZE = 100;

    var maskedCamera:FlxCamera;
    var cameraSprite:FlxSprite;
    var mask:FlxSprite;

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

        maskedCamera = new FlxCamera(0, 0, CAMERA_SIZE, CAMERA_SIZE);
        maskedCamera.bgColor = FlxColor.WHITE;
        maskedCamera.scroll.x = 50;
        FlxG.cameras.add(maskedCamera);

        // this is a bit of a hack - we need this camera to be rendered so we can copy the content
        // onto the sprite, but we don't want to actually *see* it, so just move it off-screen
        maskedCamera.x = FlxG.width;

        cameraSprite = new FlxSprite();
        cameraSprite.makeGraphic(CAMERA_SIZE, CAMERA_SIZE, FlxColor.WHITE, true);
        cameraSprite.x = 50;
        cameraSprite.y = 100;
        cameraSprite.cameras = [FlxG.camera];
        add(cameraSprite);

        mask = new FlxSprite(FlxGraphic.fromClass(GraphicLogo));

        var redSquare = new FlxSprite(0, 25);
        redSquare.makeGraphic(50, 50, FlxColor.RED);
        add(redSquare);
        FlxTween.tween(redSquare, {x: 150}, 1, {type: FlxTween.PINGPONG});
    }

    override public function update(elapsed:Float):Void
    {
        super.update(elapsed);

        var pixels = cameraSprite.pixels;
        if (FlxG.renderBlit)
            pixels.copyPixels(maskedCamera.buffer, maskedCamera.buffer.rect, new Point());
        else
            pixels.draw(maskedCamera.canvas);

        cameraSprite.alphaMaskFlxSprite(mask, cameraSprite);
    }
}