diff --git a/SQCSim2021/engine.cpp b/SQCSim2021/engine.cpp index cc89cab..f5732c6 100644 --- a/SQCSim2021/engine.cpp +++ b/SQCSim2021/engine.cpp @@ -35,6 +35,19 @@ void Engine::Init() glLightfv(GL_LIGHT0, GL_DIFFUSE, light0Diff); glLightfv(GL_LIGHT0, GL_SPECULAR, light0Spec); + // Lumière de Skybox. + GLfloat light1Pos[4] = { 0.0f, 0.0f, 0.0f, 2.0f }; + GLfloat light1Amb[4] = { 1.5f, 1.5f, 1.5f, 1.5f }; + GLfloat light1Diff[4] = { 1.f, 1.f, 1.f, 1.f }; + GLfloat light1Spec[4] = { 1.f, 1.f, 1.f, 1.0f }; + glLightfv(GL_LIGHT1, GL_POSITION, light1Pos); + glLightfv(GL_LIGHT1, GL_AMBIENT, light1Amb); + glLightfv(GL_LIGHT1, GL_DIFFUSE, light1Diff); + glLightfv(GL_LIGHT1, GL_SPECULAR, light1Spec); + + // Blend + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + CenterMouse(); HideCursor(); } @@ -44,7 +57,10 @@ void Engine::DeInit() { } void Engine::LoadResource() { LoadTexture(m_textureFloor, TEXTURE_PATH "grass.png"); LoadTexture(m_textureSkybox, TEXTURE_PATH "skybox.png"); - LoadTexture(m_textureCube, TEXTURE_PATH "metal.png"); + LoadTexture(m_textureCube1, TEXTURE_PATH "metal1.png"); + LoadTexture(m_textureCube2, TEXTURE_PATH "metal2.png"); + LoadTexture(m_textureCube3, TEXTURE_PATH "metal3.png"); + LoadTexture(m_textureCube4, TEXTURE_PATH "metal4.png"); } void Engine::UnloadResource() @@ -66,7 +82,7 @@ void Engine::Render(float elapsedTime) glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - m_player.Move(m_keyW, m_keyS, m_keyA, m_keyD, m_keySpace, elapsedTime); + m_player.Move(m_keyW, m_keyS, m_keyA, m_keyD, m_keySpace, m_keylshift, elapsedTime); m_player.ApplyTransformation(all); m_player.ApplyTransformation(skybox, false); // Version d'ApplyTransformation qui ne tient compte que de la rotation (donc l'objet ne bouge pas relativement au joueur, ce qui est pratique pour une skybox!). @@ -74,6 +90,8 @@ void Engine::Render(float elapsedTime) skybox.Use(); m_textureSkybox.Bind(); glDisable(GL_DEPTH_TEST); // Pour que tout ce qui est dessiné après soit dessiné par-dessus la skybox. + glDisable(GL_LIGHT0); + glEnable(GL_LIGHT1); glBegin(GL_QUADS); glTexCoord2f(0, .75f); @@ -132,12 +150,14 @@ void Engine::Render(float elapsedTime) glEnd(); glEnable(GL_DEPTH_TEST); - all.Use(); + glDisable(GL_LIGHT1); + glEnable(GL_LIGHT0); // Plancher // Les vertex doivent etre affiches dans le sens anti-horaire (CCW) + all.Use(); m_textureFloor.Bind(); - float nbRep = 1.f; + float nbRep = 5.f; glBegin(GL_QUADS); glNormal3f(0, 1, 0); // Normal vector glTexCoord2f(0, 0); @@ -156,7 +176,22 @@ void Engine::Render(float elapsedTime) all.ApplyRotation(gameTime * 100.f, 0.f, 0.f, 1.f); all.ApplyRotation(gameTime * 100.f, 1.f, 0.f, 0.f); all.Use(); - m_textureCube.Bind(); + + switch ((int)(gameTime*5) % 4) { + case 0: + m_textureCube1.Bind(); + break; + case 1: + m_textureCube2.Bind(); + break; + case 2: + m_textureCube3.Bind(); + break; + case 3: + m_textureCube4.Bind(); + break; + } + glEnable(GL_BLEND); glBegin(GL_QUADS); glNormal3f(0, 0, 1); @@ -218,7 +253,7 @@ void Engine::Render(float elapsedTime) glVertex3f(0.5f, -0.5f, 0.5f); glTexCoord2f(1, 0); glVertex3f(0.5f, -0.5f, -0.5f); - + glDisable(GL_BLEND); glEnd(); } @@ -256,6 +291,12 @@ void Engine::KeyPressEvent(unsigned char key) m_keyD = true; } break; + case 38: // Left Shift + if (!m_keylshift) { + std::cout << "Dash!" << std::endl; + m_keylshift = true; + } + break; case 57: // Space if (!m_keySpace) { std::cout << "Jump! " << std::endl; @@ -297,7 +338,10 @@ void Engine::KeyReleaseEvent(unsigned char key) std::cout << "rD " << std::endl; m_keyD = false; break; - case 57: + case 38: // Left Shift + std::cout << "rLS " << std::endl; + m_keylshift = false; + case 57: // Espace std::cout << "rSpace " << std::endl; m_keySpace = false; break; @@ -306,8 +350,8 @@ void Engine::KeyReleaseEvent(unsigned char key) void Engine::MouseMoveEvent(int x, int y) { - m_player.TurnLeftRight(y - (Height() / 2)); - m_player.TurnTopBottom(x - (Width() / 2)); + m_player.TurnLeftRight(x - (Width() / 2)); + m_player.TurnTopBottom(y - (Height() / 2)); // Centrer la souris seulement si elle n'est pas déjà centrée // Il est nécessaire de faire la vérification pour éviter de tomber diff --git a/SQCSim2021/engine.h b/SQCSim2021/engine.h index 51d26b9..0c98e5f 100644 --- a/SQCSim2021/engine.h +++ b/SQCSim2021/engine.h @@ -30,7 +30,10 @@ private: Texture m_textureFloor; Texture m_textureSkybox; - Texture m_textureCube; + Texture m_textureCube1; + Texture m_textureCube2; + Texture m_textureCube3; + Texture m_textureCube4; Player m_player = Player(Vector3f(0, 0, 0)); @@ -38,6 +41,7 @@ private: bool m_keyA = false; bool m_keyS = false; bool m_keyD = false; + bool m_keylshift = false; bool m_keySpace = false; }; diff --git a/SQCSim2021/media/textures/metal.png b/SQCSim2021/media/textures/metal.png index cc821f1..fcdf693 100644 Binary files a/SQCSim2021/media/textures/metal.png and b/SQCSim2021/media/textures/metal.png differ diff --git a/SQCSim2021/media/textures/metal1.png b/SQCSim2021/media/textures/metal1.png new file mode 100644 index 0000000..29e3500 Binary files /dev/null and b/SQCSim2021/media/textures/metal1.png differ diff --git a/SQCSim2021/media/textures/metal2.png b/SQCSim2021/media/textures/metal2.png new file mode 100644 index 0000000..79eee1b Binary files /dev/null and b/SQCSim2021/media/textures/metal2.png differ diff --git a/SQCSim2021/media/textures/metal3.png b/SQCSim2021/media/textures/metal3.png new file mode 100644 index 0000000..e3b03ab Binary files /dev/null and b/SQCSim2021/media/textures/metal3.png differ diff --git a/SQCSim2021/media/textures/metal4.png b/SQCSim2021/media/textures/metal4.png new file mode 100644 index 0000000..3e3a429 Binary files /dev/null and b/SQCSim2021/media/textures/metal4.png differ diff --git a/SQCSim2021/player.cpp b/SQCSim2021/player.cpp index 048aa81..5767bf3 100644 --- a/SQCSim2021/player.cpp +++ b/SQCSim2021/player.cpp @@ -2,100 +2,110 @@ Player::Player(const Vector3f& position, float rotX, float rotY) : m_position(position), m_rotX(rotX), m_rotY(rotY) { } -void Player::TurnLeftRight(float value) { +void Player::TurnLeftRight(float value) { + m_rotY += value; + if (m_rotY > 360) m_rotY = 0; + else if (m_rotY < -360) m_rotY = 0; +} + +void Player::TurnTopBottom(float value) { m_rotX += value; if (m_rotX > 45) m_rotX = 45; else if (m_rotX < -45) m_rotX = -45; } -void Player::TurnTopBottom(float value) { m_rotY += value; } - -void Player::Move(bool front, bool back, bool left, bool right, bool jump, float elapsedTime) { +void Player::Move(bool front, bool back, bool left, bool right, bool jump, bool dash, float elapsedTime) { + static float accWS = 0; + static float accAD = 0; + static float accjmp = 0; + static float yrotrad = 0; + static float xrotrad = 0; + static bool jumped = false; if (jump && !jumped) { - m_accjmp = m_jumpheight; + accjmp = m_jumpforce; jumped = true; } - else if (m_position.y > -0.3f && m_accjmp != 0) { - if (m_accjmp > 0.1f) { + else if (m_position.y > -0.2f && accjmp != 0) { + if (accjmp > 0.f) { if (jump) { - m_accjmp *= 0.95 - m_accjmp * elapsedTime; - m_accjmp -= elapsedTime * 1.1; + accjmp *= 0.95f - accjmp * elapsedTime; + accjmp -= elapsedTime * 1.1; } else { - m_accjmp *= 0.75 - m_accjmp * elapsedTime; - m_accjmp -= elapsedTime * 1.1; + accjmp *= 0.75f - accjmp * elapsedTime; + accjmp -= elapsedTime * 1.1; } } else { - if (jump) m_accjmp -= elapsedTime * 0.7; - else m_accjmp -= elapsedTime * 0.9; + if (jump) accjmp -= elapsedTime * 0.7; + else accjmp -= elapsedTime * 0.9; } front = false; // Empêche le déplacement dans les airs. back = false; left = false; right = false; } - else m_accjmp = 0; + else accjmp = 0; - if (m_position.y < 0) { // Suivi de mouvement pour l'atterrissage. - m_position.y += elapsedTime * 5; + if (m_position.y < 0.f) { //&& jumped) { // Suivi de mouvement pour l'atterrissage. + m_position.y += elapsedTime * 5.f; if (m_position.y > 0.f) { - jumped = false; + jumped = false; m_position.y = 0; } } - - m_position.y += m_accjmp; + + m_position.y += accjmp; if (!jumped || left || right || front || back) { - m_yrotrad = (m_rotY / 57.2957795056f); // 180/Pi = 57.295... - m_xrotrad = (m_rotX / 57.2957795056f); + yrotrad = (m_rotY / 57.2957795056f); // 180/Pi = 57.295... + xrotrad = (m_rotX / 57.2957795056f); } if (front) { - if (m_accWS < m_topspeed) m_accWS += elapsedTime * 30; else m_accWS = m_topspeed; + if (accWS < m_topspeed) accWS += elapsedTime * 30; else accWS = m_topspeed; - m_position.x += float(sin(m_yrotrad)) * elapsedTime * m_accWS; - m_position.z += float(-cos(m_yrotrad)) * elapsedTime * m_accWS; + m_position.x += float(sin(yrotrad)) * elapsedTime * accWS; + m_position.z += float(-cos(yrotrad)) * elapsedTime * accWS; // m_position.y += float(-sin(xrotrad)) * elapsedTime * 20; // à remettre pour implémenter une fonction de vol. } - else if (back) { - if (m_accWS > -m_topspeed) m_accWS -= elapsedTime * 30; else m_accWS = -m_topspeed; + else if (back) { + if (accWS > -m_topspeed) accWS -= elapsedTime * 30; else accWS = -m_topspeed; - m_position.x += float(-sin(m_yrotrad)) * elapsedTime * -m_accWS; - m_position.z += float(cos(m_yrotrad)) * elapsedTime * -m_accWS; + m_position.x += float(-sin(yrotrad)) * elapsedTime * -accWS; + m_position.z += float(cos(yrotrad)) * elapsedTime * -accWS; // m_position.y += float(sin(xrotrad)) * elapsedTime * 20; // à remettre pour implémenter une fonction de vol. } - else if (m_accWS != 0) { - m_accWS = m_accWS > 0 ? m_accWS - elapsedTime * (jumped? 10 : 60) : m_accWS + elapsedTime * (jumped ? 10 : 60); + else if (accWS != 0) { + accWS = accWS > 0 ? accWS - elapsedTime * (m_position.y > 0.f ? 10 : 60) : accWS + elapsedTime * (m_position.y > 0.f ? 10 : 60); - m_position.x += float(sin(m_yrotrad)) * elapsedTime * m_accWS; - m_position.z += float(-cos(m_yrotrad)) * elapsedTime * m_accWS; - if (m_accWS < 1 && m_accWS > -1) m_accWS = 0; + m_position.x += float(sin(yrotrad)) * elapsedTime * accWS; + m_position.z += float(-cos(yrotrad)) * elapsedTime * accWS; + if (accWS < 1 && accWS > -1) accWS = 0; } - if (left) { - if (m_accAD < m_topspeed) m_accAD += elapsedTime * 30; else m_accAD = m_topspeed; - m_position.x += float(-cos(m_yrotrad)) * elapsedTime * m_accAD; - m_position.z += float(-sin(m_yrotrad)) * elapsedTime * m_accAD; + if (left) { + if (accAD < m_topspeed) accAD += elapsedTime * 30; else accAD = m_topspeed; + m_position.x += float(-cos(yrotrad)) * elapsedTime * accAD; + m_position.z += float(-sin(yrotrad)) * elapsedTime * accAD; } else if (right) { - if (m_accAD > -m_topspeed) m_accAD -= elapsedTime * 30; else m_accAD = -m_topspeed; - m_position.x += float(cos(m_yrotrad)) * elapsedTime * -m_accAD; - m_position.z += float(sin(m_yrotrad)) * elapsedTime * -m_accAD; + if (accAD > -m_topspeed) accAD -= elapsedTime * 30; else accAD = -m_topspeed; + m_position.x += float(cos(yrotrad)) * elapsedTime * -accAD; + m_position.z += float(sin(yrotrad)) * elapsedTime * -accAD; } - else if (m_accAD != 0) { - m_accAD = m_accAD > 0 ? m_accAD - elapsedTime * (jumped ? 10 : 60) : m_accAD + elapsedTime * (jumped ? 10 : 60); - m_position.x += float(-cos(m_yrotrad)) * elapsedTime * m_accAD; - m_position.z += float(-sin(m_yrotrad)) * elapsedTime * m_accAD; - if (m_accAD < 1 && m_accAD > -1) m_accAD = 0; + else if (accAD != 0) { + accAD = accAD > 0 ? accAD - elapsedTime * (m_position.y > 0.f ? 10 : 60) : accAD + elapsedTime * (m_position.y > 0.f ? 10 : 60); + m_position.x += float(-cos(yrotrad)) * elapsedTime * accAD; + m_position.z += float(-sin(yrotrad)) * elapsedTime * accAD; + if (accAD < 1 && accAD > -1) accAD = 0; } - // Gestion de si le personnage va en diagonale pour qu'il n'aille pas plus vite que s'il allait en ligne droite: SQRT(15^2+15^2) = ~21.2 - if ((m_accWS >= 0? m_accWS: -m_accWS + m_accAD >= 0 ? m_accAD : -m_accAD) > sqrtf(m_topspeed * m_topspeed + m_topspeed * m_topspeed)) { - m_accWS *= 0.9f; - m_accAD *= 0.9f; + // Gestion de si le personnage va en diagonale, qu'il n'aille pas plus vite que s'il allait en ligne droite. + if ((accWS >= 0 ? accWS : -accWS + accAD >= 0 ? accAD : -accAD) > sqrtf(m_topspeed * m_topspeed + m_topspeed * m_topspeed)) { + accWS *= 0.9f; + accAD *= 0.9f; } } diff --git a/SQCSim2021/player.h b/SQCSim2021/player.h index 4ee38ba..3f5b80e 100644 --- a/SQCSim2021/player.h +++ b/SQCSim2021/player.h @@ -9,22 +9,15 @@ public: Player(const Vector3f& position, float rotX = 0, float rotY = 0); void TurnLeftRight(float value); void TurnTopBottom(float value); - void Move(bool front, bool back, bool left, bool right, bool jump, float elapsedTime); + void Move(bool front, bool back, bool left, bool right, bool jump, bool dash, float elapsedTime); void ApplyTransformation(Transformation& transformation, bool rel = true) const; private: Vector3f m_position; float m_rotX = 0; float m_rotY = 0; - float m_accWS = 0; - float m_accAD = 0; - float m_accjmp = 0; - float m_yrotrad = 0; - float m_xrotrad = 0; - bool jumped = false; - float m_topspeed = 20; - float m_jumpheight = .4; + float m_jumpforce = 0.4f; };