Использование растровых данных для рисования массивного изображения - PullRequest
1 голос
/ 18 февраля 2011

Я играю в сноуборд в AS3. У меня проблема в том, что я хочу оставить след в снегу за доской.

Я думал и чувствую, что лучший способ добиться этого - использовать метод lineTo (), чтобы нарисовать линию от предыдущей позиции сноубордов до ее текущей позиции. Если я сделаю это полностью вниз по склону, я получу линию длиной почти 23000 пикселей, которая кажется чрезвычайно большой и сильно повлияет на производительность.

Если бы я конвертировал фрагмент фильма в растровое изображение, это улучшило бы производительность? Я нацеливаюсь на минимум флэш-плейера 9, который, как я обнаружил, имеет проблемы при обработке bmp более 2880 пикселей, поэтому я думаю, что этот метод может не работать.

Кто-нибудь может придумать чистое и быстрое решение?

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 18 февраля 2011

Вы можете хранить несколько значений в векторе / массиве фиксированной длины и обновлять одно значение, одновременно сдвигая другие (поэтому они немного «устарели»):

var ptsNum:int = 25;
var pts:Vector.<Point> = new Vector.<Point>(ptsNum,true);
for(var i:int = 0 ; i < ptsNum ; i++) pts[i] = new Point(mouseX,mouseY);
this.addEventListener(Event.ENTER_FRAME, update);

function update(event:Event):void{
    //update
    for(var i:int = 0 ; i < ptsNum-1 ; i++) pts[i] = pts[i+1];
    pts[ptsNum-1] = new Point(mouseX,mouseY);
    //draw
    graphics.clear();
    graphics.moveTo(pts[0].x,pts[0].y);
    for(i = 0 ; i < ptsNum ; i++){
        graphics.lineStyle(i,0,i/ptsNum);
        graphics.lineTo(pts[i].x,pts[i].y);
    }
}

Я использую два цикла for в обновлении, чтобы отделить обновление от чертежа, чтобы его было легко понять. Конечно, вы можете использовать один цикл for, если хотите, или использовать что-то вроде forEach () для смены, до вас.

trail

Если вы хотите нарисовать след с помощью BitmapData, вы можете перерисовать прямоугольник (или форму границы) в BitmapData и использовать ColorMatrix для затухания:

var sw:int = stage.stageWidth,sh:int = stage.stageHeight;
var bd:BitmapData = new BitmapData(sw,sh,false,0);
var pMouse:Point = new Point();//previous mouse position
var zero:Point = new Point();
var fade:ColorMatrixFilter = new ColorMatrixFilter([1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0.95,0]);//alpha 0.95
var r:Shape = new Shape();r.graphics.beginFill(0x009900,0.9);r.graphics.drawRect(-10,-15,20,30);//a tall rect
addChild(new Bitmap(bd));
addEventListener(Event.ENTER_FRAME, update);

function update(event:Event):void{
    r.x = mouseX;
    r.y = mouseY;
    r.rotation = Math.atan2(mouseY-pMouse.y,mouseX-pMouse.x) * 57.2957795;//rotate to mouse
    pMouse.x = mouseX;
    pMouse.y = mouseY;
    bd.draw(r,r.transform.matrix);//draw the rect at it's current position
    bd.applyFilter(bd, bd.rect, zero, fade);//apply the alpha colorMatrix
}

trail with alpha

НТН

1 голос
/ 18 февраля 2011

Как правило, перемещение и масштабирование растровых изображений должно выполняться быстрее, чем векторная графика. Однако, если вы будете часто использовать фильтры и методы модификации пикселей (например, bitmap.draw ()), это снизит производительность. В любом случае, вы всегда должны разделять большие растровые изображения, подобные этим, на более мелкие куски и устанавливать все за пределами видимой области экрана на visible = false;.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...