一段时间以来,我一直在尝试破解 Photonstorm 的用于 Flixel 的 Power Tools 'Spring' 插件。我已经涉足了一些公式,但直到现在我还没有得到我想要的东西。
我已经设法将它破解到插件中:http: //illogictree.com/blog/2010/01/1345/
这使得示例现在看起来像这样:
哪个好。它的行为与我希望它的感觉非常相似。除了一个问题。我希望绳子上的球直接位于鼠标下方。关于如何做到这一点的任何想法?
在你问之前,代码://插件黑客
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;
此外,任何有助于松开弹簧以使其更像绳索或绳索的帮助也会有所帮助!
提前致谢!