Перелистывание BitmapData по горизонтали во Flash 9 или 10 - PullRequest
1 голос
/ 12 февраля 2009

От имени моего коллеги спрашиваю:

Мы работаем над приложением Facebook, которое использует Flash 9 (и Flex, но это не очень актуально).

У нас есть довольно сложная система рисования объекта с аксессуарами над ним, где аксессуары могут иметь произвольный масштаб, поворот и положение относительно базового объекта.

Недавно мы начали добавлять дополнительные функции, в том числе возможность переворачивать объекты по горизонтали. Для аналогичной, но не идентичной части приложения мы можем просто применить отрицательный горизонтальный масштаб, чтобы перевернуть объект по горизонтали.

Однако мы застряли при попытке нарисовать объекты вручную с помощью graphics api и graphics.beginBitmapFill (). Согласно некоторым результатам поиска, мы должны быть в состоянии выполнить это, назначив отрицательный горизонтальный масштаб матрице, переданной в beginBitmapFill (), но это не работает.

Есть идеи?

edit: Спасибо, ребята. Мы будем их тестировать, и я дам вам знать, как это работает.

изменить: я выбрал один! Мой коллега сказал: «Возможно, другой тоже работает, но просто ... нет». :)

Ответы [ 2 ]

3 голосов
/ 12 февраля 2009

Как строится ваша матрица? Вам нужно также убедиться, что вы перевернули шкалу х, чтобы вы снова перевели ее обратно по всей ширине. Вот пример с MovieClip на сцене, где он затем рисуется в растровом изображении и переворачивается по горизонтали

import flash.display.*;
import flash.geom.*;

var toFlip : MovieClip;

var matrix : Matrix = new Matrix();
matrix.scale(-1,1);
matrix.translate(toFlip.width, 0);

var bitmapData : BitmapData = new BitmapData(toFlip.width, toFlip.height, false, 0xFFFF0000);
bitmapData.draw(toFlip, matrix);
var bitmap : Bitmap = new Bitmap(bitmapData);

addChild(bitmap);
1 голос
/ 12 февраля 2009

Итак, это может быть неэффективно на 100%, но если вы передадите ему объект BitmapData, он вернет вам точно такой же перевернутый горизонталь.

function flipBitmapDataHorizontal (b:BitmapData):BitmapData
{
    var pixelList:Array = new Array();
    var pixelIndex:uint = 0;

    var i:uint;
    var j:uint;

    for(i = 0; i<b.height; i++){
        for(j = b.width; j>0; j--){
            var nextPixel:uint = b.getPixel32(j,i);
            pixelList.push(nextPixel);
            pixelIndex++;
        }
    }

    var newB:BitmapData = new BitmapData(b.width,b.height);
    var curPixel:uint = 0;

    for(i = 0; i<b.height; i++){
        for(j = 0; j<b.width; j++){
            newB.setPixel32(j,i,pixelList[curPixel++]);
        }
    }

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