package nz.ac.massey.javaecs; import java.util.BitSet; /** * Hello world! */ public final class App { private App() { } /** * Says hello to the world. * @param args The arguments of the program. * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { ECS gameEngine = new ECS(); System.out.println("Hello World!"); gameEngine.registerComponent(Vec2D.class); gameEngine.registerComponent(RidgidBody.class); gameEngine.registerComponent(Gravity.class); PhysicsSystem physicsSystem = new PhysicsSystem(gameEngine); gameEngine.registerSystem(PhysicsSystem.class, physicsSystem); { BitSet signature = new BitSet(); signature.set(gameEngine.getComponentIndex(Gravity.class)); signature.set(gameEngine.getComponentIndex(Vec2D.class)); signature.set(gameEngine.getComponentIndex(RidgidBody.class)); gameEngine.setSystemSignature(PhysicsSystem.class, signature); } physicsSystem.init(); LogVec2DSystem logVec2DSystem = new LogVec2DSystem(gameEngine); gameEngine.registerSystem(LogVec2DSystem.class, logVec2DSystem); { BitSet signature = new BitSet(); signature.set(gameEngine.getComponentIndex(Gravity.class)); signature.set(gameEngine.getComponentIndex(Vec2D.class)); signature.set(gameEngine.getComponentIndex(RidgidBody.class)); gameEngine.setSystemSignature(LogVec2DSystem.class, signature); } logVec2DSystem.init(); FrameRateSystem frameRateSystem = new FrameRateSystem(); gameEngine.registerSystem(FrameRateSystem.class, frameRateSystem); // Create components: int entity = gameEngine.createEntity(); gameEngine.addComponent(entity, Gravity.class, new Gravity(0.0, -9.80665, -1.0, 100.0)); gameEngine.addComponent(entity, Vec2D.class, new Vec2D(1.5, 0.0, 1)); gameEngine.addComponent(entity, RidgidBody.class, new RidgidBody()); double dt = 0.0; double frameRate = 1.0 / 20; // 1 second divided by target number of frames double idleTime = 0.0; // the amount of time spent sleeping boolean quit = false; long loopStart = System.currentTimeMillis(); long startTime = System.nanoTime(); // One potential way to do this while (!quit){ // Get the time between frames for accurate time-based calculations (i.e. physics systems etc) frameRateSystem.update(dt, idleTime); physicsSystem.update(dt); logVec2DSystem.update(dt); dt = (System.nanoTime() - startTime) / 1e9; // convert nanoseconds to seconds startTime = System.nanoTime(); // Limit frame rate (approximately) to minimum of 16 ms if (dt < frameRate){ idleTime = frameRate-dt; Thread.sleep((int)((frameRate-dt)*1000)); dt = (System.nanoTime() - startTime) / 1e9; startTime = System.nanoTime(); } if (System.currentTimeMillis() - loopStart >= 1000){ loopStart = System.currentTimeMillis(); System.out.println("Second Elapsed"); } } } }