瀏覽代碼

collision tests / improvements

Kajetan Johannes Hammerle 5 年之前
父節點
當前提交
f6c55ee7c2

+ 19 - 4
src/me/hammerle/snuviengine/api/Engine.java

@@ -16,16 +16,17 @@ public abstract class Engine
     private long window;
     
     private int fpsIndex = 0;
-    private final long[] fps = new long[100];
+    private final long[] fps = new long[200];
     private long fpsSum = 0;
     private double currentFps = 0;
     
     private int tpsIndex = 0;
-    private final long[] tps = new long[100];
+    private final long[] tps = new long[200];
     private long tpsSum = 0;
     private double currentTps = 0;
     
     private long nanosPerTick = 10_000_000;
+    private final int maxTicksPerFrame = 20;
     
     public Engine()
     {
@@ -111,6 +112,7 @@ public abstract class Engine
         while(!glfwWindowShouldClose(window))
         {
             glfwSwapBuffers(window);
+            
             glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
             time = System.nanoTime();
@@ -122,6 +124,7 @@ public abstract class Engine
             lastFrame = time;
             currentFps = (1_000_000_000.0 * fps.length) / fpsSum;
 
+            int ticksPerFrame = 0;
             while(lag >= nanosPerTick)
             {
                 lag -= nanosPerTick;
@@ -136,10 +139,22 @@ public abstract class Engine
                 
                 KeyHandler.tick();
                 tick();
+                
+                ticksPerFrame++;
+                if(ticksPerFrame >= maxTicksPerFrame)
+                {
+                    long skip = lag / nanosPerTick;
+                    lag -= skip * nanosPerTick;
+                    if(skip > 0)
+                    {
+                        System.out.println("skipped " + skip + " game ticks " + lag);
+                    }
+                    break;
+                }
             }
             
             Shader.doTasks();
-            renderTick();
+            renderTick((double) lag / nanosPerTick);
 
             glfwPollEvents();
         }
@@ -162,7 +177,7 @@ public abstract class Engine
     
     public abstract void init();
     public abstract void tick();
-    public abstract void renderTick();
+    public abstract void renderTick(double lag);
 }
 
 

+ 4 - 4
src/me/hammerle/snuviengine/game/BoxList.java

