2013-04-11 5 views
0

Я рисую растровые изображения мувиклипов, которые затем я передаю в свою функцию hittest для проверки на наличие столкновений. Тем не менее, я не совсем уверен, как бы добавить код ниже, чтобы принять во внимание и нарисовать растровые изображения для мувиклипов, которые были масштабированы и/или повернуты. Код ниже, очевидно, работает только для не-трансформированных мувиклипов. Я включил в код комментариев, который я уже пробовал, но не добился успеха.Рисование растрового изображения на основе преобразованного movieclip

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

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

  //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); 

Любые мысли? спасибо

+0

Можно ли иметь родителя MC, что вы не преобразования, а затем использовать дро(), чтобы нарисовать _its_ содержимое? –

+0

@amy. Хм, я пробовал это раньше, но, похоже, буквально удаляет дочерний MC. Я уверен, что это можно сделать через Матрицу, я просто не знаю, как это сделать. – Larry

+0

Мой ответ на [этот предыдущий вопрос] (http://stackoverflow.com/questions/14491610/make-visual-clone-of-displayobject-thats-nested-within-other-displayobjects-an/14522452#14522452) имеет фрагмент кода, который создает клон «Bitmap» преобразованного «DisplayObject». Похоже, он может делать то, что вам нужно? (Хотя очевидно, что вы можете избавиться от дополнительного шага позиционирования «битмапа» на сцене). –

ответ

1

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

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; 
} 
+0

. После тестирования немного больше на основе вашего комментария, я думаю, проблема может быть вызвана 'getBounds', возвращающей область, которая больше фактического размера пикселя объекта.Это не имеет никакого значения визуально, но, очевидно, нарушает проверку столкновений. У меня есть некоторые частичные исправления, но я обновлю свой ответ, если найду твердое решение. –

+0

I * думаю * это изменение может помочь. Я скорректировал 'targetOriginOffset', чтобы отменить различия между' getBounds' и фактическим размером 'DisplayObject', и изменил« BitmapData », чтобы просто использовать размер цели. Я предположил, что эти ценности будут одинаковыми, но, видимо, они не являются. –

+0

спасибо, что вы сказали о getBounds, на самом деле заставило меня осознать тупую ошибку в моей функции столкновения, где я использовал границы не трансформированного мувиклипа вместо границ клонированного растрового изображения для проверки на столкновение ... Как это происходит Я использовал вторую версию функции в вашем предыдущем ответе, но она отлично работает с обоими этими ответами, но не с этим ответом, представленным здесь? Я думаю, что буду использовать первую функцию вашего предыдущего ответа. благодаря! – Larry

0

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

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

В вашем случае, что-то вроде этого:

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

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

+0

спасибо, но это не работает, см. Правки выше – Larry

Смежные вопросы