Re-vectorize movespeed and friction physics.
This commit is contained in:
parent
0a020ab3a7
commit
46f41f2c86
@ -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…
x
Reference in New Issue
Block a user