@@ -5,7 +5,7 @@ import java.util.List;
 
 public class BoxList
 {
-    private static final double MAX_SIZE = 1;
+    private static final double MAX_SIZE = 0.5;
     
     public static class Node
     {
@@ -51,7 +51,7 @@ public class BoxList
         
         nodes = new Node[partionX][partionY];
         
-        for(int i = 0; i < 10000; i++)
+        for(int i = 0; i < 132000; i++)
         {
             Node n = new Node();
             n.next = freeNodes;
@@ -116,8 +116,8 @@ public class BoxList
     {
         int sx = Math.max(Math.min((int) ((minX + boxMinX - MAX_SIZE) / size), partionX - 1), 0);
         int sy = Math.max(Math.min((int) ((minY + boxMinY - MAX_SIZE) / size), partionY - 1), 0);
-        int ex = Math.max(Math.min((int) Math.ceil((maxX + boxMinX + MAX_SIZE) / size), partionX - 1), 0);
-        int ey = Math.max(Math.min((int) Math.ceil((maxY + boxMinY + MAX_SIZE) / size), partionY - 1), 0);
+        int ex = Math.max(Math.min((int) ((maxX + boxMinX + MAX_SIZE) / size), partionX - 1), 0);
+        int ey = Math.max(Math.min((int) ((maxY + boxMinY + MAX_SIZE) / size), partionY - 1), 0);
         
         List<Entity> list = new LinkedList<>();
         

+ 13 - 3
src/me/hammerle/snuviengine/game/Entity.java

@@ -18,6 +18,8 @@ public class Entity
     
     public Node node;
     
+    public int counter = 0;
+    
     public Entity(Game game, double width, double height)
     {
         this.game = game;
@@ -26,8 +28,8 @@ public class Entity
         this.width = width;
         this.height = height;
         
-        vx = 0.5;
-        vy = 0.5;
+        vx = Math.random() * 4 - 2;
+        vy = Math.random() * 4 - 2;
     }
     
     private boolean isColliding(Entity ent)
@@ -44,6 +46,14 @@ public class Entity
     
     public void tick()
     {
+        counter++;
+        if(counter == 200)
+        {
+            counter = 0;
+            vx = Math.random() * 4 - 2;
+            vy = Math.random() * 4 - 2;
+        }
+        
         if(vx == 0.0 && vy == 0.0)
         {
             return;
@@ -178,7 +188,7 @@ public class Entity
         node = game.entities.add(this);
     }
     
-    public void renderTick()
+    public void renderTick(double lag)
     {
         Shader.getColorRenderer().setDepth((float) yPos);
         Shader.getColorRenderer().drawRectangle(

+ 16 - 13
src/me/hammerle/snuviengine/game/Game.java

@@ -28,16 +28,16 @@ public class Game extends Engine
     public Game()
     {
         Random r = new Random(100);
-        for(int i = 0; i < 5000; i++)
+        for(int i = 0; i < 4096; i++)
         {
-            Entity ent = new Entity(this, r.nextDouble() * 2.0, r.nextDouble() * 2.0);
-            ent.setPosition(r.nextDouble() * 400.0, r.nextDouble() * 300);
+            Entity ent = new Entity(this, 1.0, 1.0);
+            ent.setPosition((int) (r.nextDouble() * 400.0), (int) (r.nextDouble() * 300));
             ent.node = entities.add(ent);
             list.add(ent);
         }
         
-        Hero hero = new Hero(this, 5.0, 5.0);
-        hero.setPosition(450.0, 200);
+        Hero hero = new Hero(this, 1.0, 1.0);
+        hero.setPosition(300.0, 200);
         hero.node = entities.add(hero);
         list.add(hero);
     }
@@ -45,17 +45,16 @@ public class Game extends Engine
     @Override
     public void init()
     {
+        setNanosPerTick(10_000_000);
     }
 
-    private int c = 0;
-    
     @Override
     public void tick()
     {        
         CLOCK.start();
         list.forEach(ent -> ent.tick());
         CLOCK.stop();
-        CLOCK.printTime(entities.amount + " Time: ");
+        //CLOCK.printTime(entities.amount + " Time: ");
         
         /*if(!list.isEmpty())
         {
@@ -76,16 +75,20 @@ public class Game extends Engine
         }*/
     }
     
-    private static final Clock CLOCK = new Clock(100);
+    private static final Clock CLOCK = new Clock(250);
     
     @Override
-    public void renderTick()
+    public void renderTick(double lag)
     {
         Shader.setTextureEnabled(false);
         Shader.setColorEnabled(true);
-
-        //Shader.setDepthTestUsing(true);
-        list.forEach(ent -> ent.renderTick());
+        list.forEach(ent -> ent.renderTick(lag));
+        
+        Shader.setTextureEnabled(true);
+        Shader.setColorEnabled(true);
+        Shader.getFontRenderer().drawString(5, 5, true, "FPS " + String.format("%.1f", getFps()));
+        Shader.getFontRenderer().drawString(5, 14, true, "TPS " + String.format("%.1f", getTps()));
+        
         //Shader.getColorRenderer().drawRectangle(0.0f, 0.0f, 100.0f, 100.0f, 0xFF0000FF);
 
         /*for(int i = 0; i < 400; i++)

+ 5 - 5
src/me/hammerle/snuviengine/game/Hero.java

@@ -10,21 +10,21 @@ public class Hero extends Entity
     }
     
     @Override
-    public void renderTick()
+    public void renderTick(double lag)
     {
         Shader.getColorRenderer().setDepth((float) yPos);
         Shader.getColorRenderer().drawRectangle(
-                (float) xPos, 
-                (float) yPos, 
+                (float) (xPos), 
+                (float) (yPos), 
                 (float) (xPos + width), 
-                (float) (yPos + height), 
+                (float) (yPos + height),
                 0xAAFF0000);
     }
 
     @Override
     public void tick()
     {
-        double nvx = .0;
+        double nvx = 0.0;
         double nvy = 0.0;
         double speed = 3;
         

+ 8 - 1
src/me/hammerle/snuviengine/util/Clock.java

@@ -9,6 +9,8 @@ public class Clock
     private long time;
     private boolean stable = false;
     
+    private long min = Long.MAX_VALUE;
+    
     public Clock(int dataLength)
     {
         this.dataLength = dataLength;
@@ -37,7 +39,12 @@ public class Clock
     {
         if(stable)
         {
-            System.out.println( m + " " + (sum / dataLength));
+            long l = sum / dataLength;
+            if(l < min)
+            {
+                min = l;
+            }
+            System.out.println( m + " " + l + " " + min);
         }
     }
 }