diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraint.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraint.java index 47bbe42e5..707f00835 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraint.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraint.java @@ -120,7 +120,7 @@ public class PhysicsConstraint extends Constraint= t) { + float xs = xOffset, ys = yOffset; d = (float)Math.pow(p.damping, 60 * t); - float m = p.massInverse * t, e = p.strength, w = p.wind * f * skeleton.scaleX, - g = p.gravity * f * skeleton.scaleY, xs = xOffset, ys = yOffset; + m = t * p.massInverse; + e = p.strength; + float w = f * p.wind * skeleton.scaleX, g = f * p.gravity * skeleton.scaleY, + ax = w * skeleton.windX + g * skeleton.gravityX, ay = w * skeleton.windY + g * skeleton.gravityY; do { if (x) { - xVelocity += (w - xOffset * e) * m; + xVelocity += (ax - xOffset * e) * m; xOffset += xVelocity * t; xVelocity *= d; } if (y) { - yVelocity -= (g + yOffset * e) * m; + yVelocity -= (ay + yOffset * e) * m; yOffset += yVelocity * t; yVelocity *= d; } @@ -188,18 +191,23 @@ public class PhysicsConstraint extends Constraint 0) scaleOffset += (dx * c + dy * s) * i / r; } if (a >= t) { - if (d == -1) d = (float)Math.pow(p.damping, 60 * t); - float m = p.massInverse * t, e = p.strength, w = p.wind, g = p.gravity, h = l / f, rs = rotateOffset, - ss = scaleOffset; + if (d == -1) { + d = (float)Math.pow(p.damping, 60 * t); + m = t * p.massInverse; + e = p.strength; + } + float rs = rotateOffset, ss = scaleOffset, h = l / f, + ax = p.wind * skeleton.windX + p.gravity * skeleton.gravityX, + ay = p.wind * skeleton.windY + p.gravity * skeleton.gravityY; while (true) { a -= t; if (scaleX) { - scaleVelocity += (w * c - g * s - scaleOffset * e) * m; + scaleVelocity += (ax * c - ay * s - scaleOffset * e) * m; scaleOffset += scaleVelocity * t; scaleVelocity *= d; } if (rotateOrShearX) { - rotateVelocity -= ((w * s + g * c) * h + rotateOffset * e) * m; + rotateVelocity -= ((ax * s + ay * c) * h + rotateOffset * e) * m; rotateOffset += rotateVelocity * t; rotateVelocity *= d; if (a < t) break; diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Skeleton.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Skeleton.java index 55ae06676..e877e672f 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Skeleton.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Skeleton.java @@ -60,7 +60,7 @@ public class Skeleton { final Array resetCache = new Array(true, 16, Posed[]::new); @Null Skin skin; final Color color; - float x, y, scaleX = 1, scaleY = 1, time; + float x, y, scaleX = 1, scaleY = 1, time, windX = 1, windY = 0, gravityX = 0, gravityY = 1; int update; public Skeleton (SkeletonData data) { @@ -612,6 +612,38 @@ public class Skeleton { this.y = y; } + public float getWindX () { + return windX; + } + + public void setWindX (float windX) { + this.windX = windX; + } + + public float getWindY () { + return windY; + } + + public void setWindY (float windY) { + this.windY = windY; + } + + public float getGravityX () { + return gravityX; + } + + public void setGravityX (float gravityX) { + this.gravityX = gravityX; + } + + public float getGravityY () { + return gravityY; + } + + public void setGravityY (float gravityY) { + this.gravityY = gravityY; + } + /** Calls {@link PhysicsConstraint#translate(float, float)} for each physics constraint. */ public void physicsTranslate (float x, float y) { PhysicsConstraint[] constraints = this.physics.items;