1

У меня есть приложение Flash, где я выполняю операцию масштабирования и вращения вокруг центра _background: MovieClip (представляющий страницу книги). У меня есть простые прослушиватели событий в событиях GESTURE_ROTATE и GESTURE_SCALE этого MC, которые обновляют некоторые переменные currentRotation и currentScaleX, currentScaleY. Затем я вызываю следующий триггер кода в событии ENTER_FRAME приложения.Странные проблемы с стабильностью с матричной шкалой/вращением в Actionscript

Проблема, с которой я сталкиваюсь, заключается в том, чтобы вращать MC за пределы приблизительно 60 или -60 градусов или слегка уменьшаться и вращаться, МС начинает колебаться и, наконец, вращаться без контроля и с экрана. Я пробовал несколько вещей, чтобы отладить его, и даже попытался выполнить Math.flooring currentRotationValue и округлить значения currentScaleX/Y до десятого места (Math.floor (currentScale * 10)/10), но ни один из них, похоже, не исправляет Это. Я немного застрял в этой точке и старался исследовать как можно больше, но ничего не мог найти. Какие-либо предложения? Есть ли проблема с выполнением этой операции для каждого кадра?

private function renderPage(e:Event) { 
    var matrix:Matrix = new Matrix(); 

    // Get dimension of current rectangle. 
    var rect:Rectangle = _background.getBounds(_background.parent); 

    // Calculate the center. 
    var centerX = rect.left + (rect.width/2); 
    var centerY = rect.top + (rect.height/2); 

    // Translating to the desired reference point. 
    matrix.translate(-centerX, -centerY); 

    matrix.rotate(currentRotation/180) * Math.PI); 
    matrix.scale(currentScaleX, currentScaleY); 
    matrix.translate(centerX, centerY); 

    _background.transform.matrix = matrix; 
} 
+0

Как раз мысль, метод getBounds() оценивает эти границы как вертикальный квадрат, а не исходные размеры. Интересно, действительно ли то, что вы действительно ищете, это '.width' /' .scaleX'? – Atriace

+0

@Bradley Bossard Возможно, вы захотите проверить [MatrixTransformer] (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/fl/motion/MatrixTransformer.html), и это метод rotateAround ... –

+0

@ GeorgeProfenza Спасибо Джорджу за предложение. Мне удалось решить мою проблему с помощью ответа ниже, и я немного устарел, чтобы получить его, но я действительно ценю предложение и проведу его в будущем. –

ответ

0

Я не уверен, что поведение, которое вы пытаетесь произвести, но я думаю, что проблема в том, что centerX и centerY определяют середину _background в _background.parent «s координатного пространства. Затем вы переводите matrix так, чтобы _background вращался вокруг значений centerX, centerY, но в _background Координатное пространство.

Предполагая, что вы хотите _background вращаться вокруг точки, которая остается статичным на экране, что вам действительно нужно сделать, это использовать две разные Points:

matrix.translate(-_rotateAroundPoint.x, -_rotateAroundPoint.y); 

matrix.rotate(currentRotation/180) * Math.PI); 
matrix.scale(currentScaleX, currentScaleY); 

matrix.translate(_centerOnPoint.x, _centerOnPoint.y); 

Где _rotateAroundPoint это точка, вокруг которой _background должен обратиться в это собственное координатное пространство, и _centerOnPoint - это точка, вокруг которой он должен повернуть свое координатное пространство ..

Оба эти значения необходимо пересчитать только тогда, когда вы хотите скопировать _background, а не каждый кадр. Например:

private var _rotateAroundPoint:Point = new Point(_background.width * 0.5, _background.height * 0.5); 
private var _centerOnPoint:Point = new Point(50, 50); 

private function renderPage(e:Event) { 
    var matrix:Matrix = new Matrix(); 

    matrix.translate(-_rotateAroundPoint.x, -_rotateAroundPoint.y); 

    matrix.rotate((currentRotation/180) * Math.PI); 
    matrix.scale(currentScaleX, currentScaleY); 
    matrix.translate(_centerOnPoint.x, _centerOnPoint.y); 

    _background.transform.matrix = matrix; 
} 
+0

Дэвид, спасибо большое. Это была очевидная некоторая плохая должная осмотрительность с моей стороны и взятие из учебника слишком буквально (без понимания каждой строки). Фактически я вычислял центр неправильного элемента. Сделаем простое изменение в моем коде выше от _background.getBounds (_background.parent); на _background.getBounds (_background); магически исправил все. Еще раз спасибо! –

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

  • Нет связанных вопросов^_^