0

メインコード:

package  {
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.text.TextField;
    import flash.net.URLVariables;
    import flash.net.URLRequest;
    import flash.events.Event;
    import flash.display.BitmapData;
    import flash.geom.Rectangle;
    import flash.geom.Point;
    import flash.display.DisplayObject;
    import flash.display.Bitmap;

    public class Init extends Sprite {

        var rects:Array,
        numRects:int = stage.stageWidth / _width,
        _width:Number = 20,
        _height:Number = 80,
        _rotation:int = 0,
        _vr:Number = 3;

        public function Init() {

            init();
        }

        function init():void
        {
            rects = new Array();
            var bitmap:BitmapData = new slider();
            var _point = new Point();
            for(var i:int = 0; i < numRects; i++)
            {
                var _rect = new Rectangle(i * _width, 0, _width, 80);
                var smallBD:BitmapData = new BitmapData(_width, 80);
                smallBD.copyPixels(bitmap, _rect, _point);
                //var d:Bitmap = new Bitmap(smallBD); 
                var rect:Rect = new Rect(smallBD, _width, _height);
                rect.x = i * _width + _width / 2;
                addChild(rect);
                rects.push(rect);
            }

            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }

        function onEnterFrame(e:Event):void
        {

            for(var i:int = 0; i < numRects; i++)
            {
                rects[i].rotationY += _vr;
            }

            _rotation += _vr;
            if(_rotation % 180 == 0)
            {
                removeEventListener(Event.ENTER_FRAME, onEnterFrame);
            }

        }


    }

}

これはrectクラスです:

package  {
    import flash.display.Sprite;
    import flash.utils.ByteArray;
    import flash.display.Bitmap;
    import flash.display.BitmapData;

    public class Rect extends Sprite {

        private var bitmap:BitmapData,
        _width:Number,
        _height:Number;
        public function Rect(bitmap:BitmapData, width:Number = 20, height:Number = 80) {

            this.bitmap = bitmap;
            this._width = width;
            this._height = height;
            init();
        }

        function init():void
        {
            graphics.beginBitmapFill(bitmap, null, true, true);

            graphics.drawRect(-_width / 2, 0, _width , _height);

            graphics.endFill();


        }

    }

}

インポートした画像を断片に分割し、各断片を各長方形のスプライトに追加するので、回転効果を作成していますが、問題は、作成時にスプライトを中央に配置できないことです(-_width / 2)。各スプライトを x 軸で中央に配置し、x 位置に追加し_width / 2ますが、画像が変形する理由がわかりません。780 x 80 の画像を取得して、このコードを試すことができます ここに画像の説明を入力

4

1 に答える 1

0

さて、beginBitmapFill()長方形を作成するために使用するのを見て、どこに描画するかを自由に割り当てることができます。左上隅ではなく、その中心を中心に長方形を回転させる必要があるようです。あなたは-_width/2X を開始するときに良い文章を書きましたが、次は-height/2Y を開始するように書く必要があります。

graphics.drawRect(-_width / 2, -_height / 2, _width , _height);

これにより、描画されたビットマップの中心がスプライトの (0,0) 位置に配置されるため、適用する回転によって、スプライトは描画された長方形の中心を中心に回転します。

一般に、表示オブジェクトに単純に回転を適用すると、常に独自の (0,0) を中心に回転するため、補正しようとする場合は、変換行列 (SO で入手可能ないくつかの例、これを言う)を記述するか、 (0,0)が回転したいポイントになるようにスプライトを描画します。

于 2012-11-29T03:53:35.910 に答える