在as3中遇到弹簧定位问题

时间:2012-12-01 09:41:17

标签: actionscript-3 flixel

有一段时间我一直试图破解Photonstorm用于Flixel的Power Tools'Spring'插件。我已经涉足了几个公式,但直到现在我还没有得到我想要的东西。

我设法将其破解为插件: http://illogictree.com/blog/2010/01/1345/

这使得示例现在看起来像这样: hackedtool

哪个好。它的行为几乎就像我想要的那样。除了一个问题。我希望弦上的球直接位于鼠标下方。关于如何做到这一点的任何想法?

在你问之前,代码: //插件黑客

 package org.flixel.plugin.photonstorm.BaseTypes 
    {
    import org.flixel.*;
    import org.flixel.plugin.photonstorm.FlxExtendedSprite;

    public class MouseSpring 
    {
        public var sprite:FlxExtendedSprite;

        /**
         * The tension of the spring, smaller numbers create springs closer to the mouse pointer
         * @default 0.1
         */
        public var tension:Number = 0.1;

        /**
         * The friction applied to the spring as it moves
         * @default 0.95
         */
        public var friction:Number = 0.95;

        /**
         * The gravity controls how far "down" the spring hangs (use a negative value for it to hang up!)
         * @default 0
         */
        public var gravity:Number = 0;

        private var retainVelocity:Boolean = false;

        private var vx:Number = 0;
        private var vy:Number = 0;

        private var dx:Number = 0;
        private var dy:Number = 0;

        private var ax:Number = 0;
        private var ay:Number = 0;

        /**
         * Adds a spring between the mouse and a Sprite.
         * 
         * @param   sprite              The FlxExtendedSprite to which this spring is attached
         * @param   retainVelocity      true to retain the velocity of the spring when the mouse is released, or false to clear it
         * @param   tension             The tension of the spring, smaller numbers create springs closer to the mouse pointer
         * @param   friction            The friction applied to the spring as it moves
         * @param   gravity             The gravity controls how far "down" the spring hangs (use a negative value for it to hang up!)
         */
        public function MouseSpring(sprite:FlxExtendedSprite, retainVelocity:Boolean = false, tension:Number = 0.1, friction:Number = 0.95, gravity:Number = 0)
        {
            this.sprite = sprite;
            this.retainVelocity = retainVelocity;
            this.tension = tension; //bounciness
            this.friction = friction; //how tight
            this.gravity = gravity; //mass
        }

        /**
         * Updates the spring physics and repositions the sprite
         */
        public function update():void
        {
            dx = FlxG.mouse.x - sprite.springX;
            dy = FlxG.mouse.y - sprite.springY;

            ax = dx * tension;
            ay = dy * tension;

            //ax = Math.cos(dx * tension);
            //ay = Math.sin(dy * tension);

            vx += ax;
            vy += ay;

            //vy += gravity;
            //vx *= friction;
            //vy *= friction;

            //This is where I've hacked it in:
            vx = ax + ( 1.0 / gravity ) * (-friction * ax - tension * ( FlxG.mouse.x - dx  ) + sprite.springX * gravity ) * FlxG.elapsed;
            vy= ay + ( 1.0 / gravity ) * ( -friction * ay - tension * ( FlxG.mouse.y - dy ) + sprite.springY * gravity ) * FlxG.elapsed;            

            sprite.x += vx;
            sprite.y += vy;
        }

        /**
         * Resets the internal spring physics
         */
        public function reset():void
        {
            vx = 0;
            vy = 0;

            dx = 0;
            dy = 0;

            ax = 0;
            ay = 0;
        }       
         }
       }

将对象应用于状态:

        ball1 = new FlxExtendedSprite(160, 120, AssetsRegistry.redPNG);
        //Argument 1:onPressed: true if the spring should only be active     when the mouse is pressed down on this sprite
        //Argument 2:retainVelocity: true to retain the velocity of the     spring when the mouse is released, or false to clear it
        //Argument 3:tension: The tension of the spring, smaller numbers     create springs closer to the mouse pointer
        //Argument 4:friction: The friction applied to the spring as it     moves
        //Argument 5:gravity: The gravity controls how far "down" the      spring hangs (use a negative value for it to hang up!)
        ball1.enableMouseSpring(false, false, 0.1, 0.95, -5);
        ball1.springOffsetX = 0;
        ball1.springOffsetY = 0;

此外,任何有助于松开弹簧以使其更像绳索或绳索的帮助也会有所帮助!

提前致谢!

1 个答案:

答案 0 :(得分:1)

如果您希望它直接位于鼠标下方,请删除所有x计算并将其替换为舞台上的mouseX参数。春天现在只会在y维度上移动。

要调整弹性,请使用以下值:

this.tension = tension; //bounciness
this.friction = friction; //how tight
this.gravity = gravity; //mass

某些组合可以帮助您获得所需的信息。