camera - 有没有办法将 alpha mask 应用于 FlxCamera?

标签 camera haxe haxeflixel

我正在尝试实现 this camera但我现在面临的障碍之一是两个摄像头的合并(他所描述的 here )。

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

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

但新的问题是我不知道如何(再次强调,如果可以在不更改 FlxCamera 的情况下)将其应用到相机。

在内部,FlxCamera 可能使用 FlxSprite,但仅限于 blit 渲染模式,而我处于图 block 渲染模式(尚未找到如何更改,不在我看来,这是一个足够好的解决方案),它使用 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);
    }
}

关于camera - 有没有办法将 alpha mask 应用于 FlxCamera?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48075991/

相关文章:

Python 没有从 Raspberry Pi 相机以最高分辨率拍照

macros - 如何在 Haxe 宏函数中声明实例化

trace - HaxeFlixel 跟踪

rotation - 在 HaxeFlixel 中旋转 Sprite

Android 切换相机闪光灯

android - getDefaultDisplay().getRotation();总是返回相同的值

camera - GStreamer 管道不会预卷

javascript - 使用 Haxe 访问外部 JavaScript 库

javascript - 是否可以让 Angularjs 使用原型(prototype)方法和变量

haxe - 如何退出 Haxe/OpenFL 程序?