我有一个Flash应用程序,我正在执行关于_background中心的缩放和旋转操作:MovieClip(表示书籍的页面)。我在这个MC的GESTURE_ROTATE和GESTURE_SCALE事件上有简单的事件监听器,它更新了一些变量currentRotation和currentScaleX,currentScaleY。然后,我在应用程序的ENTER_FRAME事件上有以下代码触发器。
我遇到的问题是当MC旋转超过大约60或-60度的极限,或者稍微缩放并旋转时,MC开始振荡并最终旋转失控并离开屏幕。我已经尝试了几个东西来调试它,甚至尝试了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 :(得分:0)
我不确定您尝试制作的行为,但我认为问题是centerX
和centerY
定义了 {{_background
的中间位置1}}的坐标空间。然后,您正在翻译_background.parent
,以便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