[libgdx] Added wind and gravity controls for the whole skeleton.

This commit is contained in:
Nathan Sweet 2025-05-21 19:04:56 -04:00
parent 9b596c3856
commit fdc75a3c0e
2 changed files with 51 additions and 11 deletions

View File

@ -120,7 +120,7 @@ public class PhysicsConstraint extends Constraint<PhysicsConstraint, PhysicsCons
ux = bx; ux = bx;
uy = by; uy = by;
} else { } else {
float a = remaining, i = p.inertia, f = skeleton.data.referenceScale, d = -1, qx = data.limit * delta, float a = remaining, i = p.inertia, f = skeleton.data.referenceScale, d = -1, m = 0, e = 0, qx = data.limit * delta,
qy = qx * Math.abs(skeleton.scaleY); qy = qx * Math.abs(skeleton.scaleY);
qx *= Math.abs(skeleton.scaleX); qx *= Math.abs(skeleton.scaleX);
if (x || y) { if (x || y) {
@ -135,17 +135,20 @@ public class PhysicsConstraint extends Constraint<PhysicsConstraint, PhysicsCons
uy = by; uy = by;
} }
if (a >= t) { if (a >= t) {
float xs = xOffset, ys = yOffset;
d = (float)Math.pow(p.damping, 60 * t); d = (float)Math.pow(p.damping, 60 * t);
float m = p.massInverse * t, e = p.strength, w = p.wind * f * skeleton.scaleX, m = t * p.massInverse;
g = p.gravity * f * skeleton.scaleY, xs = xOffset, ys = yOffset; 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 { do {
if (x) { if (x) {
xVelocity += (w - xOffset * e) * m; xVelocity += (ax - xOffset * e) * m;
xOffset += xVelocity * t; xOffset += xVelocity * t;
xVelocity *= d; xVelocity *= d;
} }
if (y) { if (y) {
yVelocity -= (g + yOffset * e) * m; yVelocity -= (ay + yOffset * e) * m;
yOffset += yVelocity * t; yOffset += yVelocity * t;
yVelocity *= d; yVelocity *= d;
} }
@ -188,18 +191,23 @@ public class PhysicsConstraint extends Constraint<PhysicsConstraint, PhysicsCons
if (r > 0) scaleOffset += (dx * c + dy * s) * i / r; if (r > 0) scaleOffset += (dx * c + dy * s) * i / r;
} }
if (a >= t) { if (a >= t) {
if (d == -1) d = (float)Math.pow(p.damping, 60 * t); if (d == -1) {
float m = p.massInverse * t, e = p.strength, w = p.wind, g = p.gravity, h = l / f, rs = rotateOffset, d = (float)Math.pow(p.damping, 60 * t);
ss = scaleOffset; 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) { while (true) {
a -= t; a -= t;
if (scaleX) { if (scaleX) {
scaleVelocity += (w * c - g * s - scaleOffset * e) * m; scaleVelocity += (ax * c - ay * s - scaleOffset * e) * m;
scaleOffset += scaleVelocity * t; scaleOffset += scaleVelocity * t;
scaleVelocity *= d; scaleVelocity *= d;
} }
if (rotateOrShearX) { if (rotateOrShearX) {
rotateVelocity -= ((w * s + g * c) * h + rotateOffset * e) * m; rotateVelocity -= ((ax * s + ay * c) * h + rotateOffset * e) * m;
rotateOffset += rotateVelocity * t; rotateOffset += rotateVelocity * t;
rotateVelocity *= d; rotateVelocity *= d;
if (a < t) break; if (a < t) break;

View File

@ -60,7 +60,7 @@ public class Skeleton {
final Array<Posed> resetCache = new Array(true, 16, Posed[]::new); final Array<Posed> resetCache = new Array(true, 16, Posed[]::new);
@Null Skin skin; @Null Skin skin;
final Color color; 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; int update;
public Skeleton (SkeletonData data) { public Skeleton (SkeletonData data) {
@ -612,6 +612,38 @@ public class Skeleton {
this.y = y; 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. */ /** Calls {@link PhysicsConstraint#translate(float, float)} for each physics constraint. */
public void physicsTranslate (float x, float y) { public void physicsTranslate (float x, float y) {
PhysicsConstraint[] constraints = this.physics.items; PhysicsConstraint[] constraints = this.physics.items;