Re-vectorize movespeed and friction physics.

origin
Joshua Sigona 3 years ago
parent 0a020ab3a7
commit 46f41f2c86
  1. 102
      src/sig/SigRenderer.java

@ -66,6 +66,8 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene
final static float TURNSPEED = 0.004f; final static float TURNSPEED = 0.004f;
public static float gravity = 0.01f; public static float gravity = 0.01f;
public static float fallSpd = 0; public static float fallSpd = 0;
public static float xSpeed = 0f;
public static float zSpeed = 0f;
public static int jumpsAvailable = 1; public static int jumpsAvailable = 1;
@ -82,6 +84,8 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene
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; spaceHeld=false;
boolean wLast=true,aLast=true;
public static MouseEvent request; public static MouseEvent request;
public static MouseEvent temp_request; public static MouseEvent temp_request;
public static MouseHandler answer; public static MouseHandler answer;
@ -92,55 +96,90 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene
public static Cursor invisibleCursor; public static Cursor invisibleCursor;
void addSpeed(Vector v) { void addSpeed(Vector v) {
vCameraSpeed.x=Math.min(MOVESPEED,Math.max(-MOVESPEED,v.x)); //vCameraSpeed = Vector.add(vCameraSpeed,v);
vCameraSpeed.y=Math.min(MOVESPEED,Math.max(-MOVESPEED,v.y)); xSpeed+=v.x;
vCameraSpeed.z=Math.min(MOVESPEED,Math.max(-MOVESPEED,v.z)); zSpeed+=v.z;
} }
boolean checkCollisionSquare(float x,float y,float z) { boolean checkCollisionSquare(float x,float y,float z) {
for (int yy=0;yy<cameraHeight;yy++) { for (int yy=0;yy<cameraHeight;yy++) {
if (blockGrid.containsKey((float)Math.floor(vCamera.x+x+cameraCollisionPadding)+"_"+(float)Math.floor(vCamera.y+y+yy)+"_"+(float)Math.floor(vCamera.z+z+cameraCollisionPadding))|| if (blockGrid.containsKey((float)Math.floor(vCamera.x+x+cameraCollisionPadding)+"_"+(float)Math.floor(vCamera.y+y+yy)+"_"+(float)Math.floor(vCamera.z+z+cameraCollisionPadding))||
blockGrid.containsKey((float)Math.floor(vCamera.x+x-cameraCollisionPadding)+"_"+(float)Math.floor(vCamera.y+y+yy)+"_"+(float)Math.floor(vCamera.z+z+cameraCollisionPadding))|| blockGrid.containsKey((float)Math.floor(vCamera.x+x-cameraCollisionPadding)+"_"+(float)Math.floor(vCamera.y+y+yy)+"_"+(float)Math.floor(vCamera.z+z+cameraCollisionPadding))||
blockGrid.containsKey((float)Math.floor(vCamera.x+x+cameraCollisionPadding)+"_"+(float)Math.floor(vCamera.y+y+yy)+"_"+(float)Math.floor(vCamera.z+z-cameraCollisionPadding))|| blockGrid.containsKey((float)Math.floor(vCamera.x+x+cameraCollisionPadding)+"_"+(float)Math.floor(vCamera.y+y+yy)+"_"+(float)Math.floor(vCamera.z+z-cameraCollisionPadding))||
blockGrid.containsKey((float)Math.floor(vCamera.x+x-cameraCollisionPadding)+"_"+(float)Math.floor(vCamera.y+y+yy)+"_"+(float)Math.floor(vCamera.z+z-cameraCollisionPadding))) { blockGrid.containsKey((float)Math.floor(vCamera.x+x-cameraCollisionPadding)+"_"+(float)Math.floor(vCamera.y+y+yy)+"_"+(float)Math.floor(vCamera.z+z-cameraCollisionPadding))) {
return false; return false;
} }
} }
return true; return true;
} }
void move(float maxSpeed) { void move() {
Vector speed = new Vector(xSpeed,0,zSpeed);
if (Vector.length(speed)>MOVESPEED) {
speed = Vector.multiply(Vector.normalize(speed),MOVESPEED);
xSpeed = speed.x;
zSpeed = speed.z;
}
float tempY = vCameraSpeed.y; float tempY = vCameraSpeed.y;
if (xSpeed==0&&zSpeed==0) {
return;
}
vCameraSpeed.y = 0; vCameraSpeed.y = 0;
vCameraSpeed = Vector.multiply(Vector.normalize(vCameraSpeed),maxSpeed); vCameraSpeed = Vector.multiply(Vector.normalize(speed),Vector.length(speed));
vCameraSpeed.y=tempY; vCameraSpeed.y=tempY;
if (FLYING_MODE||checkCollisionSquare(vCameraSpeed.x,0,0)) { if (FLYING_MODE||checkCollisionSquare(vCameraSpeed.x,0,0)) {
vCamera.x+=vCameraSpeed.x; vCamera.x+=vCameraSpeed.x;
} }
if (FLYING_MODE||checkCollisionSquare(0,vCameraSpeed.y,0)) { /*if (FLYING_MODE||checkCollisionSquare(0,vCameraSpeed.y,0)) {
vCamera.y+=vCameraSpeed.y; vCamera.y+=vCameraSpeed.y;
} }*/
if (FLYING_MODE||checkCollisionSquare(0,0,vCameraSpeed.z)) { if (FLYING_MODE||checkCollisionSquare(0,0,vCameraSpeed.z)) {
vCamera.z+=vCameraSpeed.z; vCamera.z+=vCameraSpeed.z;
} }
} }
void friction(Vector v) { void friction(Vector v,float friction) {
vCameraSpeed.x=Math.signum(vCameraSpeed.x)>0?(vCameraSpeed.x-vCameraFriction)<0?0:vCameraSpeed.x-vCameraFriction:(vCameraSpeed.x+vCameraFriction)>0?0:vCameraSpeed.x+vCameraFriction; /*System.out.println(vCameraSpeed);
vCameraSpeed.x=Math.signum(vCameraSpeed.x)>0?(vCameraSpeed.x-friction)<0?0:vCameraSpeed.x-friction:(vCameraSpeed.x+friction)>0?0:vCameraSpeed.x+friction;
//vCameraSpeed.y=Math.signum(vCameraSpeed.y)>0?(vCameraSpeed.y-vCameraFriction)<0?0:vCameraSpeed.y-vCameraFriction:(vCameraSpeed.y+vCameraFriction)>0?0:vCameraSpeed.y+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; vCameraSpeed.z=Math.signum(vCameraSpeed.z)>0?(vCameraSpeed.z-friction)<0?0:vCameraSpeed.z-friction:(vCameraSpeed.z+friction)>0?0:vCameraSpeed.z+friction;*/
float xRatio = 0f;
float zRatio = 0f;
if (xSpeed==0&&zSpeed==0) {
return;
}
float absXSpeed = Math.abs(xSpeed);
float absZSpeed = Math.abs(zSpeed);
if (absXSpeed>absZSpeed) {
zRatio = absZSpeed/absXSpeed;
xRatio = 1 - zRatio;
} else {
xRatio = absXSpeed/absZSpeed;
zRatio = 1 - xRatio;
}
xSpeed=Math.signum(xSpeed)>0?(xSpeed-friction*xRatio)<0?0:xSpeed-friction*xRatio:(xSpeed+friction*xRatio)>0?0:xSpeed+friction*xRatio;
zSpeed=Math.signum(zSpeed)>0?(zSpeed-friction*zRatio)<0?0:zSpeed-friction*zRatio:(zSpeed+friction*zRatio)>0?0:zSpeed+friction*zRatio;
} }
public void runGameLoop() { public void runGameLoop() {
friction(vCameraSpeed); move();
if (checkCollisionSquare(0,-gravity,0)) { if (checkCollisionSquare(0,-gravity,0)) {
fallSpd=Math.max(-maxCameraSpeed.y,fallSpd-gravity); fallSpd=Math.max(-maxCameraSpeed.y,fallSpd-gravity);
} else friction(vCameraSpeed,0.004f); //Air friction.
if (fallSpd<0) { } else {
vCamera.y=(float)Math.ceil(vCamera.y); if (!(wHeld||sHeld||aHeld||dHeld)) {
fallSpd=0; friction(vCameraSpeed,MOVESPEED/4);
jumpsAvailable=1; }
if (fallSpd<0) {
vCamera.y=(float)Math.ceil(vCamera.y);
fallSpd=0;
jumpsAvailable=1;
}
} }
if (fallSpd!=0) { if (fallSpd!=0) {
@ -172,36 +211,35 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene
if (leftHeld) { if (leftHeld) {
roll+=MOVESPEED; roll+=MOVESPEED;
} }
if (wHeld||sHeld) { if (wHeld||sHeld) {
Vector forward = Vector.multiply(vLookDir,MOVESPEED); Vector forward = Vector.multiply(vLookDir,MOVESPEED);
if (!FLYING_MODE) { if (!FLYING_MODE) {
forward.y=0; forward.y=0;
} }
if (wHeld) { if (wLast&&wHeld) {
addSpeed(forward); addSpeed(forward);
move(MOVESPEED); // move(MOVESPEED);
} }
if (sHeld) { if (!wLast&&sHeld) {
addSpeed(Vector.multiply(forward,-1)); addSpeed(Vector.multiply(forward,-1));
move(MOVESPEED); //move(MOVESPEED);
} }
} }
if (aHeld) { if (aLast&&aHeld) {
Vector leftStrafe = Vector.multiply(Matrix.MultiplyVector(Matrix.MakeRotationY((float)-Math.PI/2), vLookDir),MOVESPEED); Vector leftStrafe = Vector.multiply(Matrix.MultiplyVector(Matrix.MakeRotationY((float)-Math.PI/2), vLookDir),MOVESPEED);
if (!FLYING_MODE) { if (!FLYING_MODE) {
leftStrafe.y=0; leftStrafe.y=0;
} }
addSpeed(leftStrafe); addSpeed(leftStrafe);
move(MOVESPEED); //move(MOVESPEED);
} }
if (dHeld) { if (!aLast&&dHeld) {
Vector rightStrafe = Vector.multiply(Matrix.MultiplyVector(Matrix.MakeRotationY((float)Math.PI/2), vLookDir),MOVESPEED); Vector rightStrafe = Vector.multiply(Matrix.MultiplyVector(Matrix.MakeRotationY((float)Math.PI/2), vLookDir),MOVESPEED);
if (!FLYING_MODE) { if (!FLYING_MODE) {
rightStrafe.y=0; rightStrafe.y=0;
} }
addSpeed(rightStrafe); addSpeed(rightStrafe);
move(MOVESPEED); //move(MOVESPEED);
} }
if (answer!=null) { if (answer!=null) {
if (answer.e.getButton()==MouseEvent.BUTTON1) { if (answer.e.getButton()==MouseEvent.BUTTON1) {
@ -449,15 +487,19 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene
downHeld=true; downHeld=true;
}break; }break;
case KeyEvent.VK_W:{ case KeyEvent.VK_W:{
wLast=true;
wHeld=true; wHeld=true;
}break; }break;
case KeyEvent.VK_D:{ case KeyEvent.VK_D:{
aLast=false;
dHeld=true; dHeld=true;
}break; }break;
case KeyEvent.VK_A:{ case KeyEvent.VK_A:{
aLast=true;
aHeld=true; aHeld=true;
}break; }break;
case KeyEvent.VK_S:{ case KeyEvent.VK_S:{
wLast=false;
sHeld=true; sHeld=true;
}break; }break;
case KeyEvent.VK_E:{ case KeyEvent.VK_E:{
@ -488,15 +530,19 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene
downHeld=false; downHeld=false;
}break; }break;
case KeyEvent.VK_W:{ case KeyEvent.VK_W:{
wLast=false;
wHeld=false; wHeld=false;
}break; }break;
case KeyEvent.VK_D:{ case KeyEvent.VK_D:{
aLast=true;
dHeld=false; dHeld=false;
}break; }break;
case KeyEvent.VK_A:{ case KeyEvent.VK_A:{
aLast=false;
aHeld=false; aHeld=false;
}break; }break;
case KeyEvent.VK_S:{ case KeyEvent.VK_S:{
wLast=true;
sHeld=false; sHeld=false;
}break; }break;
case KeyEvent.VK_E:{ case KeyEvent.VK_E:{

Loading…
Cancel
Save