2
package  {
    import flash.display.MovieClip;
    import flash.events.Event;
    public class Bullet extends MovieClip {
        private var mc:MovieClip;
        public function Bullet() {

            mc = new MovieClip();
            mc.graphics.beginFill(0);
            mc.graphics.drawRect(120, 120, 40, 40);
            mc.graphics.endFill();
            addChild(mc);
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }

        private function onEnterFrame(e:Event):void{

            mc.rotation += 10;

        }

    }

}

ステージ上で彼を動かさずに円を回転させるにはどうすればよいですか? 彼が前にいた場所にとどまり、回転するだけで、どこにも動かないでしょうか??

このコードを試してみると、円が回転してステージの周りを移動していることがわかります。これを変更するにはどうすればよいですか?

4

2 に答える 2

1

回転させたいオブジェクトの中心にある基準点を中心に回転します。

Yahoo Astraには、このようなもののためのDynamic Registrationクラスがあります。

これは次のように実装できます。

package
{
    import com.yahoo.astra.utils.DynamicRegistration;

    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.geom.Point;

    public class Bullet extends MovieClip
    {
        private var mc:MovieClip;
        private var currentRotation:uint = 0;

        public function Bullet()
        {
            mc = new MovieClip();
            mc.graphics.beginFill(0);
            mc.graphics.drawRect(120, 120, 40, 40);
            mc.graphics.endFill();
            addChild(mc);
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }

        private function onEnterFrame(e:Event):void
        {
            currentRotation = (currentRotation + 10) % 360;
            DynamicRegistration.rotate(mc, new Point(140, 140), currentRotation);
        }

    }
}

Yahoo アストラ DynamicRegistration クラス:

/*
Copyright (c) 2008 Yahoo! Inc.  All rights reserved.  
The copyrights embodied in the content of this file are licensed under the BSD (revised) open source license
*/
package com.yahoo.astra.utils
{
        import flash.geom.Point;
        import flash.display.DisplayObject;

        /**
         * Allows you to manipulate display objects based on a registration point other
         * than the standard (0,0).
         * 
         * @author Josh Tynjala
         */
        public class DynamicRegistration
        {
                /**
                 * Moves a <code>DisplayObject</code> to a new position (x,y) based on a registration point. The
                 * true position of the object will be (x - registration.x, y - registration.y).
                 * 
                 * @param       target                          the DisplayObject to move
                 * @param       registration            the registration point of the DisplayObject
                 * @param       x                                       the new x position, in pixels
                 * @param       y                                       the new y position, in pixels
                 */
                public static function move(target:DisplayObject, registration:Point, x:Number = 0, y:Number = 0):void
                {
                        //generate the location of the registration point in the parent
                        registration = target.localToGlobal(registration);
                        registration = target.parent.globalToLocal(registration);

                        //move the target and offset by the registration point
                        target.x += x - registration.x;
                        target.y += y - registration.y;
                }

                /**
                 * Rotates a <code>DisplayObject</code> based on a registration point. 
                 * 
                 * @param       target                          the DisplayObject to move
                 * @param       registration            the registration point of the DisplayObject
                 * @param       rotation                        the new rotation angle
                 */
                public static function rotate(target:DisplayObject, registration:Point, degrees:Number = 0):void
                {
                        changePropertyOnRegistrationPoint(target, registration, "rotation", degrees);
                }

                /**
                 * Scales a <code>DisplayObject</code> based on a registration point. 
                 * 
                 * @param       target                          the DisplayObject to move
                 * @param       registration            the registration point of the DisplayObject
                 * @param       scaleX                          the new x scaling factor
                 * @param       scaleY                          the new y scaling factor
                 */
                public static function scale(target:DisplayObject, registration:Point, scaleX:Number = 0, scaleY:Number = 0):void
                {
                        changePropertyOnRegistrationPoint(target, registration, "scaleX", scaleX);
                        changePropertyOnRegistrationPoint(target, registration, "scaleY", scaleY);
                }

                /**
                 * @private
                 * Alters an arbitary property based on the registration point.
                 * 
                 * @param       target                          the DisplayObject to move
                 * @param       registration            the registration point of the DisplayObject
                 * @param       propertyName            the property to change
                 * @param       value                           the new value of the property to change
                 */
                private static function changePropertyOnRegistrationPoint(target:DisplayObject, registration:Point, propertyName:String, value:Number):void
                {
                        //generate the location of the registration point in the parent
                        var a:Point = registration.clone();
                        a = target.localToGlobal(a);
                        a = target.parent.globalToLocal(a);

                        target[propertyName] = value;

                        //after the property change, regenerate the location of the registration
                        //point in the parent
                        var b:Point = registration.clone();
                        b = target.localToGlobal(b);
                        b = target.parent.globalToLocal(b);

                        //move the target based on the difference to make it appear the change
                        //happened based on the registration point
                        target.x -= b.x - a.x;
                        target.y -= b.y - a.y;
                }

        }
}
于 2012-07-05T02:24:51.423 に答える
1

デフォルトでは、レジストレーション ポイント (またはオブジェクトが回転するポイント) は(0, 0)、その DisplayObject の左上隅に設定されています。

あなたがするとき

mc.graphics.drawRect(120, 120, 40, 40);

長方形は左上隅が座標で描かれ、(120, 120)その中心は(140, 140)

中心が になるように長方形を描画し、(0, 0)このムービークリップを親に移動するだけです (結果が同じになるように)。

mc.graphics.drawRect(-20, -20, 40, 40);
mc.x=140;
mc.y=140;

次に、mc.rotation+=10長方形をその中心を中心に回転させます。

于 2012-07-05T05:03:48.600 に答える