mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-02-05 06:44:56 +08:00
[libgdx] Added wind and gravity controls for the whole skeleton.
This commit is contained in:
parent
9b596c3856
commit
fdc75a3c0e
@ -120,7 +120,7 @@ public class PhysicsConstraint extends Constraint<PhysicsConstraint, PhysicsCons
|
||||
ux = bx;
|
||||
uy = by;
|
||||
} 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);
|
||||
qx *= Math.abs(skeleton.scaleX);
|
||||
if (x || y) {
|
||||
@ -135,17 +135,20 @@ public class PhysicsConstraint extends Constraint<PhysicsConstraint, PhysicsCons
|
||||
uy = by;
|
||||
}
|
||||
if (a >= 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<PhysicsConstraint, PhysicsCons
|
||||
if (r > 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;
|
||||
|
||||
@ -60,7 +60,7 @@ public class Skeleton {
|
||||
final Array<Posed> 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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user