Skip to content

Commit 902ab72

Browse files
committed
😕 Some work on ticking
1 parent e527971 commit 902ab72

5 files changed

Lines changed: 113 additions & 99 deletions

File tree

‎src/main/java/com/james090500/BlockGame.java‎

Lines changed: 60 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -163,77 +163,83 @@ public void close() {
163163
* @param clientWindow
164164
*/
165165
private void loop(ClientWindow clientWindow) {
166+
final double TICKS_PER_SECOND = 20.0;
167+
final double NS_PER_TICK = 1_000_000_000.0 / TICKS_PER_SECOND; // 50_000_000 ns
168+
final float FIXED_DELTA_SECONDS = 1.0f / (float)TICKS_PER_SECOND; // 0.05 seconds
169+
166170
int fps = 0;
167-
int ticks = 0;
168-
long start = System.currentTimeMillis();
171+
int tps = 0;
172+
long fpsTimer = System.currentTimeMillis();
169173

170-
// Set the clear color
171-
glClearColor(0.529f, 0.808f, 0.922f, 1.0f);
174+
long lastTime = System.nanoTime();
175+
double accumulator = 0.0;
172176

173-
// Run the rendering loop until the user has attempted to close
174177
double currentFrame = glfwGetTime();
175178
double lastFrame = currentFrame;
176179
double deltaTime;
177180

178-
while(!glfwWindowShouldClose(clientWindow.getWindow())) {
179-
long tickLength = 50;
180-
long endOfTick = System.currentTimeMillis() + tickLength;
181-
long currentTime = System.currentTimeMillis();
182-
ticks++;
183-
184-
while (endOfTick >= currentTime) {
185-
currentFrame = glfwGetTime();
186-
deltaTime = currentFrame - lastFrame;
187-
lastFrame = currentFrame;
188-
189-
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer
190-
191-
// Blending
192-
glEnable(GL_BLEND);
193-
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
181+
// Set the clear color once
182+
glClearColor(0.529f, 0.808f, 0.922f, 1.0f);
194183

195-
// 3D Depth
196-
glEnable(GL_DEPTH_TEST);
184+
while (!glfwWindowShouldClose(clientWindow.getWindow())) {
185+
currentFrame = glfwGetTime();
186+
deltaTime = currentFrame - lastFrame;
187+
lastFrame = currentFrame;
197188

198-
// Disable back faces
199-
glEnable(GL_CULL_FACE); // Enable face culling
200189

201-
// Inputs etc
202-
clientWindow.poll();
190+
long now = System.nanoTime();
191+
long elapsedNanos = now - lastTime;
192+
lastTime = now;
193+
accumulator += (double) elapsedNanos;
203194

204-
// Render all pending objects
205-
RenderManager.render();
195+
// Process input/events every frame
196+
glfwPollEvents(); // make sure to poll events each loop
206197

207-
//TODO Temp I think
208-
if(this.localPlayer != null) {
209-
this.localPlayer.render();
198+
// Run fixed ticks while we've accumulated one-or-more tick durations
199+
boolean didTick = false;
200+
while (accumulator >= NS_PER_TICK) {
201+
// --- TICK: update game logic at fixed rate ---
202+
if (!BlockGame.getInstance().getConfig().isPaused()) {
203+
world.update(); // game logic should use FIXED_DELTA_SECONDS where appropriate
210204
}
211205

212-
if(!BlockGame.getInstance().getConfig().isPaused()) {
213-
this.world.update();
206+
accumulator -= NS_PER_TICK;
207+
tps++;
208+
didTick = true;
209+
}
210+
211+
if(!BlockGame.getInstance().getConfig().isPaused()) {
212+
if (this.localPlayer != null) {
214213
this.localPlayer.update(deltaTime);
215214
}
215+
}
216216

217-
//Run a single main thread queue
218-
ThreadUtil.runMainQueue();
219-
220-
// Render UI
221-
ScreenManager.render();
222-
223-
// Swap the buffers
224-
glfwSwapBuffers(clientWindow.getWindow());
225-
226-
// FPS Calculator
227-
currentTime = System.currentTimeMillis();
228-
if (currentTime - start >= 1000) {
229-
BlockGame.getInstance().getConfig().setFPS(fps);
230-
BlockGame.getInstance().getConfig().setTicks(ticks);
231-
start = currentTime;
232-
fps = 0;
233-
ticks = 0;
234-
} else {
235-
fps++;
236-
}
217+
ThreadUtil.runMainQueue(); // run main-thread queued tasks on tick
218+
219+
// Prepare GL state and render
220+
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
221+
glEnable(GL_BLEND);
222+
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
223+
glEnable(GL_DEPTH_TEST);
224+
glEnable(GL_CULL_FACE);
225+
226+
// Inputs, render managers and UI (per-frame)
227+
clientWindow.poll(); // your code — keep per-frame input/polling
228+
RenderManager.render();
229+
if (this.localPlayer != null) this.localPlayer.render(); // rendering uses alpha if desired
230+
231+
ScreenManager.render();
232+
233+
glfwSwapBuffers(clientWindow.getWindow());
234+
fps++;
235+
236+
// FPS / TPS reporting (once per second)
237+
if (System.currentTimeMillis() - fpsTimer >= 1000) {
238+
BlockGame.getInstance().getConfig().setFPS(fps);
239+
BlockGame.getInstance().getConfig().setTicks(tps);
240+
fps = 0;
241+
tps = 0;
242+
fpsTimer += 1000;
237243
}
238244
}
239245
}

‎src/main/java/com/james090500/client/LocalPlayer.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ private void updateMovement(double delta) {
153153

154154
// Stop playing falling through the world
155155
if (getPosition().y < -30) {
156-
getPosition().y = 100;
156+
camera.y = 100;
157157
}
158158

159159
// Dampen movement

‎src/main/java/com/james090500/gui/DebugScreen.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,12 @@ public void render() {
3838
Chunk chunk = BlockGame.getInstance().getWorld().getChunk(playerPosX, playerPosZ);
3939

4040
if(chunk != null) {
41-
FontManager.create().text("Current Chunk Info", 20f, 10f, 1900f);
41+
FontManager.create().text("Current Chunk Info", 20f, 10f, 190f);
4242
FontManager.create().text("Chunk Coords: " + playerPosX + ", " + playerPosZ, 20f, 10f, 210f);
4343
FontManager.create().text("Chunk Status: " + chunk.chunkStatus.toString(), 20f, 10f, 230f);
4444
FontManager.create().text("Chunk Biome: " + BiomeGenerator.getBiome((int) position.x, (int) position.z), 20f, 10f, 250f);
4545
FontManager.create().text("Chunk Needs Meshing: " + chunk.needsMeshing, 20f, 10f, 270f);
46-
FontManager.create().text("Chunk Needs Saving: " + chunk.needsSaving, 20f, 10f, 280f);
46+
FontManager.create().text("Chunk Needs Saving: " + chunk.needsSaving, 20f, 10f, 290f);
4747
FontManager.create().text("Chunk Solid Vertices: " + chunk.getChunkRenderer().solidVertexCount, 20f, 10f, 310f);
4848
FontManager.create().text("Chunk Trans Vertices: " + chunk.getChunkRenderer().transVertexCount, 20f, 10f, 330f);
4949

‎src/main/java/com/james090500/world/World.java‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ public record ChunkOffset(int dx, int dz, int distSq) {}
5353
@Getter @Setter
5454
private boolean forceUpdate = true;
5555

56+
@Getter @Setter
57+
private long time;
58+
5659
/**
5760
* Starts a remote world
5861
*/
@@ -255,6 +258,11 @@ public void loadRemoteChunk(int chunkX, int chunkZ, byte[] chunkData) {
255258
* update the world. This also loads and remove chunks as needed
256259
*/
257260
public void update() {
261+
this.time++;
262+
if(this.time > 24000) {
263+
this.time = 0;
264+
}
265+
258266
LocalPlayer player = BlockGame.getInstance().getLocalPlayer();
259267
int playerChunkX = (int) Math.floor(player.getPosition().x / 16);
260268
int playerChunkZ = (int) Math.floor(player.getPosition().z / 16);
Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,60 @@
1-
blocks/cactus_side.png
2-
blocks/oak_log.png
3-
blocks/dirt.png
4-
blocks/cactus_top.png
51
blocks/birch_log.png
6-
blocks/spruce_leaves.png
7-
blocks/spruce_planks.png
8-
blocks/stone_block.png
9-
blocks/oak_log_top.png
10-
blocks/cactus_bottom.png
11-
blocks/stone.png
122
blocks/birch_log_top.png
13-
blocks/snowy_grass_block_top.png
14-
blocks/snowy_grass_block_side.png
15-
blocks/water.png
3+
blocks/birch_planks.png
4+
blocks/cactus_bottom.png
5+
blocks/cactus_side.png
6+
blocks/cactus_top.png
7+
blocks/dirt.png
8+
blocks/glass.png
169
blocks/grass_block_side.png
10+
blocks/grass_block_top.png
1711
blocks/oak_leaves.png
12+
blocks/oak_log.png
13+
blocks/oak_log_top.png
1814
blocks/oak_planks.png
19-
blocks/spruce_log.png
20-
blocks/glass.png
21-
blocks/grass_block_top.png
2215
blocks/sand.png
16+
blocks/snowy_grass_block_side.png
17+
blocks/snowy_grass_block_top.png
18+
blocks/spruce_leaves.png
19+
blocks/spruce_log.png
2320
blocks/spruce_log_top.png
24-
blocks/birch_planks.png
21+
blocks/spruce_planks.png
22+
blocks/stone.png
23+
blocks/stone_block.png
24+
blocks/water.png
2525
error.png
26-
gui/button_disabled.png
26+
foliage/red_flower.png
27+
foliage/short_grass.png
28+
foliage/yellow_flower.png
29+
fonts/Minecraftia-Regular.ttf
2730
gui/background.png
28-
gui/logo.png
31+
gui/button.png
2932
gui/button_active.png
33+
gui/button_disabled.png
34+
gui/logo.png
3035
gui/pack.png
31-
gui/button.png
32-
foliage/yellow_flower.png
33-
foliage/short_grass.png
34-
foliage/red_flower.png
35-
fonts/Minecraftia-Regular.ttf
36-
sound/gui/click.ogg
37-
sound/block/stone4.ogg
38-
sound/block/stone1.ogg
39-
sound/block/stone2.ogg
40-
sound/block/stone3.ogg
41-
sound/block/sand4.ogg
42-
sound/block/gravel3.ogg
43-
sound/block/gravel2.ogg
36+
sound/block/cloth1.ogg
37+
sound/block/cloth2.ogg
38+
sound/block/cloth3.ogg
4439
sound/block/cloth4.ogg
4540
sound/block/grass1.ogg
41+
sound/block/grass2.ogg
4642
sound/block/grass3.ogg
43+
sound/block/grass4.ogg
4744
sound/block/gravel1.ogg
48-
sound/block/grass2.ogg
49-
sound/block/sand2.ogg
50-
sound/block/cloth3.ogg
45+
sound/block/gravel2.ogg
46+
sound/block/gravel3.ogg
5147
sound/block/gravel4.ogg
52-
sound/block/cloth2.ogg
53-
sound/block/sand3.ogg
5448
sound/block/sand1.ogg
55-
sound/block/cloth1.ogg
56-
sound/block/grass4.ogg
57-
sound/block/wood3.ogg
58-
sound/block/wood2.ogg
49+
sound/block/sand2.ogg
50+
sound/block/sand3.ogg
51+
sound/block/sand4.ogg
52+
sound/block/stone1.ogg
53+
sound/block/stone2.ogg
54+
sound/block/stone3.ogg
55+
sound/block/stone4.ogg
5956
sound/block/wood1.ogg
60-
sound/block/wood4.ogg
57+
sound/block/wood2.ogg
58+
sound/block/wood3.ogg
59+
sound/block/wood4.ogg
60+
sound/gui/click.ogg

0 commit comments

Comments
 (0)