summaryrefslogtreecommitdiffstats
path: root/src/Game.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Game.cpp')
-rw-r--r--src/Game.cpp30
1 files changed, 21 insertions, 9 deletions
diff --git a/src/Game.cpp b/src/Game.cpp
index 8f5af26..93b13c4 100644
--- a/src/Game.cpp
+++ b/src/Game.cpp
@@ -29,7 +29,7 @@
namespace Zoom {
-Game::Game(bool multisample) : playerPos(vmml::vec3f::ZERO), playerRot(vmml::mat4f::IDENTITY),
+Game::Game(bool multisample) : playerPos(vmml::vec3f::ZERO), playerRotY(vmml::mat4f::IDENTITY), playerRotX(0),
input(0), lightPos(0) {
glClearColor(0.0, 0.0, 0.0, 1.0);
glClearDepth(1.0);
@@ -63,8 +63,6 @@ Game::Game(bool multisample) : playerPos(vmml::vec3f::ZERO), playerRot(vmml::mat
Shader::loadProgram("default.vert", "default.frag");
- playerRot.rotate_y(-M_PI/6);
-
loadLevel("level.xml");
triangles.insert(triangles.end(), level->getRooms().front().walls.begin(), level->getRooms().front().walls.end());
std::sort(triangles.begin(), triangles.end(), Renderer::TextureSorter());
@@ -76,24 +74,37 @@ bool Game::loadLevel(const std::string &name) {
return level;
}
+void Game::turn(float x, float y) {
+ playerRotY.rotate_y(-x*M_PI/180/10);
+
+ playerRotX -= y*M_PI/180/10;
+ if(playerRotX > M_PI_2)
+ playerRotX = M_PI_2;
+ else if(playerRotX < -M_PI_2)
+ playerRotX = -M_PI_2;
+}
+
void Game::run(int delta) {
lightPos += delta;
lightPos %= 24000;
- playerRot.rotate_y(delta*M_PI/180/40);
+ vmml::vec3f playerMove(vmml::vec3f::ZERO);
if(input & FORWARD) {
- playerPos -= playerRot*vmml::vec3f::UNIT_Z*0.01*delta;
+ playerMove -= playerRotY*vmml::vec3f::UNIT_Z;
}
if(input & BACKWARD) {
- playerPos += playerRot*vmml::vec3f::UNIT_Z*0.01*delta;
+ playerMove += playerRotY*vmml::vec3f::UNIT_Z;
}
if(input & LEFT) {
- playerPos -= playerRot*vmml::vec3f::UNIT_X*0.01*delta;
+ playerMove -= playerRotY*vmml::vec3f::UNIT_X;
}
if(input & RIGHT) {
- playerPos += playerRot*vmml::vec3f::UNIT_X*0.01*delta;
+ playerMove += playerRotY*vmml::vec3f::UNIT_X;
}
+
+ playerMove.normalize();
+ playerPos += playerMove*0.01*delta;
}
void Game::render() {
@@ -122,7 +133,8 @@ void Game::render() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- vmml::mat4f transform(playerRot), inverse;
+ vmml::mat4f transform(playerRotY), inverse;
+ transform.rotate_x(playerRotX);
transform.set_translation(playerPos);
transform.inverse(inverse);