HaxeFlixel: наложение графики на один спрайт - PullRequest
0 голосов
/ 25 июня 2018

У меня есть код, чтобы сгенерировать спрайт-лист аватара игрока, потянув за каждый отдельный элемент тела / одежды и наложив его в определенном порядке. По сути, я пытаюсь объединить листы одежды в одно тело, кладя их друг на друга.

Но окончательный результат - это ТОЛЬКО последний предмет одежды, нарисованный.

Вот два фрагмента кода, которые я использую для этого:

public function new(_username:String) 
{
    super();

    itemArray = new Array<String>();
    itemArray[0] = "Body";
    itemArray[1] = "Shoes";
    this.pixels = new BitmapData(Std.int(itemRect.width), Std.int(itemRect.height));

    for (itemName in itemArray)
    {
        //this.pixels.draw(prepareItem(itemName).pixels);
        var itemSprite:FlxSprite = prepareItem(itemName);
        stamp(itemSprite);
    }
}

private function prepareItem(assetName:String):FlxSprite
{
    var assetSprite:FlxSprite = new FlxSprite();
    assetSprite.loadGraphic("assets/images/" + assetName + ".png");

    assetSprite.pixels.threshold(assetSprite.pixels, itemRect, new Point(0, 0), "==", 0xFF00FF00);
    assetSprite.pixels.threshold(assetSprite.pixels, itemRect, new Point(0, 0), "==", 0xFFFF0000);

    return assetSprite;
}

Как вы можете видеть, я пытался использовать draw() для рисования пикселей на существующем BitmapData,и я также пытаюсь штамповать спрайты, сгенерированные из изображений одежды.

Я прилагаю пример, чтобы прояснить мою цель.Обратите внимание, как обувь наложена на тело.Но с моим текущим кодом обувь полностью заменяет корпус.

Example

Body Shoes

1 Ответ

0 голосов
/ 25 июня 2018

Но окончательный результат - это ТОЛЬКО последний предмет одежды.

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

Исправление простое: вам нужно компенсировать последующие спрайты в вашем вызове stamp(), например, так, если вы хотитесложить активы вертикально:

var currentY = 0;
for (itemName in itemArray)
{
    var itemSprite:FlxSprite = prepareItem(itemName);
    stamp(itemSprite, 0, currentY);
    currentY += Std.int(itemSprite.height);
}
...