Browse Source

Implemented framerate-independent movement speed

tess_experiment
Nico de Poel 3 years ago
parent
commit
8b865cdb8a
  1. 69
      input.c

69
input.c

@ -1,12 +1,13 @@
#include "common.h" #include "common.h"
#include "input.h" #include "input.h"
#include "time.h"
#include <psxpad.h> #include <psxpad.h>
static u_char padBuffer[2][34]; static u_char padBuffer[2][34];
static const int moveSpeed = 32;
static const short rotSpeed = 32;
static const int moveSpeed = 1024;
static const short rotSpeed = 1024;
static const char deadZone = 0x30; static const char deadZone = 0x30;
void input_init() void input_init()
@ -28,68 +29,72 @@ void input_process()
MATRIX cam_mtx; MATRIX cam_mtx;
RotMatrixQ(&cam_rot, &cam_mtx); RotMatrixQ(&cam_rot, &cam_mtx);
int deltaTime = time_getDeltaTime();
int moveInterval = (moveSpeed * deltaTime) >> 12;
int rotInterval = (moveSpeed * deltaTime) >> 12;
u_short buttons = *((u_short*)(padBuffer[0]+2)); u_short buttons = *((u_short*)(padBuffer[0]+2));
if (!(buttons & PAD_UP)) if (!(buttons & PAD_UP))
{ {
// Move forward (+Y) // Move forward (+Y)
cam_pos.vx += (cam_mtx.m[0][1] * moveSpeed) >> 12;
cam_pos.vy += (cam_mtx.m[1][1] * moveSpeed) >> 12;
cam_pos.vz += (cam_mtx.m[2][1] * moveSpeed) >> 12;
cam_pos.vx += (cam_mtx.m[0][1] * moveInterval) >> 12;
cam_pos.vy += (cam_mtx.m[1][1] * moveInterval) >> 12;
cam_pos.vz += (cam_mtx.m[2][1] * moveInterval) >> 12;
} }
if (!(buttons & PAD_DOWN)) if (!(buttons & PAD_DOWN))
{ {
// Move backward (-Y) // Move backward (-Y)
cam_pos.vx -= (cam_mtx.m[0][1] * moveSpeed) >> 12;
cam_pos.vy -= (cam_mtx.m[1][1] * moveSpeed) >> 12;
cam_pos.vz -= (cam_mtx.m[2][1] * moveSpeed) >> 12;
cam_pos.vx -= (cam_mtx.m[0][1] * moveInterval) >> 12;
cam_pos.vy -= (cam_mtx.m[1][1] * moveInterval) >> 12;
cam_pos.vz -= (cam_mtx.m[2][1] * moveInterval) >> 12;
} }
if (!(buttons & PAD_LEFT)) if (!(buttons & PAD_LEFT))
{ {
// Rotate left // Rotate left
cam_rot.vz += rotSpeed;
cam_rot.vz += rotInterval;
} }
if (!(buttons & PAD_RIGHT)) if (!(buttons & PAD_RIGHT))
{ {
// Rotate right // Rotate right
cam_rot.vz -= rotSpeed;
cam_rot.vz -= rotInterval;
} }
if (!(buttons & PAD_TRIANGLE)) if (!(buttons & PAD_TRIANGLE))
{ {
// Move up (+Z) // Move up (+Z)
cam_pos.vx += (cam_mtx.m[0][2] * moveSpeed) >> 12;
cam_pos.vy += (cam_mtx.m[1][2] * moveSpeed) >> 12;
cam_pos.vz += (cam_mtx.m[2][2] * moveSpeed) >> 12;
cam_pos.vx += (cam_mtx.m[0][2] * moveInterval) >> 12;
cam_pos.vy += (cam_mtx.m[1][2] * moveInterval) >> 12;
cam_pos.vz += (cam_mtx.m[2][2] * moveInterval) >> 12;
} }
if (!(buttons & PAD_CROSS)) if (!(buttons & PAD_CROSS))
{ {
// Move down (-Z) // Move down (-Z)
cam_pos.vx -= (cam_mtx.m[0][2] * moveSpeed) >> 12;
cam_pos.vy -= (cam_mtx.m[1][2] * moveSpeed) >> 12;
cam_pos.vz -= (cam_mtx.m[2][2] * moveSpeed) >> 12;
cam_pos.vx -= (cam_mtx.m[0][2] * moveInterval) >> 12;
cam_pos.vy -= (cam_mtx.m[1][2] * moveInterval) >> 12;
cam_pos.vz -= (cam_mtx.m[2][2] * moveInterval) >> 12;
} }
if (!(buttons & PAD_L1)) if (!(buttons & PAD_L1))
{ {
// Strafe left (-X) // Strafe left (-X)
cam_pos.vx -= (cam_mtx.m[0][0] * moveSpeed) >> 12;
cam_pos.vy -= (cam_mtx.m[1][0] * moveSpeed) >> 12;
cam_pos.vz -= (cam_mtx.m[2][0] * moveSpeed) >> 12;
cam_pos.vx -= (cam_mtx.m[0][0] * moveInterval) >> 12;
cam_pos.vy -= (cam_mtx.m[1][0] * moveInterval) >> 12;
cam_pos.vz -= (cam_mtx.m[2][0] * moveInterval) >> 12;
} }
if (!(buttons & PAD_R1)) if (!(buttons & PAD_R1))
{ {
// Strafe right (+X) // Strafe right (+X)
cam_pos.vx += (cam_mtx.m[0][0] * moveSpeed) >> 12;
cam_pos.vy += (cam_mtx.m[1][0] * moveSpeed) >> 12;
cam_pos.vz += (cam_mtx.m[2][0] * moveSpeed) >> 12;
cam_pos.vx += (cam_mtx.m[0][0] * moveInterval) >> 12;
cam_pos.vy += (cam_mtx.m[1][0] * moveInterval) >> 12;
cam_pos.vz += (cam_mtx.m[2][0] * moveInterval) >> 12;
} }
if (!(buttons & PAD_L2)) if (!(buttons & PAD_L2))
{ {
// Look down // Look down
cam_rot.vx -= rotSpeed;
cam_rot.vx -= rotInterval;
} }
if (!(buttons & PAD_R2)) if (!(buttons & PAD_R2))
{ {
// Look up // Look up
cam_rot.vx += rotSpeed;
cam_rot.vx += rotInterval;
} }
// Check for analog controller // Check for analog controller
@ -106,19 +111,19 @@ void input_process()
if (leftJoyY > -deadZone && leftJoyY < deadZone) leftJoyY = 0; if (leftJoyY > -deadZone && leftJoyY < deadZone) leftJoyY = 0;
// Move forward/backward // Move forward/backward
cam_pos.vx -= (cam_mtx.m[0][1] * leftJoyY * moveSpeed) >> 19;
cam_pos.vy -= (cam_mtx.m[1][1] * leftJoyY * moveSpeed) >> 19;
cam_pos.vz -= (cam_mtx.m[2][1] * leftJoyY * moveSpeed) >> 19;
cam_pos.vx -= (cam_mtx.m[0][1] * leftJoyY * moveInterval) >> 19;
cam_pos.vy -= (cam_mtx.m[1][1] * leftJoyY * moveInterval) >> 19;
cam_pos.vz -= (cam_mtx.m[2][1] * leftJoyY * moveInterval) >> 19;
// Strafe left/right // Strafe left/right
cam_pos.vx += (cam_mtx.m[0][0] * leftJoyX * moveSpeed) >> 19;
cam_pos.vy += (cam_mtx.m[1][0] * leftJoyX * moveSpeed) >> 19;
cam_pos.vz += (cam_mtx.m[2][0] * leftJoyX * moveSpeed) >> 19;
cam_pos.vx += (cam_mtx.m[0][0] * leftJoyX * moveInterval) >> 19;
cam_pos.vy += (cam_mtx.m[1][0] * leftJoyX * moveInterval) >> 19;
cam_pos.vz += (cam_mtx.m[2][0] * leftJoyX * moveInterval) >> 19;
// Rotate left/right // Rotate left/right
cam_rot.vz -= (rightJoyX * rotSpeed) >> 7;
cam_rot.vz -= (rightJoyX * rotInterval) >> 7;
// Look up/down // Look up/down
cam_rot.vx -= (rightJoyY * rotSpeed) >> 7;
cam_rot.vx -= (rightJoyY * rotInterval) >> 7;
} }
} }
Loading…
Cancel
Save