Рисование растрового изображения на основе преобразованного фрагмента ролика

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

При добавлении отрисованного растрового изображения в рабочую область, независимо от того, трансформируется ли рассматриваемый фрагмент ролика или нет, отрисованное растровое изображение «обрезается» и отрисовывается неправильно - кажется, что отрисовывается только его часть. Однако это не особенно влияет на тестирование коллизий для непреобразованных фрагментов ролика, но отрицательно влияет на преобразованные фрагменты роликов.

Все видеоклипы, которые я хочу нарисовать, были созданы с помощью свойства graphics.

           //for example: 
            var mymc:MovieClip = new MovieClip();
            var g:Graphics = mymc.graphics;                        
            g.moveTo(0,0);
            g.lineTo(17.5,0);
            g.lineTo(8.75,17.5);
            g.lineTo(-8.75,17.5);
            g.lineTo(0,0);

основной код:

for each(var mc:MovieClip in impassable) {  

        //var bMatrix:Matrix = new Matrix();

        //bMatrix.scale(mc.scaleX, mc.scaleY);

        //bMatrix.rotate(mc.rotation * (Math.PI/180));

        var bData:BitmapData = new BitmapData(mc.width, mc.height, true, 0);

        //bData.draw(mc, bMatrix);

        bData.draw(mc);

        var bitmap:Bitmap = new Bitmap(bData);

        bitmap.x = mc.x;
        bitmap.y = mc.y;


        var HitTest:Number = newCollision(bitmap, centerX, centerY, 13.7);

Есть предположения? Благодарность


person Larry    schedule 11.04.2013    source источник
comment
Возможно ли иметь родительский MC, который вы не трансформируете, а затем использовать draw () для рисования его содержимого?   -  person Amy Blankenship    schedule 12.04.2013
comment
@Эми. Хм, я пробовал это раньше, но кажется, что он буквально удаляет ребенка MC. Я уверен, что это можно сделать через Матрицу, просто не знаю, как это сделать.   -  person Larry    schedule 12.04.2013
comment
Мой ответ на предыдущий вопрос содержит фрагмент кода, который создает Bitmap клон преобразованного DisplayObject. Похоже, это может сделать то, что вам нужно? (Хотя, очевидно, вы можете избавиться от лишнего шага по размещению Bitmap на сцене).   -  person David Mear    schedule 12.04.2013
comment
@DavidMear Большое спасибо за подробный и детальный фрагмент кода. Кажется, это именно то, что требуется для создания точной копии преобразованного фрагмента ролика и его правильного выравнивания. Однако, несмотря на правильный клон, растровые изображения по-прежнему не работают с моей функцией столкновения ... в любом случае это будет для другого вопроса, если я не могу это понять. Если вы поместите это в ответ, я приму это как свой ответ. Спасибо!   -  person Larry    schedule 13.04.2013
comment
Здорово! Я опубликовал ответ, хотя, если он все еще не работает, мне было бы интересно, добавили ли вы свою функцию столкновения в вопрос. Если вы пытаетесь использовать вторую версию функции в моем предыдущем ответе, она изменяет масштаб растрового изображения, чтобы отменить масштабирование этапа, поэтому это может быть причиной проблемы.   -  person David Mear    schedule 13.04.2013


Ответы (2)


Эта функция создаст BitmapData клон DisplayObject с учетом его матрицы преобразования, но не учитывает фильтры битовых карт. (На основе этого ответ.)

function createBitmapClone(target:DisplayObject):BitmapData {
    var targetTransform:Matrix = target.transform.concatenatedMatrix;
    var targetGlobalBounds:Rectangle = target.getBounds(target.stage);
    var targetGlobalPos:Point = target.localToGlobal(new Point());

    // Calculate difference between target origin and top left.
    var targetOriginOffset:Point = new Point(targetGlobalPos.x - targetGlobalBounds.left, targetGlobalPos.y - targetGlobalBounds.top);

    // Move transform matrix so that top left of target will be at (0, 0).
    targetTransform.tx = targetOriginOffset.x;
    targetTransform.ty = targetOriginOffset.y;

    var cloneData:BitmapData = new BitmapData(targetGlobalBounds.width, targetGlobalBounds.height, true, 0x00000000);
    cloneData.draw(target, targetTransform);

    return cloneData;
}
person David Mear    schedule 13.04.2013
comment
После более тщательного тестирования, основанного на вашем комментарии, я думаю, что проблема может быть вызвана getBounds возвращением области, которая больше фактического размера объекта в пикселях. Визуально это не имеет значения, но явно нарушает проверку на столкновение. У меня есть некоторые частичные исправления, но я обновлю свой ответ, если найду надежное решение. - person David Mear; 13.04.2013
comment
Я думаю, что это изменение может помочь. Я скорректировал targetOriginOffset, чтобы устранить различия между getBounds и фактическим размером DisplayObject, и изменил BitmapData, чтобы просто использовать размер цели. Я предполагал, что эти значения будут идентичными, но, видимо, это не так. - person David Mear; 13.04.2013
comment
спасибо, то, что вы сказали о getBounds, на самом деле заставило меня осознать глупую ошибку в моей функции столкновения, когда я использовал границы непреобразованного мувиклипа вместо границ клонированного растрового изображения для проверки столкновения ... Как это случилось, я использовал вторую версию функции в вашем предыдущем ответе, но она отлично работает с обоими этими ответами, но не с этим ответом, приведенным здесь? Думаю, я воспользуюсь первой функцией вашего предыдущего ответа. Благодарность! - person Larry; 13.04.2013
comment
Ах, я ошибочно тестировал это, клонировав родительский объект, что могло сделать BitmapData слишком большим. Просто запуталась! Я откатил редактирование, но рад, что исходный ответ все еще помог. - person David Mear; 13.04.2013

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

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

В вашем случае примерно так:

var matrix:Matrix = new Matrix();
matrix.createBox(mc.scaleX, mc.scaleY, mc.rotation*Math.PI/180, 0, 0);

(два нуля для перевода x и y)

person Community    schedule 11.04.2013