0

さて、私はこれについて多くのことを読みましたが、それは繰り返しになりましたが、どれも私の問題を解決したり、理解するのが難しすぎたりしません. 私は男性のスプライトを取得しようとしています。彼を上から下に見て、ページ内のどこにいてもマウスを見つめます。ただし、頭がシンボルの中心で回転するのではなく、スプライトの左上隅で回転します。何か助けはありますか?

stage.addEventListener("mouseMove", eyesFollow);

function eyesFollow(e:MouseEvent):void {
     var a = mouseY - man_walking.y;
     var b = mouseX - man_walking.x;
     var radians = Math.atan2(a,b);
     var degrees = ((180/Math.PI)*radians)+90;
     man_walking.rotation = (degrees);
}

注:これに関する私の最も適切な投稿には、リンクが壊れているだけの解決策があるため、アクセスできません。

4

3 に答える 3

0

Flash Pro 内では、0,0座標が回転したい点になるようにシンボルを配置するだけです。

登録点

Yahoo Astraには、ポイントを中心に回転するなどの動的登録クラスがあります。

これは、次のように実装でき、100,100を中心に回転します。

DynamicRegistration.rotate(man_walking, new Point(100, 100), degrees);

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-11-05T05:10:57.210 に答える
0

これを試して?

stage.addEventListener("mouseMove", eyesFollow);
var cw:Number = man_walking.width/2,
            ch:Number = man_walking.height/2;

function eyesFollow(e:MouseEvent):void {
    var a = mouseY - man_walking.y;
    var b = mouseX - man_walking.x;
    var radians = Math.atan2(a,b);
    var degrees = ((180/Math.PI)*radians)+90;
    var A:Point=man_walking.parent.globalToLocal(man_walking.localToGlobal(new Point(cw,ch)));
    man_walking.rotation = (degrees);
    var B:Point=man_walking.parent.globalToLocal(man_walking.localToGlobal(new Point(cw,ch)));
    man_walking.y+=A.y - B.y;
    man_walking.x+=A.x - B.x;
}
于 2012-11-05T07:59:55.473 に答える
0

スプライトの (x, y) 位置が左上隅にあると仮定すると、高レベルの Lua 風の疑似コード (申し訳ありませんが、私は Actionscript に精通していません) の一般的なプロセスは次のようになります。

function rotate()
  -- ...find how much you want to rotate...

  -- Translate the middle point to (0, 0)
  man.translate(-(man.x + man.width/2), -(man.y + man.height/2))

  -- Rotate it there.
  man.rotate(someTranslation)

  -- Lastly, move it back to where it was
  man.translate((man.x + man.width/2), (man.y + man.height/2))

end

あなたのライブラリが位置と原点を計算する別の方法を使用している場合は、移動する必要がある量を調整する必要がありますが、ポイントはそれでも変わりません: 最初に画像を移動して、中央が (0,0 )、回転させてから、元に戻します。

これが役立つことを願っています!:)

于 2012-11-05T04:59:09.097 に答える