diff --git a/src/sig/SigRenderer.java b/src/sig/SigRenderer.java index b30bc16..aafb840 100644 --- a/src/sig/SigRenderer.java +++ b/src/sig/SigRenderer.java @@ -42,13 +42,17 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene public static Matrix matProj = Matrix.MakeProjection(fFov,fAspectRatio,fNear,fFar); public static Vector vCamera = new Vector(31.5f,20f,31.5f); + public static Vector vCameraSpeed = new Vector(0,0,0); + public static float vCameraFriction = 0.5f; public static Vector vLookDir = new Vector(0,0,1); public static float yaw = (float)(-Math.PI/8); public static float pitch = (float)(-Math.PI/6); public static float roll = 0; - final float MOVESPEED = 0.2f; - final float TURNSPEED = 0.05f; + final static float MOVESPEED = 0.2f; + final static float TURNSPEED = 0.05f; + + final public static Vector maxCameraSpeed = new Vector(MOVESPEED,1f,MOVESPEED); public static float[] depthBuffer; public static Triangle[] depthBuffer_tri; @@ -65,19 +69,37 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene public static MouseHandler answer; public static MouseHandler tempAnswer = null; - void move(Vector v) { - if (FLYING_MODE||!blockGrid.containsKey((float)Math.floor(vCamera.x+v.x)+"_"+(float)Math.floor(vCamera.y)+"_"+(float)Math.floor(vCamera.z))) { - vCamera.x+=v.x; + void addSpeed(Vector v) { + vCameraSpeed.x=Math.min(MOVESPEED,Math.max(-MOVESPEED,v.x)); + vCameraSpeed.y=Math.min(MOVESPEED,Math.max(-MOVESPEED,v.y)); + vCameraSpeed.z=Math.min(MOVESPEED,Math.max(-MOVESPEED,v.z)); + } + + void move(float maxSpeed) { + float tempY = vCameraSpeed.y; + vCameraSpeed.y = 0; + vCameraSpeed = Vector.multiply(Vector.normalize(vCameraSpeed),maxSpeed); + vCameraSpeed.y=tempY; + if (FLYING_MODE||!blockGrid.containsKey((float)Math.floor(vCamera.x+vCameraSpeed.x)+"_"+(float)Math.floor(vCamera.y)+"_"+(float)Math.floor(vCamera.z))) { + vCamera.x+=vCameraSpeed.x; } - if (FLYING_MODE||!blockGrid.containsKey((float)Math.floor(vCamera.x)+"_"+(float)Math.floor(vCamera.y+v.y)+"_"+(float)Math.floor(vCamera.z))) { - vCamera.y+=v.y; + if (FLYING_MODE||!blockGrid.containsKey((float)Math.floor(vCamera.x)+"_"+(float)Math.floor(vCamera.y+vCameraSpeed.y)+"_"+(float)Math.floor(vCamera.z))) { + vCamera.y+=vCameraSpeed.y; } - if (FLYING_MODE||!blockGrid.containsKey((float)Math.floor(vCamera.x)+"_"+(float)Math.floor(vCamera.y)+"_"+(float)Math.floor(vCamera.z+v.z))) { - vCamera.z+=v.z; + if (FLYING_MODE||!blockGrid.containsKey((float)Math.floor(vCamera.x)+"_"+(float)Math.floor(vCamera.y)+"_"+(float)Math.floor(vCamera.z+vCameraSpeed.z))) { + vCamera.z+=vCameraSpeed.z; } } + void friction(Vector v) { + vCameraSpeed.x=Math.signum(vCameraSpeed.x)>0?(vCameraSpeed.x-vCameraFriction)<0?0:vCameraSpeed.x-vCameraFriction:(vCameraSpeed.x+vCameraFriction)>0?0:vCameraSpeed.x+vCameraFriction; + vCameraSpeed.y=Math.signum(vCameraSpeed.y)>0?(vCameraSpeed.y-vCameraFriction)<0?0:vCameraSpeed.y-vCameraFriction:(vCameraSpeed.y+vCameraFriction)>0?0:vCameraSpeed.y+vCameraFriction; + vCameraSpeed.z=Math.signum(vCameraSpeed.z)>0?(vCameraSpeed.z-vCameraFriction)<0?0:vCameraSpeed.z-vCameraFriction:(vCameraSpeed.z+vCameraFriction)>0?0:vCameraSpeed.z+vCameraFriction; + } + public void runGameLoop() { + friction(vCameraSpeed); + if (upHeld) { pitch+=TURNSPEED; } @@ -97,26 +119,29 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene forward.y=0; } if (wHeld) { - move(forward); + addSpeed(forward); + move(MOVESPEED); } if (sHeld) { - move(Vector.multiply(forward,-1)); + addSpeed(Vector.multiply(forward,-1)); + move(MOVESPEED); } - System.out.println(vCamera); } if (aHeld) { Vector leftStrafe = Vector.multiply(Matrix.MultiplyVector(Matrix.MakeRotationY((float)-Math.PI/2), vLookDir),MOVESPEED); if (!FLYING_MODE) { leftStrafe.y=0; } - move(leftStrafe); + addSpeed(leftStrafe); + move(MOVESPEED); } if (dHeld) { Vector rightStrafe = Vector.multiply(Matrix.MultiplyVector(Matrix.MakeRotationY((float)Math.PI/2), vLookDir),MOVESPEED); if (!FLYING_MODE) { rightStrafe.y=0; } - move(rightStrafe); + addSpeed(rightStrafe); + move(MOVESPEED); } if (answer!=null) { if (answer.e.getButton()==MouseEvent.BUTTON1) {