Made physics fps-independent and removed delta limit.
This commit is contained in:
parent
ed9d530705
commit
5acb1b301c
@ -9,7 +9,7 @@ public class CPhysics extends Component {
|
||||
private final Vector2 position = new Vector2();
|
||||
private final Vector2 velocity = new Vector2();
|
||||
private final Vector2 size = new Vector2();
|
||||
private float movespeed = 5f, jumpForce = 0.5f, gravity = 1f;
|
||||
private float movespeed = 7.5f, jumpForce = 35f, gravity = 100f;
|
||||
private CollisionListener collisionListener = null;
|
||||
|
||||
private boolean movable = true;
|
||||
|
@ -12,7 +12,7 @@ import com.saltosion.gladiator.util.Direction;
|
||||
|
||||
public class PhysicsSystem extends EntitySystem {
|
||||
|
||||
private static final float MAX_VEL = 0.5f;
|
||||
private static final float MAX_VEL = 2f, COLLISION_PRECISION = 24f, UPDATES_PER_SECOND = 120f;
|
||||
|
||||
private static final ComponentMapper<CPhysics> pm = ComponentMapper.getFor(CPhysics.class);
|
||||
private static final ComponentMapper<CCombat> cm = ComponentMapper.getFor(CCombat.class);
|
||||
@ -25,13 +25,17 @@ public class PhysicsSystem extends EntitySystem {
|
||||
|
||||
@Override
|
||||
public void update(float deltaTime) {
|
||||
deltaTime = Math.min(deltaTime, 0.033f);
|
||||
float freq = 1f / UPDATES_PER_SECOND;
|
||||
int times = (int) Math.ceil(deltaTime / freq);
|
||||
deltaTime /= (float) times;
|
||||
for (int t = 0; t < times; t++) {
|
||||
for (int i = 0; i < entities.size(); i++) {
|
||||
CPhysics obj = pm.get(entities.get(i));
|
||||
CCombat combat = cm.get(entities.get(i));
|
||||
|
||||
// Apply movement
|
||||
obj.getPosition().add(obj.getVelocity());
|
||||
obj.getPosition().add(Math.max(Math.min(obj.getVelocity().x * deltaTime, MAX_VEL), -MAX_VEL),
|
||||
Math.max(Math.min(obj.getVelocity().y * deltaTime, MAX_VEL), -MAX_VEL));
|
||||
|
||||
// Movement
|
||||
if (obj.isMovable()) {
|
||||
@ -42,7 +46,7 @@ public class PhysicsSystem extends EntitySystem {
|
||||
if (obj.movingRight) {
|
||||
move++;
|
||||
}
|
||||
obj.getVelocity().x = move * obj.getMovespeed() * deltaTime;
|
||||
obj.getVelocity().x = move * obj.getMovespeed();
|
||||
if (combat != null) {
|
||||
if (combat.swingCdCounter > 0) {
|
||||
obj.getVelocity().x /= 2;
|
||||
@ -59,8 +63,6 @@ public class PhysicsSystem extends EntitySystem {
|
||||
obj.getVelocity().y -= obj.getGravity() * deltaTime;
|
||||
}
|
||||
|
||||
obj.getVelocity().y = Math.max(Math.min(obj.getVelocity().y, MAX_VEL), -MAX_VEL);
|
||||
|
||||
// Collisions
|
||||
if (obj.isProcessCollisions()) {
|
||||
for (int j = 0; j < entities.size(); j++) {
|
||||
@ -72,6 +74,7 @@ public class PhysicsSystem extends EntitySystem {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void collision(Entity entity0, Entity entity1) {
|
||||
CPhysics cp0 = pm.get(entity0);
|
||||
@ -94,13 +97,14 @@ public class PhysicsSystem extends EntitySystem {
|
||||
|
||||
boolean collidedAlready = false;
|
||||
|
||||
if (x00 <= x11 && Math.abs(x00 - x11) < (cp0.getSize().x + cp1.getSize().x) / 16) {
|
||||
if (x00 <= x11 && Math.abs(x00 - x11) < (cp0.getSize().x + cp1.getSize().x) / COLLISION_PRECISION) {
|
||||
// cp0's left side is colliding with cp1's right side
|
||||
if (!cp0.isGhost() && !cp1.isGhost()) {
|
||||
if (cp0.getVelocity().x < 0) {
|
||||
// cp0 is going left, stop
|
||||
cp0.getVelocity().x = 0;
|
||||
}
|
||||
cp0.getPosition().x += x11 - x00;
|
||||
}
|
||||
|
||||
if (cp0.getCollisionListener() != null) {
|
||||
@ -108,13 +112,14 @@ public class PhysicsSystem extends EntitySystem {
|
||||
}
|
||||
collidedAlready = true;
|
||||
}
|
||||
if (x01 > x10 && Math.abs(x01 - x10) < (cp0.getSize().x + cp1.getSize().x) / 16) {
|
||||
if (x01 > x10 && Math.abs(x01 - x10) < (cp0.getSize().x + cp1.getSize().x) / COLLISION_PRECISION) {
|
||||
// cp0's right side is colliding with cp1's left side
|
||||
if (!cp0.isGhost() && !cp1.isGhost()) {
|
||||
if (cp0.getVelocity().x > 0) {
|
||||
// cp0 is going right, stop
|
||||
cp0.getVelocity().x = 0;
|
||||
}
|
||||
cp0.getPosition().x += x10 - x01;
|
||||
}
|
||||
|
||||
if (cp0.getCollisionListener() != null) {
|
||||
@ -122,7 +127,7 @@ public class PhysicsSystem extends EntitySystem {
|
||||
}
|
||||
collidedAlready = true;
|
||||
}
|
||||
if (y00 <= y11 && Math.abs(y00 - y11) < (cp0.getSize().y + cp1.getSize().y) / 16) {
|
||||
if (y00 <= y11 && Math.abs(y00 - y11) < (cp0.getSize().y + cp1.getSize().y) / COLLISION_PRECISION) {
|
||||
// cp0's bottom side is colliding with cp1's top side
|
||||
if (!cp0.isGhost() && !cp1.isGhost()) {
|
||||
if (cp0.getVelocity().y < 0) {
|
||||
@ -138,7 +143,7 @@ public class PhysicsSystem extends EntitySystem {
|
||||
}
|
||||
collidedAlready = true;
|
||||
}
|
||||
if (y01 > y10 && Math.abs(y01 - y10) < (cp0.getSize().y + cp1.getSize().y) / 16) {
|
||||
if (y01 > y10 && Math.abs(y01 - y10) < (cp0.getSize().y + cp1.getSize().y) / COLLISION_PRECISION) {
|
||||
// cp0's top side is colliding with cp1's bottom side
|
||||
if (!cp0.isGhost() && !cp1.isGhost()) {
|
||||
if (cp0.getVelocity().y > 0) {
|
||||
|
@ -6,11 +6,14 @@ import com.saltosion.gladiator.GladiatorBrawler;
|
||||
import com.saltosion.gladiator.util.Name;
|
||||
|
||||
public class DesktopLauncher {
|
||||
public static void main (String[] arg) {
|
||||
|
||||
public static void main(String[] args) {
|
||||
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
|
||||
config.title = Name.GAME_NAME;
|
||||
config.width = 1280;
|
||||
config.height = 720;
|
||||
new LwjglApplication(new GladiatorBrawler(), config);
|
||||
config.vSyncEnabled = true; // Change this to false for performance testing
|
||||
config.foregroundFPS = 0;
|
||||
LwjglApplication app = new LwjglApplication(new GladiatorBrawler(), config);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user