Implement rudimentary player movement; fix geometry logic bugs
parent
065f63e66d
commit
3509d29964
1
Makefile
1
Makefile
|
@ -22,6 +22,7 @@ sources ::= main.c \
|
|||
engine/scene.c \
|
||||
engine/tga.c \
|
||||
engine/ui.c \
|
||||
game/input.c \
|
||||
game/level.c \
|
||||
game/player.c
|
||||
|
||||
|
|
|
@ -17,17 +17,19 @@ Transform identity() {
|
|||
Transform multiply(Transform t1, Transform t2) {
|
||||
GLfloat* a = (GLfloat*) &t1;
|
||||
GLfloat* b = (GLfloat*) &t2;
|
||||
Transform result;
|
||||
GLfloat* c = (GLfloat*) &result;
|
||||
|
||||
for (size_t row = 0; row < 4; ++row) {
|
||||
for (size_t col = 0; col < 4; ++col) {
|
||||
b[(row * 4) + col] =
|
||||
c[(row * 4) + col] =
|
||||
a[(row * 4) + 0] * b[(0 * 4) + col]
|
||||
+ a[(row * 4) + 1] * b[(1 * 4) + col]
|
||||
+ a[(row * 4) + 2] * b[(2 * 4) + col]
|
||||
+ a[(row * 4) + 3] * b[(3 * 4) + col];
|
||||
}
|
||||
}
|
||||
return t2;
|
||||
return result;
|
||||
}
|
||||
|
||||
void translate(Transform* transform, Vector3D vec) {
|
||||
|
@ -47,6 +49,7 @@ void rotate(Transform* transform, Vector3D axis, float angle) {
|
|||
float sinA = sinf(angle);
|
||||
float cosA = cosf(angle);
|
||||
float omcA = 1 - cosA;
|
||||
|
||||
*transform = multiply(
|
||||
(Transform) { l*l*omcA + cosA, m*l*omcA - n*sinA, n*l*omcA + m*sinA, 0.0f,
|
||||
l*m*omcA + n*sinA, m*m*omcA + cosA, n*m*omcA - l*sinA, 0.0f,
|
||||
|
@ -55,7 +58,7 @@ void rotate(Transform* transform, Vector3D axis, float angle) {
|
|||
*transform);
|
||||
}
|
||||
|
||||
Vector3D applyTransform(Transform* transform, Vector3D vec) {
|
||||
Vector3D applyTransform(Transform transform, Vector3D vec) {
|
||||
GLfloat* a = (GLfloat*) &transform;
|
||||
GLfloat b[4] = { vec.x, vec.y, vec.z, 1.0f };
|
||||
GLfloat c[4];
|
||||
|
|
|
@ -25,7 +25,7 @@ Transform identity();
|
|||
Transform multiply(Transform t1, Transform t2);
|
||||
void translate(Transform* transform, Vector3D vec);
|
||||
void rotate(Transform* transform, Vector3D axis, float angle);
|
||||
Vector3D applyTransform(Transform* transform, Vector3D vec);
|
||||
Vector3D applyTransform(Transform transform, Vector3D vec);
|
||||
Vector3D translationOf(Transform transform);
|
||||
Vector3D normalized(Vector3D vec);
|
||||
|
||||
|
|
|
@ -5,10 +5,16 @@
|
|||
void onKeyPressed(unsigned char key, int x, int y) {
|
||||
switch (key) {
|
||||
case 'w':
|
||||
playerMovementInput(0.0f, 1.0f);
|
||||
break;
|
||||
case 's':
|
||||
playerMovementInput(0.0f, -1.0f);
|
||||
break;
|
||||
case 'a':
|
||||
playerMovementInput(-1.0f, 0.0f);
|
||||
break;
|
||||
case 'd':
|
||||
//playerMovementInput();
|
||||
playerMovementInput(1.0f, 0.0f);
|
||||
break;
|
||||
default:
|
||||
break;
|
|
@ -4,10 +4,14 @@
|
|||
#include "engine/render.h"
|
||||
|
||||
Scene* playerCharacter;
|
||||
static Transform movementDirectionTransform;
|
||||
|
||||
|
||||
|
||||
void initPlayer() {
|
||||
movementDirectionTransform = identity();
|
||||
rotate(&movementDirectionTransform, (Vector3D) { 0.0f, 1.0f, 0.0f }, - TAU / 8.0f);
|
||||
|
||||
playerCharacter = newScene();
|
||||
cameraAnchor = playerCharacter;
|
||||
playerCharacter->solid = importSolid("assets/playercharacter.3ds");
|
||||
|
@ -19,8 +23,17 @@ void spawnPlayer(Transform transform) {
|
|||
}
|
||||
|
||||
void playerMovementInput(float x, float y) {
|
||||
Transform rotation = identity();
|
||||
rotate(&rotation, (Vector3D) { 0.0f, 1.0f, 0.0f }, TAU / 8.0f);
|
||||
Vector3D movementDirection = (Vector3D) { x, 0.0f, -y };
|
||||
movementDirection = normalized(applyTransform(&rotation, movementDirection));
|
||||
if (!playerCharacter) {
|
||||
return;
|
||||
}
|
||||
|
||||
Vector3D direction = (Vector3D) { x, 0.0f, -y };
|
||||
direction = normalized(
|
||||
applyTransform(movementDirectionTransform, direction));
|
||||
float velocity = 1.0f;
|
||||
Vector3D movement = { direction.x * velocity,
|
||||
direction.y * velocity,
|
||||
direction.z * velocity };
|
||||
|
||||
translate(&(playerCharacter->transform), movement);
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#include "engine/render.h"
|
||||
#include "engine/ui.h"
|
||||
|
||||
#include "game/input.h"
|
||||
#include "game/level.h"
|
||||
#include "game/player.h"
|
||||
|
||||
|
@ -50,7 +51,7 @@ int main(int argc, char** argv) {
|
|||
|
||||
glutDisplayFunc(renderFrame);
|
||||
glutReshapeFunc(resizeStage);
|
||||
//glutKeyboardFunc(key_pressed);
|
||||
glutKeyboardFunc(onKeyPressed);
|
||||
//glutMouseFunc(mouse_button_event);
|
||||
//glutMotionFunc(mouse_motion_event);
|
||||
|
||||
|
|
Loading…
Reference in New Issue