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

时间:2018-01-03 10:57:13

标签: camera haxe haxeflixel

我正在尝试实施this camera,但我现在遇到的障碍之一是两台摄像机的合并(他所描述的here)。

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

然后我在FlxSpriteUtil包中找到alphaMask()函数,我认为这将是一个更好的解决方案。 它不仅可以解决我的问题,它实际上允许各种时髦形状的相机,你只需要创建正确的面具!

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

在内部,FlxCamera可能会使用FlxSprite,但仅限于blit渲染模式,而且我处于拼贴渲染模式(我认为还没有找到如何更改,不够好的解决方案) ),它使用Flash Sprite而我不知道如何处理它。

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

PS:如果你想查看(丑陋的和法国评论的)代码,那就超过了here

1 个答案:

答案 0 :(得分:2)

您可以将FlxCamera 的内容呈现为 a 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);
    }
}