我正在尝试实现 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/