From 98f521289dd44ac8312ec6ff8c619f24e707de12 Mon Sep 17 00:00:00 2001 From: Joshua Sigona Date: Wed, 10 Nov 2021 04:20:45 +0900 Subject: [PATCH] Add small collision radius around player. --- src/sig/SigRenderer.java | 49 +++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/src/sig/SigRenderer.java b/src/sig/SigRenderer.java index 54f31d1..fa2e30b 100644 --- a/src/sig/SigRenderer.java +++ b/src/sig/SigRenderer.java @@ -21,6 +21,8 @@ import java.awt.BorderLayout; import java.awt.Robot; import java.awt.Point; import java.awt.Cursor; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; public class SigRenderer implements KeyListener,MouseListener,MouseMotionListener{ @@ -47,6 +49,9 @@ 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 final float cameraCollisionPadding = 0.2f; + public static Vector vCameraOffset = new Vector(0,1.5f,0); public static Vector vCameraSpeed = new Vector(0,0,0); public static float vCameraFriction = 0.5f; @@ -60,6 +65,8 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene public static float gravity = 0.01f; public static float fallSpd = 0; + public static int jumpsAvailable = 1; + final public static Vector maxCameraSpeed = new Vector(MOVESPEED,1f,MOVESPEED); public static float[] depthBuffer; @@ -70,7 +77,8 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene public static HashMap blockTextures = new HashMap(); boolean upHeld=false,downHeld=false,leftHeld=false,rightHeld=false, - aHeld=false,sHeld=false,dHeld=false,wHeld=false,qHeld=false,eHeld=false; + aHeld=false,sHeld=false,dHeld=false,wHeld=false,qHeld=false,eHeld=false, + spaceHeld=false; public static MouseEvent request; public static MouseEvent temp_request; @@ -87,18 +95,26 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene vCameraSpeed.z=Math.min(MOVESPEED,Math.max(-MOVESPEED,v.z)); } + boolean checkCollisionSquare(float x,float y,float z) { + return !blockGrid.containsKey((float)Math.floor(vCamera.x+x+cameraCollisionPadding)+"_"+(float)Math.floor(vCamera.y+y)+"_"+(float)Math.floor(vCamera.z+z+cameraCollisionPadding))&& + !blockGrid.containsKey((float)Math.floor(vCamera.x+x-cameraCollisionPadding)+"_"+(float)Math.floor(vCamera.y+y)+"_"+(float)Math.floor(vCamera.z+z+cameraCollisionPadding))&& + !blockGrid.containsKey((float)Math.floor(vCamera.x+x+cameraCollisionPadding)+"_"+(float)Math.floor(vCamera.y+y)+"_"+(float)Math.floor(vCamera.z+z-cameraCollisionPadding))&& + !blockGrid.containsKey((float)Math.floor(vCamera.x+x-cameraCollisionPadding)+"_"+(float)Math.floor(vCamera.y+y)+"_"+(float)Math.floor(vCamera.z+z-cameraCollisionPadding)); + } + 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))) { + + if (FLYING_MODE||checkCollisionSquare(vCameraSpeed.x,0,0)) { vCamera.x+=vCameraSpeed.x; } - if (FLYING_MODE||!blockGrid.containsKey((float)Math.floor(vCamera.x)+"_"+(float)Math.floor(vCamera.y+vCameraSpeed.y)+"_"+(float)Math.floor(vCamera.z))) { + if (FLYING_MODE||checkCollisionSquare(0,vCameraSpeed.y,0)) { vCamera.y+=vCameraSpeed.y; } - if (FLYING_MODE||!blockGrid.containsKey((float)Math.floor(vCamera.x)+"_"+(float)Math.floor(vCamera.y)+"_"+(float)Math.floor(vCamera.z+vCameraSpeed.z))) { + if (FLYING_MODE||checkCollisionSquare(0,0,vCameraSpeed.z)) { vCamera.z+=vCameraSpeed.z; } } @@ -111,18 +127,24 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene public void runGameLoop() { friction(vCameraSpeed); - if (!blockGrid.containsKey((float)Math.floor(vCamera.x)+"_"+(float)Math.floor(vCamera.y-gravity)+"_"+(float)Math.floor(vCamera.z))) { + if (checkCollisionSquare(0,-gravity,0)) { fallSpd=Math.max(-maxCameraSpeed.y,fallSpd-gravity); } else if (fallSpd<0) { vCamera.y=(float)Math.ceil(vCamera.y); fallSpd=0; + jumpsAvailable=1; } - if (fallSpd<0) { + if (fallSpd!=0) { vCamera.y+=fallSpd; } + if (spaceHeld&&jumpsAvailable==1&&fallSpd==0&&blockGrid.containsKey((float)Math.floor(vCamera.x)+"_"+(float)Math.floor(vCamera.y-gravity)+"_"+(float)Math.floor(vCamera.z))) { + jumpsAvailable=0; + fallSpd=0.2f; + } + if (upHeld) { pitch+=TURNSPEED; } @@ -234,7 +256,10 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene for (int x=0;x<64;x++) { for (int z=0;z<64;z++) { addBlock(new Vector(x,0,z),BlockType.GRASS,FacingDirection.SOUTH); - if (r.nextInt(2)<1) { + for (int y=1;y