Done?
This commit is contained in:
parent
078cb33c27
commit
8e2169420e
@ -23,6 +23,7 @@
|
|||||||
<ClInclude Include="array3d.h" />
|
<ClInclude Include="array3d.h" />
|
||||||
<ClInclude Include="audio.h" />
|
<ClInclude Include="audio.h" />
|
||||||
<ClInclude Include="blockinfo.h" />
|
<ClInclude Include="blockinfo.h" />
|
||||||
|
<ClInclude Include="bullet.h" />
|
||||||
<ClInclude Include="chunk.h" />
|
<ClInclude Include="chunk.h" />
|
||||||
<ClInclude Include="define.h" />
|
<ClInclude Include="define.h" />
|
||||||
<ClInclude Include="engine.h" />
|
<ClInclude Include="engine.h" />
|
||||||
@ -43,6 +44,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="audio.cpp" />
|
<ClCompile Include="audio.cpp" />
|
||||||
<ClCompile Include="blockinfo.cpp" />
|
<ClCompile Include="blockinfo.cpp" />
|
||||||
|
<ClCompile Include="bullet.cpp" />
|
||||||
<ClCompile Include="chunk.cpp" />
|
<ClCompile Include="chunk.cpp" />
|
||||||
<ClCompile Include="engine.cpp" />
|
<ClCompile Include="engine.cpp" />
|
||||||
<ClCompile Include="main.cpp" />
|
<ClCompile Include="main.cpp" />
|
||||||
|
@ -71,6 +71,9 @@
|
|||||||
<ClInclude Include="perlin.h">
|
<ClInclude Include="perlin.h">
|
||||||
<Filter>Fichiers d%27en-tête</Filter>
|
<Filter>Fichiers d%27en-tête</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="bullet.h">
|
||||||
|
<Filter>Fichiers d%27en-tête</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="blockinfo.cpp">
|
<ClCompile Include="blockinfo.cpp">
|
||||||
@ -121,5 +124,8 @@
|
|||||||
<ClCompile Include="perlin.cpp">
|
<ClCompile Include="perlin.cpp">
|
||||||
<Filter>Fichiers sources</Filter>
|
<Filter>Fichiers sources</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="bullet.cpp">
|
||||||
|
<Filter>Fichiers sources</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
@ -29,7 +29,7 @@ void Audio::Update3DAudio(Vector3f pos, Vector3f dir, Vector3f vel) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Audio::Create3DAudioObj(irrklang::ISound* sound, const char* name, Vector3f& pos, Vector3f& vel, float volume = 1) {
|
void Audio::Create3DAudioObj(irrklang::ISound* sound, const char* name, Vector3f& pos, Vector3f& vel, float volume = 1) {
|
||||||
sound = m_engine->play3D(name, irrklang::vec3df(pos.x, pos.y, pos.z), true, false, true, irrklang::ESM_NO_STREAMING, true);
|
sound = m_engine->play3D(name, irrklang::vec3df(pos.x, pos.y, pos.z), false, false, true, irrklang::ESM_NO_STREAMING, true);
|
||||||
sound->setVelocity(irrklang::vec3df(vel.x, vel.y, vel.z));
|
sound->setVelocity(irrklang::vec3df(vel.x, vel.y, vel.z));
|
||||||
sound->setVolume(volume);
|
sound->setVolume(volume);
|
||||||
}
|
}
|
||||||
|
32
SQCSim2021/bullet.cpp
Normal file
32
SQCSim2021/bullet.cpp
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#include "bullet.h"
|
||||||
|
#include "world.h"
|
||||||
|
|
||||||
|
Bullet::Bullet(Player& player) {
|
||||||
|
m_startpos = m_currentpos = player.GetPOV() + player.GetDirection();
|
||||||
|
m_velocity = player.GetDirection();
|
||||||
|
}
|
||||||
|
|
||||||
|
Bullet::~Bullet() {}
|
||||||
|
|
||||||
|
bool Bullet::Update(World* world, Transformation& tran, float elapsedtime) {
|
||||||
|
for (int x = 0; x < 1000; ++x) {
|
||||||
|
m_currentpos += m_velocity * elapsedtime;
|
||||||
|
|
||||||
|
if (!world->ChunkAt(m_currentpos))
|
||||||
|
return true;
|
||||||
|
else if (world->BlockAt(m_currentpos) != BTYPE_AIR) {
|
||||||
|
world->ChangeBlockAtPosition(BTYPE_AIR, m_currentpos);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if ((m_currentpos - m_startpos).Length() > VIEW_DISTANCE) return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Bullet::Transpose(int& x, int& z) {
|
||||||
|
m_currentpos.x -= x * CHUNK_SIZE_X;
|
||||||
|
m_currentpos.z -= z * CHUNK_SIZE_Z;
|
||||||
|
m_startpos.x -= x * CHUNK_SIZE_X;
|
||||||
|
m_startpos.z -= z * CHUNK_SIZE_Z;
|
||||||
|
}
|
27
SQCSim2021/bullet.h
Normal file
27
SQCSim2021/bullet.h
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#ifndef BULLET_H__
|
||||||
|
#define BULLET_H__
|
||||||
|
|
||||||
|
#include "audio.h"
|
||||||
|
#include "player.h"
|
||||||
|
#include "vertexbuffer.h"
|
||||||
|
#include "texture.h"
|
||||||
|
|
||||||
|
class World;
|
||||||
|
|
||||||
|
class Bullet {
|
||||||
|
public:
|
||||||
|
Bullet(Player& player);
|
||||||
|
~Bullet();
|
||||||
|
|
||||||
|
bool Update(World* world, Transformation& tran, float elapsedtime);
|
||||||
|
void Transpose(int& x, int& z);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Vector3f m_startpos;
|
||||||
|
Vector3f m_currentpos;
|
||||||
|
Vector3f m_velocity;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // BULLET_H__
|
||||||
|
|
@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#define VIEW_DISTANCE 128
|
#define VIEW_DISTANCE 128
|
||||||
#define TEXTURE_SIZE 32
|
#define TEXTURE_SIZE 32
|
||||||
|
#define MAX_BULLETS 64
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef NDEBUG
|
#ifdef NDEBUG
|
||||||
@ -39,6 +40,7 @@
|
|||||||
|
|
||||||
#define VIEW_DISTANCE 1024
|
#define VIEW_DISTANCE 1024
|
||||||
#define TEXTURE_SIZE 512
|
#define TEXTURE_SIZE 512
|
||||||
|
#define MAX_BULLETS 512
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ Engine::Engine() { }
|
|||||||
|
|
||||||
Engine::~Engine() {
|
Engine::~Engine() {
|
||||||
m_world.CleanUpWorld(m_renderCount, true);
|
m_world.CleanUpWorld(m_renderCount, true);
|
||||||
for (int x = 0; x < WORLD_SIZE_X; ++x) // Les destructeurs de Chunks ont de la misère, je les aide un peu!
|
for (int x = 0; x < WORLD_SIZE_X; ++x)
|
||||||
for (int y = 0; y < WORLD_SIZE_Y; ++y)
|
for (int y = 0; y < WORLD_SIZE_Y; ++y)
|
||||||
if (m_world.GetChunks().Get(x, y))
|
if (m_world.GetChunks().Get(x, y))
|
||||||
m_world.GetChunks().Get(x, y)->~Chunk();
|
m_world.GetChunks().Get(x, y)->~Chunk();
|
||||||
@ -45,6 +45,10 @@ void Engine::Init() {
|
|||||||
// Objet de musique!
|
// Objet de musique!
|
||||||
m_audio.ToggleMusicState();
|
m_audio.ToggleMusicState();
|
||||||
|
|
||||||
|
// Array pour les balles.
|
||||||
|
for (int x = 0; x < MAX_BULLETS; ++x)
|
||||||
|
m_bullets[x] = nullptr;
|
||||||
|
|
||||||
// Init Chunks
|
// Init Chunks
|
||||||
m_world.GetChunks().Reset(nullptr);
|
m_world.GetChunks().Reset(nullptr);
|
||||||
|
|
||||||
@ -93,7 +97,7 @@ void Engine::LoadResource() {
|
|||||||
|
|
||||||
void Engine::UnloadResource() {}
|
void Engine::UnloadResource() {}
|
||||||
|
|
||||||
void Engine::DrawHud(float elapsedTime) {
|
void Engine::DrawHud(float elapsedTime, BlockType bloc) {
|
||||||
// Setter le blend function , tout ce qui sera noir sera transparent
|
// Setter le blend function , tout ce qui sera noir sera transparent
|
||||||
glDisable(GL_STENCIL_TEST);
|
glDisable(GL_STENCIL_TEST);
|
||||||
glColor4f(1.f, 1.f, 1.f, 1.f);
|
glColor4f(1.f, 1.f, 1.f, 1.f);
|
||||||
@ -124,6 +128,12 @@ void Engine::DrawHud(float elapsedTime) {
|
|||||||
ss.str("");
|
ss.str("");
|
||||||
ss << " Position : " << m_player.GetPosition();
|
ss << " Position : " << m_player.GetPosition();
|
||||||
PrintText(10, 30, ss.str());
|
PrintText(10, 30, ss.str());
|
||||||
|
ss.str("");
|
||||||
|
ss << " Block : ";
|
||||||
|
if (bloc == BTYPE_LAST)
|
||||||
|
ss << "Weapon.";
|
||||||
|
else ss << (int)bloc;
|
||||||
|
PrintText(10, 40, ss.str());
|
||||||
m_textureCrosshair.Bind();
|
m_textureCrosshair.Bind();
|
||||||
static const int crossSize = 32;
|
static const int crossSize = 32;
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
@ -173,19 +183,26 @@ int Engine::GetFps(float elapsedTime) const { return 1 / elapsedTime; }
|
|||||||
|
|
||||||
void Engine::Render(float elapsedTime) {
|
void Engine::Render(float elapsedTime) {
|
||||||
static float gameTime = elapsedTime;
|
static float gameTime = elapsedTime;
|
||||||
|
static float bulletTime = 0;
|
||||||
|
static BlockType bloc = 1;
|
||||||
|
|
||||||
if (elapsedTime > 0.1f) return;
|
if (elapsedTime > 0.1f) return;
|
||||||
|
|
||||||
gameTime += elapsedTime;
|
gameTime += elapsedTime;
|
||||||
|
|
||||||
Transformation all;
|
Transformation all;
|
||||||
Transformation skybox;
|
Transformation skybox;
|
||||||
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
||||||
|
|
||||||
// Transformations initiales
|
// Transformations initiales
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
|
|
||||||
m_player.ApplyPhysics(m_player.GetInput(m_keyW, m_keyS, m_keyA, m_keyD, m_keySpace, m_keylshift, elapsedTime), m_world, elapsedTime);
|
if (bulletTime > 0.f) bulletTime -= elapsedTime;
|
||||||
|
if (bulletTime < 0.f) bulletTime = 0.f;
|
||||||
|
|
||||||
|
m_player.ApplyPhysics(m_player.GetInput(m_keyW, m_keyS, m_keyA, m_keyD, m_keySpace, (bloc == BTYPE_LAST && bulletTime <= 0.f && m_mouseL), elapsedTime), m_world, elapsedTime, &m_audio);
|
||||||
m_audio.Update3DAudio(m_player.GetPOV(), m_player.GetDirection(), m_player.GetVelocity()); // Ajustement du positionnement 3D avec les coordonnées du joueur et
|
m_audio.Update3DAudio(m_player.GetPOV(), m_player.GetDirection(), m_player.GetVelocity()); // Ajustement du positionnement 3D avec les coordonnées du joueur et
|
||||||
// son vecteur de vélocité (pour l'effet Doppler)
|
// son vecteur de vélocité (pour l'effet Doppler)
|
||||||
m_player.ApplyTransformation(all);
|
m_player.ApplyTransformation(all);
|
||||||
@ -193,34 +210,64 @@ void Engine::Render(float elapsedTime) {
|
|||||||
m_player.ApplyTransformation(skybox, false); // Version d'ApplyTransformation qui ne tient compte que de la rotation
|
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!).
|
// (donc l'objet ne bouge pas relativement au joueur, ce qui est pratique pour une skybox!).
|
||||||
|
|
||||||
static BlockType bloc = 1;
|
|
||||||
|
|
||||||
if (m_mouseWU) bloc++;
|
if (m_mouseWU) bloc++;
|
||||||
else if (m_mouseWD) bloc--;
|
else if (m_mouseWD) bloc--;
|
||||||
if (bloc == BTYPE_LAST)
|
if (bloc == BTYPE_LAST + 1) bloc = BTYPE_AIR + 1;
|
||||||
bloc = BTYPE_DIRT;
|
else if (bloc == BTYPE_AIR) bloc = BTYPE_LAST; // La selection de BTYPE_LAST équipe l'arme.
|
||||||
else if (bloc == BTYPE_AIR)
|
|
||||||
bloc = BTYPE_LAST - 1;
|
|
||||||
|
|
||||||
m_mouseWU = m_mouseWD = false;
|
m_mouseWU = m_mouseWD = false;
|
||||||
|
|
||||||
if (m_mouseL)
|
if (m_mouseL) {
|
||||||
|
if (bloc != BTYPE_LAST)
|
||||||
m_world.ChangeBlockAtCursor(bloc, m_player, m_block);
|
m_world.ChangeBlockAtCursor(bloc, m_player, m_block);
|
||||||
|
else if (bulletTime <= 0.f) {
|
||||||
|
for (int x = 0; x < MAX_BULLETS; ++x) // Ajouter une balle dans l'array (aussi connu sous le nom de "faire pow pow").
|
||||||
|
if (!m_bullets[x]) {
|
||||||
|
m_bullets[x] = new Bullet(m_player);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (x == MAX_BULLETS - 1) { // S'il y a pas d'espace dans l'array, prendre la place de la première balle de l'array.
|
||||||
|
m_bullets[0]->~Bullet();
|
||||||
|
m_bullets[0] = new Bullet(m_player);
|
||||||
|
}
|
||||||
|
bulletTime = .1f;
|
||||||
|
m_audio.Create3DAudioObj(m_powpow, AUDIO_PATH "pow.wav", m_player.GetPOV(), m_player.GetDirection() * 10, .5f);
|
||||||
|
if (m_flash) { // Coupe le rendering et affiche un frame blanc, pour simuler un flash.
|
||||||
|
glClearColor(.8f, .8f, .8f, 1.f);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
||||||
|
glClearColor(0.f, 0.f, 0.f, 1.f);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (m_mouseR)
|
else if (m_mouseR)
|
||||||
m_world.ChangeBlockAtCursor(BTYPE_AIR, m_player, m_block);
|
m_world.ChangeBlockAtCursor(BTYPE_AIR, m_player, m_block);
|
||||||
|
|
||||||
m_world.Update(m_renderCount, m_badHitCount, m_player, all, m_shader01, m_textureAtlas, m_perlin, m_blockinfo);
|
for (int x = 0; x < MAX_BULLETS; ++x) // Array de bullets en jeu.
|
||||||
|
if (m_bullets[x])
|
||||||
|
if (m_bullets[x]->Update(&m_world, all, elapsedTime)) {
|
||||||
|
m_bullets[x]->~Bullet();
|
||||||
|
m_bullets[x] = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_world.Update(m_renderCount, m_bullets, m_player, all, m_shader01, m_textureAtlas, m_perlin, m_blockinfo);
|
||||||
|
|
||||||
if (m_isSkybox) m_skybox.Render(skybox);
|
if (m_isSkybox) m_skybox.Render(skybox);
|
||||||
|
|
||||||
if (m_wireframe)
|
if (m_wireframe)
|
||||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||||
DrawHud(elapsedTime);
|
DrawHud(elapsedTime, bloc);
|
||||||
if (m_wireframe)
|
if (m_wireframe)
|
||||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||||
|
|
||||||
if (m_player.GetPosition().y < -20.f)
|
static bool fell = false;
|
||||||
|
if (m_player.GetPosition().y < 1.7f && !fell) {
|
||||||
|
m_audio.Create3DAudioObj(m_scream, AUDIO_PATH "scream.wav", m_player.GetPOV(), m_player.GetVelocity(), 1.f);
|
||||||
|
fell = true;
|
||||||
|
}
|
||||||
|
else if (m_player.GetPosition().y < -20.f) {
|
||||||
m_player = Player(Vector3f(0, CHUNK_SIZE_Y + 1.8f, 0)); // Respawn si le bonho- joueur tombe en bas du monde.
|
m_player = Player(Vector3f(0, CHUNK_SIZE_Y + 1.8f, 0)); // Respawn si le bonho- joueur tombe en bas du monde.
|
||||||
|
fell = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Engine::KeyPressEvent(unsigned char key) {
|
void Engine::KeyPressEvent(unsigned char key) {
|
||||||
@ -267,6 +314,7 @@ void Engine::KeyPressEvent(unsigned char key) {
|
|||||||
m_keySpace = true;
|
m_keySpace = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 5: // F - Ignorer
|
||||||
case 24: // Y - Ignorer
|
case 24: // Y - Ignorer
|
||||||
case 255: // Fn - Ignorer
|
case 255: // Fn - Ignorer
|
||||||
case 12: // M - Ignorer
|
case 12: // M - Ignorer
|
||||||
@ -279,6 +327,9 @@ void Engine::KeyPressEvent(unsigned char key) {
|
|||||||
|
|
||||||
void Engine::KeyReleaseEvent(unsigned char key) {
|
void Engine::KeyReleaseEvent(unsigned char key) {
|
||||||
switch (key) {
|
switch (key) {
|
||||||
|
case 5:
|
||||||
|
m_flash = !m_flash;
|
||||||
|
break;
|
||||||
case 12:
|
case 12:
|
||||||
m_audio.ToggleMusicState();
|
m_audio.ToggleMusicState();
|
||||||
break;
|
break;
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include "array2d.h"
|
#include "array2d.h"
|
||||||
#include "world.h"
|
#include "world.h"
|
||||||
#include "perlin.h"
|
#include "perlin.h"
|
||||||
|
#include "bullet.h"
|
||||||
|
|
||||||
class Engine : public OpenglContext {
|
class Engine : public OpenglContext {
|
||||||
public:
|
public:
|
||||||
@ -32,7 +33,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
bool LoadTexture(Texture& texture, const std::string& filename, bool stopOnError = true);
|
bool LoadTexture(Texture& texture, const std::string& filename, bool stopOnError = true);
|
||||||
void DrawHud(float elapsedTime);
|
void DrawHud(float elapsedTime, BlockType bloc);
|
||||||
void PrintText(unsigned int x, unsigned int y, const std::string& t);
|
void PrintText(unsigned int x, unsigned int y, const std::string& t);
|
||||||
int GetFps(float elapsedTime) const;
|
int GetFps(float elapsedTime) const;
|
||||||
|
|
||||||
@ -56,8 +57,14 @@ private:
|
|||||||
Skybox m_skybox;
|
Skybox m_skybox;
|
||||||
Audio m_audio = Audio(AUDIO_PATH "music01.wav");
|
Audio m_audio = Audio(AUDIO_PATH "music01.wav");
|
||||||
|
|
||||||
|
irrklang::ISound* m_powpow;
|
||||||
|
irrklang::ISound* m_step;
|
||||||
|
irrklang::ISound* m_scream;
|
||||||
|
|
||||||
Player m_player = Player(Vector3f(0, CHUNK_SIZE_Y + 1.8f, 0));
|
Player m_player = Player(Vector3f(0, CHUNK_SIZE_Y + 1.8f, 0));
|
||||||
|
|
||||||
|
Bullet* m_bullets[MAX_BULLETS];
|
||||||
|
|
||||||
bool m_keyW = false;
|
bool m_keyW = false;
|
||||||
bool m_keyA = false;
|
bool m_keyA = false;
|
||||||
bool m_keyS = false;
|
bool m_keyS = false;
|
||||||
@ -71,6 +78,7 @@ private:
|
|||||||
bool m_mouseWD = false;
|
bool m_mouseWD = false;
|
||||||
|
|
||||||
bool m_block = false;
|
bool m_block = false;
|
||||||
|
bool m_flash = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
BIN
SQCSim2021/media/audio/hit.wav
Normal file
BIN
SQCSim2021/media/audio/hit.wav
Normal file
Binary file not shown.
BIN
SQCSim2021/media/audio/pow.wav
Normal file
BIN
SQCSim2021/media/audio/pow.wav
Normal file
Binary file not shown.
BIN
SQCSim2021/media/audio/scream.wav
Normal file
BIN
SQCSim2021/media/audio/scream.wav
Normal file
Binary file not shown.
BIN
SQCSim2021/media/audio/step.wav
Normal file
BIN
SQCSim2021/media/audio/step.wav
Normal file
Binary file not shown.
@ -18,7 +18,7 @@ void Player::TurnTopBottom(float value) {
|
|||||||
else if (m_rotX < -80) m_rotX = -80;
|
else if (m_rotX < -80) m_rotX = -80;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3f Player::GetInput(bool front, bool back, bool left, bool right, bool jump, bool dash, float elapsedTime) {
|
Vector3f Player::GetInput(bool front, bool back, bool left, bool right, bool jump, bool shoot, float elapsedTime) {
|
||||||
|
|
||||||
Vector3f delta = Vector3f(0, 0, 0);
|
Vector3f delta = Vector3f(0, 0, 0);
|
||||||
|
|
||||||
@ -53,16 +53,20 @@ Vector3f Player::GetInput(bool front, bool back, bool left, bool right, bool jum
|
|||||||
delta.x *= .6f;
|
delta.x *= .6f;
|
||||||
delta.z *= .6f;
|
delta.z *= .6f;
|
||||||
|
|
||||||
if (jump && !m_airborne) {
|
if ((jump || shoot ) && !m_airborne) {
|
||||||
delta.y += .32f;
|
delta.y += jump? .32f: shoot? .1f : 0.f;
|
||||||
m_airborne = true;
|
m_airborne = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (shoot) // Recoil!
|
||||||
|
TurnTopBottom(-1);
|
||||||
|
|
||||||
return delta;
|
return delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::ApplyPhysics(Vector3f input, World world, float elapsedTime) {
|
void Player::ApplyPhysics(Vector3f input, World world, float elapsedTime, Audio* audio) {
|
||||||
|
static irrklang::ISound* step; // Pour les sons de pas.
|
||||||
|
static float timing = 0.f;
|
||||||
/* Gestion de collisions */
|
/* Gestion de collisions */
|
||||||
BlockType bt1, bt2, bt3;
|
BlockType bt1, bt2, bt3;
|
||||||
|
|
||||||
@ -81,6 +85,10 @@ void Player::ApplyPhysics(Vector3f input, World world, float elapsedTime) {
|
|||||||
bt1 = world.BlockAt(GetPosition().x, GetPosition().y + .3f, GetPosition().z);
|
bt1 = world.BlockAt(GetPosition().x, GetPosition().y + .3f, GetPosition().z);
|
||||||
if (bt3 != BTYPE_AIR) {
|
if (bt3 != BTYPE_AIR) {
|
||||||
m_velocity.y = 0;
|
m_velocity.y = 0;
|
||||||
|
if (timing == 0.f) {
|
||||||
|
if (m_airborne) audio->Create3DAudioObj(step, AUDIO_PATH "hit.wav", GetPosition(), GetVelocity(), 1.f);
|
||||||
|
timing = .3f;
|
||||||
|
}
|
||||||
m_airborne = false;
|
m_airborne = false;
|
||||||
}
|
}
|
||||||
else if (bt1 != BTYPE_AIR) {
|
else if (bt1 != BTYPE_AIR) {
|
||||||
@ -89,6 +97,9 @@ void Player::ApplyPhysics(Vector3f input, World world, float elapsedTime) {
|
|||||||
else m_airborne = true;
|
else m_airborne = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (timing > 0.f) timing -= elapsedTime;
|
||||||
|
if (timing < 0.f) timing = 0.f;
|
||||||
|
|
||||||
bt1 = world.BlockAt(GetPosition().x + input.x, GetPosition().y, GetPosition().z);
|
bt1 = world.BlockAt(GetPosition().x + input.x, GetPosition().y, GetPosition().z);
|
||||||
bt2 = world.BlockAt(GetPosition().x + input.x, GetPosition().y - 0.9f, GetPosition().z);
|
bt2 = world.BlockAt(GetPosition().x + input.x, GetPosition().y - 0.9f, GetPosition().z);
|
||||||
bt3 = world.BlockAt(GetPosition().x + input.x, GetPosition().y - 1.7f, GetPosition().z);
|
bt3 = world.BlockAt(GetPosition().x + input.x, GetPosition().y - 1.7f, GetPosition().z);
|
||||||
@ -137,7 +148,22 @@ void Player::ApplyPhysics(Vector3f input, World world, float elapsedTime) {
|
|||||||
m_position += m_velocity;
|
m_position += m_velocity;
|
||||||
|
|
||||||
static float bobbingtime = 0; // Gestion de la caméra
|
static float bobbingtime = 0; // Gestion de la caméra
|
||||||
if (bobbingtime <= 360.f) bobbingtime += elapsedTime * 20.f; else bobbingtime = 0;
|
static bool leftright = false;
|
||||||
|
static bool isStep = false;
|
||||||
|
if (bobbingtime <= 360.f)
|
||||||
|
bobbingtime += elapsedTime * 20.f; else bobbingtime = 0;
|
||||||
|
|
||||||
|
if ((sin(bobbingtime) - 0.5f) * (abs(m_velocity.x) + abs(m_velocity.z)) < -.2f && !m_airborne) {
|
||||||
|
Vector3f vstep;
|
||||||
|
if (leftright)
|
||||||
|
vstep = Vector3f(GetPosition().x - GetDirection().x, GetPosition().y, GetPosition().z + GetDirection().z);
|
||||||
|
else vstep = Vector3f(GetPosition().x + GetDirection().x, GetPosition().y, GetPosition().z - GetDirection().z);
|
||||||
|
if (!isStep) {
|
||||||
|
audio->Create3DAudioObj(step, AUDIO_PATH "step.wav", vstep, GetVelocity(), .8f);
|
||||||
|
}
|
||||||
|
isStep = true;
|
||||||
|
}
|
||||||
|
else isStep = false;
|
||||||
m_POV = m_position.y;
|
m_POV = m_position.y;
|
||||||
m_POV += m_airborne ? 0 : (sin(bobbingtime) - 0.5f) * (abs(m_velocity.x) + abs(m_velocity.z)) * .2f;
|
m_POV += m_airborne ? 0 : (sin(bobbingtime) - 0.5f) * (abs(m_velocity.x) + abs(m_velocity.z)) * .2f;
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#define _PLAYER_H__
|
#define _PLAYER_H__
|
||||||
#include "vector3.h"
|
#include "vector3.h"
|
||||||
#include "transformation.h"
|
#include "transformation.h"
|
||||||
|
#include "audio.h"
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
class World;
|
class World;
|
||||||
@ -12,7 +13,7 @@ public:
|
|||||||
void TurnLeftRight(float value);
|
void TurnLeftRight(float value);
|
||||||
void TurnTopBottom(float value);
|
void TurnTopBottom(float value);
|
||||||
Vector3f GetInput(bool front, bool back, bool left, bool right, bool jump, bool dash, float elapsedTime);
|
Vector3f GetInput(bool front, bool back, bool left, bool right, bool jump, bool dash, float elapsedTime);
|
||||||
void ApplyPhysics(Vector3f input, World world, float elapsedTime);
|
void ApplyPhysics(Vector3f input, World world, float elapsedTime, Audio* audio);
|
||||||
void ApplyTransformation(Transformation& transformation, bool rel = true) const;
|
void ApplyTransformation(Transformation& transformation, bool rel = true) const;
|
||||||
|
|
||||||
Vector3f GetPosition() const;
|
Vector3f GetPosition() const;
|
||||||
|
@ -38,7 +38,7 @@ BlockType World::BlockAt(const Vector3f& pos, BlockType defaultBlockType) const
|
|||||||
return BlockAt(pos.x, pos.y, pos.z, defaultBlockType);
|
return BlockAt(pos.x, pos.y, pos.z, defaultBlockType);
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::TransposeWorld(Player& player) {
|
void World::TransposeWorld(Player& player, Bullet* bullets[MAX_BULLETS]) {
|
||||||
int x = 0;
|
int x = 0;
|
||||||
int y = 0;
|
int y = 0;
|
||||||
|
|
||||||
@ -85,6 +85,9 @@ void World::TransposeWorld(Player& player) {
|
|||||||
|
|
||||||
m_center[0] += x; m_center[1] += y;
|
m_center[0] += x; m_center[1] += y;
|
||||||
player.Teleport(x, y);
|
player.Teleport(x, y);
|
||||||
|
|
||||||
|
for (int index = 0; index < MAX_BULLETS; ++index)
|
||||||
|
if (bullets[index]) bullets[index]->Transpose(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::CleanUpWorld(int& deleteframes, bool clear = false) {
|
void World::CleanUpWorld(int& deleteframes, bool clear = false) {
|
||||||
@ -106,12 +109,12 @@ void World::GetScope(int& x, int& y) {
|
|||||||
y = m_center[1];
|
y = m_center[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::Update(int& rendercount, int& badhitcount, Player& player, Transformation& world, Shader& shader, TextureAtlas& atlas, Perlin& perlin, BlockInfo* blockinfo[BTYPE_LAST]) {
|
void World::Update(int& rendercount, Bullet* bullets[MAX_BULLETS], Player& player, Transformation& world, Shader& shader, TextureAtlas& atlas, Perlin& perlin, BlockInfo* blockinfo[BTYPE_LAST]) {
|
||||||
glStencilFunc(GL_EQUAL, 1, 0x00);
|
glStencilFunc(GL_EQUAL, 1, 0x00);
|
||||||
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
|
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
|
||||||
atlas.Bind();
|
atlas.Bind();
|
||||||
RenderWorld(rendercount, badhitcount, player, world, shader);
|
RenderWorld(rendercount, player, world, shader);
|
||||||
TransposeWorld(player);
|
TransposeWorld(player, bullets);
|
||||||
UpdateWorld(player, perlin, blockinfo);
|
UpdateWorld(player, perlin, blockinfo);
|
||||||
shader.Disable();
|
shader.Disable();
|
||||||
glStencilFunc(GL_GREATER, 1, 0xFF);
|
glStencilFunc(GL_GREATER, 1, 0xFF);
|
||||||
@ -273,10 +276,19 @@ void World::ChangeBlockAtCursor(BlockType blockType, Player& player, bool& block
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::RenderWorld(int& rendercount, int& badhitcount, Player& player, Transformation& world, Shader& shader) {
|
|
||||||
|
void World::ChangeBlockAtPosition(BlockType blockType, Vector3f pos) {
|
||||||
|
int bx = (int)pos.x % CHUNK_SIZE_X;
|
||||||
|
int by = (int)pos.y % CHUNK_SIZE_Y;
|
||||||
|
int bz = (int)pos.z % CHUNK_SIZE_Z;
|
||||||
|
|
||||||
|
ChunkAt(pos)->SetBlock(bx, by, bz, blockType, this);
|
||||||
|
ChunkAt(pos)->MakeModified();
|
||||||
|
}
|
||||||
|
|
||||||
|
void World::RenderWorld(int& rendercount, Player& player, Transformation& world, Shader& shader) {
|
||||||
shader.Use();
|
shader.Use();
|
||||||
rendercount = 0;
|
rendercount = 0;
|
||||||
badhitcount = 0;
|
|
||||||
Vector3f angle;
|
Vector3f angle;
|
||||||
Vector3f cursor;
|
Vector3f cursor;
|
||||||
Vector3f direct = player.GetDirection();
|
Vector3f direct = player.GetDirection();
|
||||||
@ -341,10 +353,8 @@ void World::RenderWorld(int& rendercount, int& badhitcount, Player& player, Tran
|
|||||||
int chx, chy;
|
int chx, chy;
|
||||||
ChunkAt(cursor)->GetPosition(chx, chy);
|
ChunkAt(cursor)->GetPosition(chx, chy);
|
||||||
for (int index = 0; index < rendercount; ++index) // Permet de vérifier seulement contre celles ajoutées dans la frame, et ne pas avoir à refaire l'array à chaque frame.
|
for (int index = 0; index < rendercount; ++index) // Permet de vérifier seulement contre celles ajoutées dans la frame, et ne pas avoir à refaire l'array à chaque frame.
|
||||||
if (renderManifest[index].x == chx && renderManifest[index].z == chy) {
|
if (renderManifest[index].x == chx && renderManifest[index].z == chy)
|
||||||
valide = false;
|
valide = false;
|
||||||
++badhitcount;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (valide) renderManifest[rendercount++] = Vector3f(chx, (VIEW_DISTANCE - (pos - cursor).Length() * 2.f + 128) / (float)VIEW_DISTANCE, chy);
|
if (valide) renderManifest[rendercount++] = Vector3f(chx, (VIEW_DISTANCE - (pos - cursor).Length() * 2.f + 128) / (float)VIEW_DISTANCE, chy);
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include "transformation.h"
|
#include "transformation.h"
|
||||||
#include "perlin.h"
|
#include "perlin.h"
|
||||||
#include "shader.h"
|
#include "shader.h"
|
||||||
|
#include "bullet.h"
|
||||||
#include "textureatlas.h"
|
#include "textureatlas.h"
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
@ -15,6 +16,7 @@
|
|||||||
|
|
||||||
class Chunk;
|
class Chunk;
|
||||||
class Player;
|
class Player;
|
||||||
|
class Bullet;
|
||||||
|
|
||||||
class World {
|
class World {
|
||||||
public:
|
public:
|
||||||
@ -29,11 +31,12 @@ public:
|
|||||||
BlockType BlockAt(float x, float y, float z, BlockType defaultBlockType = BTYPE_AIR) const;
|
BlockType BlockAt(float x, float y, float z, BlockType defaultBlockType = BTYPE_AIR) const;
|
||||||
BlockType BlockAt(const Vector3f& pos, BlockType defaultBlockType = BTYPE_AIR) const;
|
BlockType BlockAt(const Vector3f& pos, BlockType defaultBlockType = BTYPE_AIR) const;
|
||||||
|
|
||||||
void Update(int& rendercount, int& badhitcount, Player& player, Transformation& world, Shader& shader, TextureAtlas& atlas, Perlin& perlin, BlockInfo* blockinfo[BTYPE_LAST]);
|
void Update(int& rendercount, Bullet* bullets[MAX_BULLETS], Player& player, Transformation& world, Shader& shader, TextureAtlas& atlas, Perlin& perlin, BlockInfo* blockinfo[BTYPE_LAST]);
|
||||||
|
|
||||||
void GetScope(int& x, int& y);
|
void GetScope(int& x, int& y);
|
||||||
|
|
||||||
void ChangeBlockAtCursor(BlockType blockType, Player& player, bool& block);
|
void ChangeBlockAtCursor(BlockType blockType, Player& player, bool& block);
|
||||||
|
void ChangeBlockAtPosition(BlockType blockType, Vector3f pos);
|
||||||
void CleanUpWorld(int& deleteframes, bool clear);
|
void CleanUpWorld(int& deleteframes, bool clear);
|
||||||
private:
|
private:
|
||||||
Array2d<Chunk*> m_chunks = Array2d<Chunk*>(WORLD_SIZE_X, WORLD_SIZE_Y);
|
Array2d<Chunk*> m_chunks = Array2d<Chunk*>(WORLD_SIZE_X, WORLD_SIZE_Y);
|
||||||
@ -43,9 +46,9 @@ private:
|
|||||||
|
|
||||||
bool GenerateChunk(int x, int y, Perlin& perlin);
|
bool GenerateChunk(int x, int y, Perlin& perlin);
|
||||||
void UpdateChunk(int& generates, int& updates, int chx, int chy, Perlin& perlin, BlockInfo* blockinfo[BTYPE_LAST]);
|
void UpdateChunk(int& generates, int& updates, int chx, int chy, Perlin& perlin, BlockInfo* blockinfo[BTYPE_LAST]);
|
||||||
void RenderWorld(int& rendercount, int& badhitcount, Player& player, Transformation& world, Shader& shader);
|
void RenderWorld(int& rendercount, Player& player, Transformation& world, Shader& shader);
|
||||||
void UpdateWorld(Player& player, Perlin& perlin, BlockInfo* blockinfo[BTYPE_LAST]);
|
void UpdateWorld(Player& player, Perlin& perlin, BlockInfo* blockinfo[BTYPE_LAST]);
|
||||||
void TransposeWorld(Player& player);
|
void TransposeWorld(Player& player, Bullet* bullets[MAX_BULLETS]);
|
||||||
|
|
||||||
};
|
};
|
||||||
#endif // WORLD_H__
|
#endif // WORLD_H__
|
||||||
|
Loading…
x
Reference in New Issue
Block a user