1

私は _background:MovieClip (本のページを表す) の中心について拡大縮小と回転操作を実行している Flash アプリを持っています。この MC の GESTURE_ROTATE および GESTURE_SCALE イベントに単純なイベント リスナーがあり、いくつかの変数 currentRotation および currentScaleX、currentScaleY を更新します。次に、アプリの ENTER_FRAME イベントで次のコードをトリガーします。

私が遭遇している問題は、MC を約 60 度または -60 度の制限を超えて回転させるか、わずかにスケーリングして回転させると、MC が振動し始め、最終的に制御不能になり、画面から外れて激しく回転することです。私はそれをデバッグするためにいくつかのことを試しました.Math.flooring currentRotationValueとcurrentScaleX / Yの値を10分の1に丸めることさえ試みました(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

どのような動作を生成しようとしているのかはわかりませんが、問題はin座標空間の中央を定義するcenterXことだと思います。次に、 を変換しているので、は 値 を中心に回転しますが、の座標空間内です。centerY_background_background.parentmatrix_backgroundcenterX, centerY_background

画面上で静止している点を中心に回転させたいと仮定すると_background、実際に行う必要があるのは、次の 2 つの異なる を使用することです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 に答える