1

我有一个 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;
}
4

1 回答 1

0

我不确定您要产生什么行为,但我认为问题在于centerXcenterY定义_backgroundin_background.parent坐标空间的中间。然后,您将平移围绕 values 旋转的matrixso ,但在's 坐标空间中。_backgroundcenterX, 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;
}
于 2013-03-28T19:35:51.417 回答