Как заставить прозрачность работать с растровым изображением в Actionscript - PullRequest
3 голосов
/ 24 апреля 2011

Для классного проекта я работаю над "Pissed Off Pigs" (я думаю, вы поняли идею, свиньи мстят, не волнуйтесь, я не собираюсь выпустить это!), И я хочу создатькруги с заливкой из растрового изображения (круги, потому что математика столкновений легче).Вот как они выглядят сейчас.

How my Pigs look now

Конечно, проблема в белом.Ниже мой класс "свиней".Есть идеи?Я пробовал gif, pngs, 8-bit pngs и т. Д., И, похоже, ничего не изменилось.Само изображение имеет площадь 20 пикселей, а радиус круга - 10 пикселей (то есть диаметр 20 пикселей).Вот изображение, которое я использую: My Pig Image

И я знаю, что, вероятно, мне следует загрузить изображение вне класса и просто передать BitmapData, когда я создаю новую свинью, чтобы мне не нужно было загружатьизображение каждый раз, когда я создаю новую свинью, но пока она работает!(Sorta).

Матрица переводит проблему?

О, и я проверил bmpImage.transparent, и он возвращает true (даже если я не указываю true в конструкторе).

`package {import flash.display. ;импорт flash.net. ;импорт flash.events. ;импорт flash.geom. ;import flash.display.BitmapDataChannel;

public class pig extends Sprite {
    public var radius:uint;
    public var velocity:Vec2;
    public var tt:Sprite;
    public var pigLoader:Loader;
    public var bmpImage:BitmapData;
    public var framesAlive:uint;


    public function pig(xx:uint, yy:uint, radius:uint, vx:Number, vy:Number, sprite:String){
        this.x = xx;
        this.y = yy;
        this.radius = radius;

        this.velocity = new Vec2(vx, vy);

        pigLoader = new Loader();
        pigLoader.load(new URLRequest(sprite));
        pigLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, picLoaded);

    }
    private function picLoaded(event:Event):void {
        bmpImage = new BitmapData(pigLoader.width, pigLoader.height, true);
        bmpImage.draw(pigLoader);
        tt = new Sprite();
        var matrix:Matrix;
        matrix = new Matrix();
        matrix.translate( -10, -10);
        tt.graphics.beginBitmapFill(bmpImage, matrix, false, false);
        tt.graphics.drawCircle(0, 0, this.radius)
        tt.graphics.endFill();
        this.addChild(tt);
    }
}

} ​​

`

Ответы [ 2 ]

2 голосов
/ 24 апреля 2011

Вы слишком усложнили проблему. Растровое заполнение обычно используется, когда вы хотите заполнить большую область мозаичным рисунком, а рисунок происходит из растрового изображения (например, обоев), вам не нужно здесь его использовать. То, что вы должны делать, это использовать растровое изображение Loader.content. Вам не нужно использовать draw () или матрицу, просто используйте .x и .y, чтобы переместить растровое изображение свиньи в центр над точкой спрайта (0,0), если это центр круга, который вы используете для обнаружения столкновений.

У вашего свиного спрайта нет причин иметь визуальный круг для обнаружения коллизий по кругу. Визуальное представление не должно иметь никакого значения для вашего обнаружения столкновений вообще. Обнаружение столкновений на основе окружностей обычно является просто применением формулы расстояния Пифагора, т. Е. Если расстояние между центрами меньше (или равно) суммы радиусов проверяемых окружностей, у вас есть перекрытие (столкновение).

Что если вы замените эту последнюю функцию следующим:

private function picLoaded(event:Event):void
{
    var pigPic:Bitmap = event.target.loader.content;
    pigPic.x -= 10;
    pigPic.y -= 10;
    this.addChild(pigPic);
}
1 голос
/ 24 апреля 2011

для того, чтобы иметь функциональный альфа-канал на холсте bitmapData, необходимо установить нулевой альфа-канал для 32-разрядного шестнадцатеричного значения (0x00FFFFFF) свойства fillColor объекта BitmapData до рисования.

package
{
//Imports
import flash.display.Sprite;
import flash.display.Shape;
import flash.display.Bitmap;
import flash.display.BitmapData;

//SWF Metadata Tag
[SWF(width = "1000", height = "500", frameRate = "30", backgroundColor = "#000000")]

//Class
public class Test extends Sprite
    {
    //Constructor
    public function Test()
        {       
        var sh:Shape = new Shape();
        sh.graphics.beginFill(0xFF0000, 1.0);
        sh.graphics.lineTo(200, 200);
        sh.graphics.lineTo(0, 200);
        sh.graphics.lineTo(0, 0);
        sh.graphics.endFill();

        var shBitmapData:BitmapData = new BitmapData(sh.width, sh.height, true, 0x00FFFFFF); //32-bit Hex Value
        shBitmapData.draw(sh);

        addChild(new Bitmap(shBitmapData));
        }
    }
}

поменяйте его на значение по умолчанию 0xFFFFFFFF, чтобы увидеть разницу.

...