Ajouts textures et blend.
This commit is contained in:
parent
959d70020b
commit
b85a25cbac
@ -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
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 592 KiB After Width: | Height: | Size: 592 KiB |
BIN
SQCSim2021/media/textures/metal1.png
Normal file
BIN
SQCSim2021/media/textures/metal1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 461 KiB |
BIN
SQCSim2021/media/textures/metal2.png
Normal file
BIN
SQCSim2021/media/textures/metal2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 670 KiB |
BIN
SQCSim2021/media/textures/metal3.png
Normal file
BIN
SQCSim2021/media/textures/metal3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 611 KiB |
BIN
SQCSim2021/media/textures/metal4.png
Normal file
BIN
SQCSim2021/media/textures/metal4.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 707 KiB |
@ -3,99 +3,109 @@
|
||||
Player::Player(const Vector3f& position, float rotX, float rotY) : m_position(position), m_rotX(rotX), m_rotY(rotY) { }
|
||||
|
||||
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;
|
||||
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;
|
||||
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 (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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user