Есть ли способ применить альфа-маску к FlxCamera?

Я пытаюсь реализовать эту камеру, но одно из препятствий, с которым я сталкиваюсь теперь это слияние двух камер (то, что он описывает здесь).

Сначала я пытался сделать непрямоугольную камеру, но не думаю, что это возможно без изменения многих вещей в способе рендеринга HaxeFlixel.

А потом я нашел функцию alphaMask() в пакете FlxSpriteUtil и думаю, это было бы лучшим решением. Это не только решило бы мою проблему, но и разрешило бы все виды камер необычной формы, вам просто нужно создать правильную маску!

Но новая проблема в том, что я не знаю, как (и опять же, если это возможно, не меняя немного FlxCamera) применить его к камере.

Внутренне FlxCamera может использовать FlxSprite, но только в режиме блитового рендеринга, а я нахожусь в режиме рендеринга тайлов (не нашел, как изменить, на мой взгляд, недостаточно хорошее решение), который вместо этого использует Flash Sprite, и я не не знаю, что с этим делать.

Короче говоря, у вас есть идея, как применить AlphaMask к FlxCamera? Или другой способ добиться того, что я пытаюсь сделать?

PS: Если вы хотите взглянуть на код (уродливый и с французскими комментариями), он закончился здесь!


person Epono    schedule 03.01.2018    source источник


Ответы (1)


Вы можете визуализировать содержимое FlxCamera в FlxSprite (хотя для этого требуется условный код, основанный на режиме рендеринга). В обучающей игре TurnBasedRPG это используется для эффекта волны на экране боя, см. 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);
    }
}
person Gama11    schedule 03.01.2018
comment
Большое спасибо! Я мало что знала, когда делала туториал и не зарегистрировалась, так оно и было :) Я попробую позже и дам вам знать, как все прошло! - person Epono; 03.01.2018