2021-09-24 10:15:43 -04:00
# include "engine.h"
2023-11-20 14:28:54 -05:00
# include <algorithm>
# include <filesystem>
# include <fstream>
2023-10-02 15:55:45 -04:00
# include <iostream>
# include <chrono>
# include <thread>
# include <queue>
// Define a structure to represent notifications
struct Notification {
std : : string message ;
float displayStartTime = 0.0f ;
} ;
// Use a queue to manage notifications
//std::queue<Notification> notificationQueue;
// Use a vector to manage notifications
std : : vector < Notification > notifications ;
2023-12-03 00:15:18 -05:00
Engine : : Engine ( ) : m_remotePlayer ( & m_pinfo ) , m_pinfo ( ) { }
2021-09-24 10:15:43 -04:00
2023-09-15 11:24:43 -04:00
Engine : : ~ Engine ( ) {
2021-12-06 21:41:50 -05:00
m_world . CleanUpWorld ( m_renderCount , true ) ;
2021-12-07 18:59:50 -05:00
for ( int x = 0 ; x < WORLD_SIZE_X ; + + x )
2021-12-06 21:41:50 -05:00
for ( int y = 0 ; y < WORLD_SIZE_Y ; + + y )
if ( m_world . GetChunks ( ) . Get ( x , y ) )
m_world . GetChunks ( ) . Get ( x , y ) - > ~ Chunk ( ) ;
}
2021-09-24 10:15:43 -04:00
2021-11-30 19:55:11 -05:00
void Engine : : Init ( ) {
2023-10-23 16:57:19 -04:00
2023-10-18 09:33:56 -04:00
uint64_t seed = SEED ;
2023-11-06 16:43:52 -05:00
if ( m_istarted )
return ;
else m_istarted = true ;
2021-10-12 15:58:54 -04:00
// Objet de skybox avec sa propre texture et son propre shader!
2021-12-06 09:45:51 -05:00
m_skybox . Init ( 0.2f ) ;
2021-10-19 10:27:59 -04:00
// Objet de musique!
2023-09-27 11:24:41 -04:00
//m_audio.ToggleMusicState();
2021-11-15 20:58:13 -05:00
2021-12-07 18:59:50 -05:00
// Array pour les balles.
2023-10-16 12:02:37 -04:00
for ( int x = 0 ; x < MAX_BULLETS ; + + x ) {
2021-12-07 18:59:50 -05:00
m_bullets [ x ] = nullptr ;
2023-10-18 09:33:56 -04:00
m_whoosh [ x ] = nullptr ;
2023-10-16 12:02:37 -04:00
}
2021-12-07 18:59:50 -05:00
2023-12-05 13:44:54 -05:00
// Init Chunks
m_world . GetChunks ( ) . Reset ( nullptr ) ;
2023-10-30 15:36:43 -04:00
char * ch = new char [ 2 ] ;
2023-10-23 15:41:07 -04:00
2023-10-30 15:36:43 -04:00
std : : cout < < " Jouer en ligne? [o/N] " ;
std : : cin . getline ( ch , 2 ) ;
std : : cout < < std : : endl ;
2023-10-27 14:37:53 -04:00
2023-10-30 15:36:43 -04:00
if ( * ch = = ' o ' | | * ch = = ' O ' ) {
char * input = new char [ 32 ] ;
std : : string playname , srvname ;
2023-10-27 14:37:53 -04:00
2023-10-30 15:36:43 -04:00
while ( playname . size ( ) < 1 ) {
std : : cout < < " Veuillez entrer un nom de joueur: " ;
std : : cin . getline ( input , 32 ) ;
std : : cout < < std : : endl ;
playname = input ;
if ( playname . size ( ) < 1 | | playname . size ( ) > 32 )
std : : puts ( " Nom invalide. " ) ;
}
while ( srvname . size ( ) < 1 ) {
std : : cout < < " Veuillez entrer une adresse de serveur: " ;
std : : cin . getline ( input , 32 ) ;
std : : cout < < std : : endl ;
srvname = input ;
if ( srvname . size ( ) < 1 | | srvname . size ( ) > 32 )
std : : puts ( " Adresse serveur invalide. " ) ;
}
delete [ ] input ;
if ( ! m_conn . Init ( ) ) {
if ( ! m_conn . Connect ( srvname . c_str ( ) , playname ) ) {
// setup jeu en reseau.
std : : cout < < " ID recu du serveur: " < < std : : to_string ( m_conn . getId ( ) ) < < " ! " < < std : : endl ;
2023-12-05 13:44:54 -05:00
//std::cout << "Seed recu du serveur: " << std::to_string(m_conn.getSeed()) << "!" << std::endl;
2023-10-30 15:36:43 -04:00
m_player = Player ( m_conn . getOrigin ( ) . position ) ;
2023-12-05 13:44:54 -05:00
for ( auto & [ key , player ] : m_conn . m_players ) {
2023-10-30 15:36:43 -04:00
m_players [ key ] = new RemotePlayer ( player ) ;
2023-12-05 13:44:54 -05:00
RemotePlayer * rt = ( RemotePlayer * ) m_players [ key ] ;
rt - > SetPosition ( Vector3f ( 555 , 555 , 555 ) ) ;
}
2023-12-06 15:37:08 -05:00
m_player . m_username = playname ;
2023-12-05 13:44:54 -05:00
seed = 9370707 ; //m_conn.getSeed();
2023-10-30 15:36:43 -04:00
m_networkgame = true ;
2023-09-25 08:23:52 -04:00
}
2023-10-30 15:36:43 -04:00
else std : : cout < < " Erreur de connexion. " < < std : : endl ;
2023-09-25 08:23:52 -04:00
}
2023-10-30 15:36:43 -04:00
else std : : cout < < " Erreur de creation de socket. " < < std : : endl ;
}
delete [ ] ch ;
2023-09-25 08:23:52 -04:00
m_world . SetSeed ( seed ) ;
2023-11-02 15:47:15 -04:00
m_startTime = std : : chrono : : high_resolution_clock : : now ( ) ;
2023-12-02 15:19:46 -05:00
m_remotePlayer . SetPosition ( Vector3f ( .5 , CHUNK_SIZE_Y + 10. , .5 ) ) ;
2023-12-05 13:44:54 -05:00
// Gestion de souris.
CenterMouse ( ) ;
HideCursor ( ) ;
2021-09-24 10:15:43 -04:00
}
2023-09-15 11:24:43 -04:00
void Engine : : DeInit ( ) { }
2021-09-24 10:15:43 -04:00
2021-09-27 11:30:18 -04:00
void Engine : : LoadResource ( ) {
2023-12-05 13:44:54 -05:00
GLenum glewErr = glewInit ( ) ;
if ( glewErr ! = GLEW_OK ) {
std : : cerr < < " ERREUR GLEW : " < < glewGetErrorString ( glewErr ) < < std : : endl ;
abort ( ) ;
}
glDisable ( GL_FRAMEBUFFER_SRGB ) ;
glEnable ( GL_DEPTH_TEST ) ;
glEnable ( GL_STENCIL_TEST ) ;
glEnable ( GL_POINT_SMOOTH ) ;
glEnable ( GL_BLEND ) ;
glEnable ( GL_CULL_FACE ) ;
glEnable ( GL_TEXTURE_2D ) ;
glMatrixMode ( GL_PROJECTION ) ;
glLoadIdentity ( ) ;
gluPerspective ( 45.0f , ( float ) Width ( ) / ( float ) Height ( ) , 0.1f , VIEW_DISTANCE ) ;
glShadeModel ( GL_SMOOTH ) ;
glHint ( GL_PERSPECTIVE_CORRECTION_HINT , GL_NICEST ) ;
glDisable ( GL_BLEND ) ;
glBlendFunc ( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ) ;
glBlendEquation ( GL_FUNC_SUBTRACT ) ;
2023-09-16 00:12:14 -04:00
LoadTexture ( m_skybox . GetTexture ( ) , TEXTURE_PATH " skybox.png " , true ) ;
LoadTexture ( m_textureCrosshair , TEXTURE_PATH " cross.bmp " , true ) ;
LoadTexture ( m_textureFont , TEXTURE_PATH " font.bmp " , true ) ;
LoadTexture ( m_textureGun , TEXTURE_PATH " gun01.png " , false ) ;
2023-10-15 23:36:26 -04:00
LoadTexture ( m_texturePovGun , TEXTURE_PATH " GUN.png " , false ) ;
2023-11-27 16:54:58 -05:00
2023-12-03 00:15:18 -05:00
LoadTexture ( m_textureMainMenu , TEXTURE_PATH " menus/backgrounds/bgMainMenu.png " , false ) ;
LoadTexture ( m_texturePauseMenu , TEXTURE_PATH " menus/backgrounds/bgPause.png " , false ) ;
LoadTexture ( m_textureOptionsMenu , TEXTURE_PATH " menus/backgrounds/bgOptions.png " , false ) ;
LoadTexture ( m_textureSplashScreen , TEXTURE_PATH " menus/backgrounds/bgSplash.png " , false ) ;
LoadTexture ( m_textureCheck , TEXTURE_PATH " menus/others/check.png " , false ) ;
LoadTexture ( m_textureChecked , TEXTURE_PATH " menus/others/checked.png " , false ) ;
LoadTexture ( m_textureOptAudio , TEXTURE_PATH " menus/buttons/options/optAudio.png " , false ) ;
LoadTexture ( m_textureOptBack , TEXTURE_PATH " menus/buttons/options/optBack.png " , false ) ;
LoadTexture ( m_textureOptGameplay , TEXTURE_PATH " menus/buttons/options/optGameplay.png " , false ) ;
LoadTexture ( m_textureOptGraphics , TEXTURE_PATH " menus/buttons/options/optGraphics.png " , false ) ;
LoadTexture ( m_textureOptMain , TEXTURE_PATH " menus/buttons/options/optMain.png " , false ) ;
LoadTexture ( m_textureOptMusic , TEXTURE_PATH " menus/buttons/options/optMusic.png " , false ) ;
LoadTexture ( m_textureOptOptions , TEXTURE_PATH " menus/buttons/options/optOptions.png " , false ) ;
LoadTexture ( m_textureOptResolution , TEXTURE_PATH " menus/buttons/options/optResolution.png " , false ) ;
LoadTexture ( m_textureOptSensitivity , TEXTURE_PATH " menus/buttons/options/optSensitivity.png " , false ) ;
LoadTexture ( m_textureOptSfx , TEXTURE_PATH " menus/buttons/options/optSfx.png " , false ) ;
LoadTexture ( m_textureHd , TEXTURE_PATH " menus/labels/labelHd.png " , false ) ;
LoadTexture ( m_textureFhd , TEXTURE_PATH " menus/labels/labelFhd.png " , false ) ;
LoadTexture ( m_textureQhd , TEXTURE_PATH " menus/labels/labelQhd.png " , false ) ;
LoadTexture ( m_textureUhd , TEXTURE_PATH " menus/labels/labelUhd.png " , false ) ;
LoadTexture ( m_textureMenuTitle , TEXTURE_PATH " menus/labels/labelTitle.png " , false ) ;
LoadTexture ( m_textureMenuBack , TEXTURE_PATH " menus/buttons/main/mainBack.png " , false ) ;
LoadTexture ( m_textureMenuMulti , TEXTURE_PATH " menus/buttons/main/mainMulti.png " , false ) ;
LoadTexture ( m_textureMenuOptions , TEXTURE_PATH " menus/buttons/main/mainOptions.png " , false ) ;
LoadTexture ( m_textureMenuPlay , TEXTURE_PATH " menus/buttons/main/mainPlay.png " , false ) ;
LoadTexture ( m_textureMenuQuit , TEXTURE_PATH " menus/buttons/main/mainQuit.png " , false ) ;
LoadTexture ( m_textureMenuSingle , TEXTURE_PATH " menus/buttons/main/mainSingle.png " , false ) ;
2023-11-06 16:04:34 -05:00
2023-12-04 15:05:27 -05:00
TextureAtlas : : TextureIndex texDirtIndex = m_textureAtlas . AddTexture ( TEXTURE_PATH " metal2.png " ) ;
TextureAtlas : : TextureIndex texIceIndex = m_textureAtlas . AddTexture ( TEXTURE_PATH " metal3.png " ) ;
2021-10-31 00:31:08 -04:00
TextureAtlas : : TextureIndex texGrassIndex = m_textureAtlas . AddTexture ( TEXTURE_PATH " grass.png " ) ;
2021-12-06 09:45:51 -05:00
TextureAtlas : : TextureIndex texMetalIndex = m_textureAtlas . AddTexture ( TEXTURE_PATH " dirt.png " ) ;
2023-11-20 16:02:45 -05:00
TextureAtlas : : TextureIndex texGreenGrassIndex = m_textureAtlas . AddTexture ( TEXTURE_PATH " greengrass.png " ) ;
2023-11-20 15:40:43 -05:00
TextureAtlas : : TextureIndex texBoostHeal = m_textureAtlas . AddTexture ( BOOSTER_TEXTURE_PATH " BoosterVert.png " ) ;
2023-10-30 14:03:10 -04:00
TextureAtlas : : TextureIndex texBoostDmg = m_textureAtlas . AddTexture ( BOOSTER_TEXTURE_PATH " BoosterRouge.png " ) ;
TextureAtlas : : TextureIndex texBoostSpd = m_textureAtlas . AddTexture ( BOOSTER_TEXTURE_PATH " BoosterBleu.png " ) ;
TextureAtlas : : TextureIndex texBoostInv = m_textureAtlas . AddTexture ( BOOSTER_TEXTURE_PATH " BoosterJaune.png " ) ;
2021-10-26 17:28:37 -04:00
2023-11-20 14:28:54 -05:00
//AJOUTER LES TEXTURES DANS L'ORDRE DE L'ÉNUM
2023-12-05 13:44:54 -05:00
//STILL//STANDING
2023-12-04 19:05:36 -05:00
TextureAtlas : : TextureIndex StillFront = m_animeAtlas . AddTexture ( ANIME_PATH_STILL " BlueFrontRight.png " ) ; //0
TextureAtlas : : TextureIndex StillQuarterFrontLeft = m_animeAtlas . AddTexture ( ANIME_PATH_STILL " BlueLeft.png " ) ; //1
TextureAtlas : : TextureIndex StillQuarterFrontRight = m_animeAtlas . AddTexture ( ANIME_PATH_STILL " BlueRight.png " ) ; //2
TextureAtlas : : TextureIndex StillProfiltLeft = m_animeAtlas . AddTexture ( ANIME_PATH_STILL " BlueProfilLeft.png " ) ; //3
TextureAtlas : : TextureIndex StillProfiltRight = m_animeAtlas . AddTexture ( ANIME_PATH_STILL " BlueProfilRight.png " ) ; //4
TextureAtlas : : TextureIndex StillQuarterBackLeft = m_animeAtlas . AddTexture ( ANIME_PATH_STILL " BlueLeftBack.png " ) ; //5
TextureAtlas : : TextureIndex StillQuarterBackRight = m_animeAtlas . AddTexture ( ANIME_PATH_STILL " BlueRightBack.png " ) ; //6
TextureAtlas : : TextureIndex StillBack = m_animeAtlas . AddTexture ( ANIME_PATH_STILL " BlueBackRight.png " ) ; //7
2023-12-05 13:44:54 -05:00
//SHOOTINGSTILL SANS TIRER
2023-12-06 16:22:05 -05:00
TextureAtlas : : TextureIndex StillFrontShoot = m_animeAtlas . AddTexture ( ANIM_PATH_SSHOOT1 " BlueFrontRightShootingRight.png " ) ; ////9
TextureAtlas : : TextureIndex StillQuarterFrontLeftShoot = m_animeAtlas . AddTexture ( ANIM_PATH_SSHOOT1 " BlueFrontRightShootingRight.png " ) ; ////10
TextureAtlas : : TextureIndex StillQuarterFrontRightShoot = m_animeAtlas . AddTexture ( ANIM_PATH_SSHOOT1 " BlueRightShootingRight.png " ) ; ////11
TextureAtlas : : TextureIndex StillProfiltLeftShoot = m_animeAtlas . AddTexture ( ANIM_PATH_SSHOOT1 " BlueProfilShootingLeft.png " ) ; ////12
TextureAtlas : : TextureIndex StillProfiltRightShoot = m_animeAtlas . AddTexture ( ANIM_PATH_SSHOOT1 " BlueProfilShootingRight.png " ) ; ////13
TextureAtlas : : TextureIndex StillQuarterBackLeftShoot = m_animeAtlas . AddTexture ( ANIM_PATH_SSHOOT1 " BlueBackLeftShootingLeft.png " ) ; ////14
TextureAtlas : : TextureIndex StillQuarterBackRightShoot = m_animeAtlas . AddTexture ( ANIM_PATH_SSHOOT1 " BlueBackRightShootingRight.png " ) ; ////15
TextureAtlas : : TextureIndex StillBackShoot = m_animeAtlas . AddTexture ( ANIM_PATH_SSHOOT1 " BlueShootingBackRight.png " ) ; ////16
2023-12-05 13:44:54 -05:00
//SHOOTINGSTILL TIRER
2023-12-06 16:22:05 -05:00
TextureAtlas : : TextureIndex StillFrontShootFire = m_animeAtlas . AddTexture ( ANIM_PATH_SSHOOT2 " BlueFrontRightShootingRightShoot1.png " ) ; ////17
TextureAtlas : : TextureIndex StillQuarterFrontLeftFire = m_animeAtlas . AddTexture ( ANIM_PATH_SSHOOT2 " BlueLeftShootingLeftShoot1.png " ) ; ////18
TextureAtlas : : TextureIndex StillQuarterFrontRightShootFire = m_animeAtlas . AddTexture ( ANIM_PATH_SSHOOT2 " BlueRightShootingRightShoot1.png " ) ; ////19
TextureAtlas : : TextureIndex StillProfiltLeftShootFire = m_animeAtlas . AddTexture ( ANIM_PATH_SSHOOT2 " BlueProfilShootingLeftShoot1.png " ) ; ////20
TextureAtlas : : TextureIndex StillProfiltRightShootFire = m_animeAtlas . AddTexture ( ANIM_PATH_SSHOOT2 " BlueProfilShootingRightShoot1.png " ) ; ////21
TextureAtlas : : TextureIndex StillQuarterBackLeftShootFire = m_animeAtlas . AddTexture ( ANIM_PATH_SSHOOT2 " BlueBackLeftShootingLeftShoot1.png " ) ; ////22
TextureAtlas : : TextureIndex StillQuarterBackRightShootFire = m_animeAtlas . AddTexture ( ANIM_PATH_SSHOOT2 " BlueBackRightShootingRightShoot1.png " ) ; ////23
TextureAtlas : : TextureIndex StillBackShootFire = m_animeAtlas . AddTexture ( ANIM_PATH_SSHOOT2 " BlueShootingBackRightShoot1.png " ) ; ////24
2023-12-05 13:44:54 -05:00
2023-11-20 14:28:54 -05:00
//JUMP
2023-12-06 16:22:05 -05:00
TextureAtlas : : TextureIndex JumpFront = m_animeAtlas . AddTexture ( ANIME_PATH_JUMP " BlueFrontJumpRight.png " ) ; ////25
TextureAtlas : : TextureIndex JumpQuarterFrontLeft = m_animeAtlas . AddTexture ( ANIME_PATH_JUMP " BlueLeftFrontJumpLeft.png " ) ; ////26
TextureAtlas : : TextureIndex JumpQuarterFrontRight = m_animeAtlas . AddTexture ( ANIME_PATH_JUMP " BlueRightFrontJumpRight.png " ) ; ////27
TextureAtlas : : TextureIndex JumpProfiltLeft = m_animeAtlas . AddTexture ( ANIME_PATH_JUMP " BlueProfilJumpLeft.png " ) ; ////28
TextureAtlas : : TextureIndex JumpProfiltRight = m_animeAtlas . AddTexture ( ANIME_PATH_JUMP " BlueProfilJumpRight.png " ) ; ////29
TextureAtlas : : TextureIndex JumpQuarterBackLeft = m_animeAtlas . AddTexture ( ANIME_PATH_JUMP " BlueLeftBackJumpLeft.png " ) ; ////30
TextureAtlas : : TextureIndex JumpQuarterBackRight = m_animeAtlas . AddTexture ( ANIME_PATH_JUMP " BlueRightBackJumpRight.png " ) ; ////31
TextureAtlas : : TextureIndex JumpBack = m_animeAtlas . AddTexture ( ANIME_PATH_JUMP " BlueBackJumpRight.png " ) ; ////32
2023-12-06 11:16:30 -05:00
//SHOOTINGJUMP SANS TIRER
2023-12-06 16:22:05 -05:00
TextureAtlas : : TextureIndex JumpFrontShoot = m_animeAtlas . AddTexture ( ANIM_PATH_JSHOOT1 " BlueFrontJumpRightShootingRight.png " ) ; ////33
TextureAtlas : : TextureIndex JumpQuarterFrontLeftShoot = m_animeAtlas . AddTexture ( ANIM_PATH_JSHOOT1 " BlueFrontLeftJumpLeftShootingLeft.png " ) ; ////34
TextureAtlas : : TextureIndex JumpQuarterFrontRightShoot = m_animeAtlas . AddTexture ( ANIM_PATH_JSHOOT1 " BlueFrontRightJumpRightShootingRight.png " ) ; ////35
TextureAtlas : : TextureIndex JumpProfiltLeftShoot = m_animeAtlas . AddTexture ( ANIM_PATH_JSHOOT1 " BlueProfilLeftJumpLeftShootingLeft.png " ) ; ////36
TextureAtlas : : TextureIndex JumpProfiltRightShoot = m_animeAtlas . AddTexture ( ANIM_PATH_JSHOOT1 " BluerProfilRightJumprightShootingRight.png " ) ; ////37
TextureAtlas : : TextureIndex JumpQuarterBackLeftShoot = m_animeAtlas . AddTexture ( ANIM_PATH_JSHOOT1 " BlueBackLeftJumpLeftShootingLeft.png " ) ; ////38
TextureAtlas : : TextureIndex JumpQuarterBackRightShoot = m_animeAtlas . AddTexture ( ANIM_PATH_JSHOOT1 " BlueBackRightJumpRightShootingRight.png " ) ; ////39
TextureAtlas : : TextureIndex JumpBackShoot = m_animeAtlas . AddTexture ( ANIM_PATH_JSHOOT1 " BlueBackJumpRightShootingRight.png " ) ; ////40
2023-12-07 12:10:47 -05:00
2023-12-05 13:44:54 -05:00
//SHOOTINGJUMP TIRER
2023-12-06 16:22:05 -05:00
TextureAtlas : : TextureIndex JumpFrontShootFire = m_animeAtlas . AddTexture ( ANIM_PATH_JSHOOT2 " BlueFrontJumpRightShootingRightShoot1.png " ) ; ////41
TextureAtlas : : TextureIndex JumpQuarterFrontLeftShootFire = m_animeAtlas . AddTexture ( ANIM_PATH_JSHOOT2 " BlueFrontLeftJumpLeftShootingLeftShoot1.png " ) ; ////42
TextureAtlas : : TextureIndex JumpQuarterFrontRightShootFire = m_animeAtlas . AddTexture ( ANIM_PATH_JSHOOT2 " BlueFrontRightJumpRightShootingRightShoot1.png " ) ; ////43
TextureAtlas : : TextureIndex JumpProfiltLeftShootFire = m_animeAtlas . AddTexture ( ANIM_PATH_JSHOOT2 " BlueProfilLeftJumpLeftShootingLeftShoot1.png " ) ; ////44
TextureAtlas : : TextureIndex JumpProfiltRightShootFire = m_animeAtlas . AddTexture ( ANIM_PATH_JSHOOT2 " BluerProfilRightJumprightShootingRightShoot1.png " ) ; ////45
TextureAtlas : : TextureIndex JumpQuarterBackLeftShootFire = m_animeAtlas . AddTexture ( ANIM_PATH_JSHOOT2 " BlueBackLeftJumpLeftShootingLeftShoot1.png " ) ; ////46
TextureAtlas : : TextureIndex JumpQuarterBackRightShootFire = m_animeAtlas . AddTexture ( ANIM_PATH_JSHOOT2 " BlueBackRightJumpRightShootingRightShoot1.png " ) ; ////47
TextureAtlas : : TextureIndex JumpBackShootFire = m_animeAtlas . AddTexture ( ANIM_PATH_JSHOOT2 " BlueBackJumpRightShootingRightShoot1.png " ) ; ////48
2023-12-07 12:10:47 -05:00
2023-11-20 14:28:54 -05:00
if ( ! m_animeAtlas . Generate ( TEXTURE_SIZE , false ) ) {
std : : cout < < " Unable to generate texture atlas ... " < < std : : endl ;
abort ( ) ;
}
2021-10-26 17:28:37 -04:00
2021-12-06 10:58:40 -05:00
if ( ! m_textureAtlas . Generate ( TEXTURE_SIZE , false ) ) {
2021-10-26 17:28:37 -04:00
std : : cout < < " Unable to generate texture atlas ... " < < std : : endl ;
abort ( ) ;
}
2021-10-11 11:37:58 -04:00
2021-10-31 00:31:08 -04:00
float u , v , s ;
m_textureAtlas . TextureIndexToCoord ( texDirtIndex , u , v , s , s ) ;
m_blockinfo [ BTYPE_DIRT ] = new BlockInfo ( BTYPE_DIRT , " Dirt " , u , v , s , 1 ) ;
m_textureAtlas . TextureIndexToCoord ( texGrassIndex , u , v , s , s ) ;
m_blockinfo [ BTYPE_GRASS ] = new BlockInfo ( BTYPE_GRASS , " Grass " , u , v , s , 1 ) ;
m_textureAtlas . TextureIndexToCoord ( texMetalIndex , u , v , s , s ) ;
m_blockinfo [ BTYPE_METAL ] = new BlockInfo ( BTYPE_METAL , " Metal " , u , v , s , 1 ) ;
m_textureAtlas . TextureIndexToCoord ( texIceIndex , u , v , s , s ) ;
m_blockinfo [ BTYPE_ICE ] = new BlockInfo ( BTYPE_ICE , " Ice " , u , v , s , 1 ) ;
2023-11-20 16:02:45 -05:00
m_textureAtlas . TextureIndexToCoord ( texGreenGrassIndex , u , v , s , s ) ;
m_blockinfo [ BTYPE_GREENGRASS ] = new BlockInfo ( BTYPE_GREENGRASS , " GreenGrass " , u , v , s , 1 ) ;
2023-10-30 14:32:20 -04:00
m_textureAtlas . TextureIndexToCoord ( texBoostHeal , u , v , s , s ) ;
m_boostinfo [ BTYPE_HEAL ] = new BoostInfo ( BTYPE_HEAL , " Heal " , u , v , s , 1 ) ;
m_textureAtlas . TextureIndexToCoord ( texBoostDmg , u , v , s , s ) ;
m_boostinfo [ BTYPE_DAMAGE ] = new BoostInfo ( BTYPE_DAMAGE , " Dmg " , u , v , s , 1 ) ;
m_textureAtlas . TextureIndexToCoord ( texBoostSpd , u , v , s , s ) ;
m_boostinfo [ BTYPE_SPEED ] = new BoostInfo ( BTYPE_SPEED , " Spd " , u , v , s , 1 ) ;
m_textureAtlas . TextureIndexToCoord ( texIceIndex , u , v , s , s ) ;
m_boostinfo [ BTYPE_INVINCIBLE ] = new BoostInfo ( BTYPE_INVINCIBLE , " Inv " , u , v , s , 1 ) ;
2023-11-20 14:28:54 -05:00
m_animeAtlas . TextureIndexToCoord ( 0 , u , v , s , s ) ;
2021-10-11 11:37:58 -04:00
std : : cout < < " Loading and compiling shaders ... " < < std : : endl ;
2021-10-12 15:58:54 -04:00
if ( ! m_shader01 . Load ( SHADER_PATH " shader01.vert " , SHADER_PATH " shader01.frag " , true ) ) {
2021-10-11 11:37:58 -04:00
std : : cout < < " Failed to load shader " < < std : : endl ;
exit ( 1 ) ;
}
2021-09-24 10:15:43 -04:00
2021-10-12 15:58:54 -04:00
if ( ! m_skybox . GetShader ( ) . Load ( SHADER_PATH " skybox.vert " , SHADER_PATH " skybox.frag " , true ) ) {
std : : cout < < " Failed to load shader " < < std : : endl ;
exit ( 1 ) ;
}
2021-09-24 10:15:43 -04:00
}
2021-11-15 20:58:13 -05:00
void Engine : : UnloadResource ( ) { }
2021-10-12 15:58:54 -04:00
2023-10-30 14:32:20 -04:00
2021-09-24 10:15:43 -04:00
2023-12-03 00:15:18 -05:00
void Engine : : InstantDamage ( ) {
2023-10-30 14:36:44 -04:00
m_player . InflictDamage ( 0.10f ) ;
2023-10-23 15:43:55 -04:00
m_damage = false ;
}
2023-10-02 15:55:45 -04:00
void Engine : : SystemNotification ( std : : string systemLog ) {
std : : string message = " " ;
message = systemLog ;
DisplayNotification ( message ) ;
}
2023-11-20 16:02:45 -05:00
2023-10-02 15:55:45 -04:00
void Engine : : KillNotification ( Player killer , Player killed ) {
std : : string message = " " ;
message = killed . GetUsername ( ) + " killed by -> " + killer . GetUsername ( ) ;
DisplayNotification ( message ) ;
}
void Engine : : DisplayNotification ( std : : string message ) {
if ( message . length ( ) > 45 ) {
message = message . substr ( 0 , 45 ) ;
}
// Create a new notification and add it to the queue
Notification newNotification ;
newNotification . message = message ;
newNotification . displayStartTime = m_time ;
2023-10-23 16:11:35 -04:00
2023-10-02 15:55:45 -04:00
notifications . push_back ( newNotification ) ;
}
// Add a method to process the notification queue
void Engine : : ProcessNotificationQueue ( ) {
2023-10-23 16:11:35 -04:00
//PrintText(fPosX, fUsernamePosY, ss.str(), 1.5f);
//float fPosX = (Width() / 100.0f) * scaleX;
//float fPosY = Height() - (Height() * 0.05) * scaleY;
2023-10-02 15:55:45 -04:00
m_textureFont . Bind ( ) ;
2023-10-31 11:11:14 -04:00
float xOffset = Width ( ) * 0.66f ;
float yOffset = Height ( ) * 0.83f ;
2023-10-15 23:36:26 -04:00
2023-10-02 15:55:45 -04:00
for ( auto it = notifications . begin ( ) ; it ! = notifications . end ( ) ; ) {
float timeSinceDisplay = m_time - it - > displayStartTime ;
2023-10-31 11:11:14 -04:00
float y = yOffset - ( 20.0f * ( it - notifications . begin ( ) ) ) ;
2023-10-15 23:36:26 -04:00
2023-10-02 15:55:45 -04:00
glDisable ( GL_STENCIL_TEST ) ;
glDisable ( GL_DEPTH_TEST ) ;
glBlendFunc ( GL_SRC_ALPHA , GL_ONE ) ;
glBlendEquation ( GL_FUNC_ADD ) ;
glMatrixMode ( GL_PROJECTION ) ;
glPushMatrix ( ) ;
glLoadIdentity ( ) ;
glOrtho ( 0 , Width ( ) , 0 , Height ( ) , - 1 , 1 ) ;
glMatrixMode ( GL_MODELVIEW ) ;
glPushMatrix ( ) ;
2023-10-15 23:36:26 -04:00
PrintText ( xOffset , y , it - > message ) ;
2023-10-02 15:55:45 -04:00
glBlendFunc ( GL_CONSTANT_COLOR , GL_ONE_MINUS_CONSTANT_COLOR ) ;
glBlendEquation ( GL_FUNC_SUBTRACT ) ;
glEnable ( GL_STENCIL_TEST ) ;
glEnable ( GL_DEPTH_TEST ) ;
glMatrixMode ( GL_PROJECTION ) ;
glPopMatrix ( ) ;
glMatrixMode ( GL_MODELVIEW ) ;
glPopMatrix ( ) ;
2023-10-15 23:36:26 -04:00
2023-10-02 15:55:45 -04:00
if ( timeSinceDisplay > = 4.0f ) {
2023-10-15 23:36:26 -04:00
it = notifications . erase ( it ) ;
2023-10-02 15:55:45 -04:00
}
else {
+ + it ;
}
}
}
2023-09-15 20:28:20 -04:00
void Engine : : DisplayCrosshair ( ) {
m_textureCrosshair . Bind ( ) ;
static const int crossSize = 32 ;
2023-09-15 11:24:43 -04:00
glLoadIdentity ( ) ;
2023-09-15 20:28:20 -04:00
glTranslated ( Width ( ) / 2 - crossSize / 2 , Height ( ) / 2 - crossSize / 2 , 0 ) ;
glBegin ( GL_QUADS ) ;
2023-10-23 16:11:35 -04:00
glTexCoord2f ( 0 , 0 ) ;
glVertex2i ( 0 , 0 ) ;
glTexCoord2f ( 1 , 0 ) ;
glVertex2i ( crossSize , 0 ) ;
glTexCoord2f ( 1 , 1 ) ;
glVertex2i ( crossSize , crossSize ) ;
glTexCoord2f ( 0 , 1 ) ;
glVertex2i ( 0 , crossSize ) ;
2023-09-15 20:28:20 -04:00
glEnd ( ) ;
}
2023-09-15 11:24:43 -04:00
2023-12-01 09:49:00 -05:00
void Engine : : DisplayCurrentItem ( ) { }
2023-10-16 17:36:04 -04:00
2023-09-23 17:15:35 -04:00
void Engine : : DisplayHud ( int timer ) {
2023-09-15 20:28:20 -04:00
glBindTexture ( GL_TEXTURE_2D , 0 ) ;
glLoadIdentity ( ) ;
2023-10-15 23:36:26 -04:00
glBlendFunc ( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ) ;
2023-12-05 13:44:54 -05:00
glClear ( GL_STENCIL_BUFFER_BIT ) ;
2023-10-15 23:36:26 -04:00
2023-10-31 11:11:14 -04:00
float itemBackgroundWidthProportion = 0.25f ;
float itemBackgroundHeightProportion = 0.175f ;
float itemBackgroundWidth = Width ( ) * itemBackgroundWidthProportion ;
float itemBackgroundHeight = Height ( ) * itemBackgroundHeightProportion ;
float itemBackgroundXOffset = Width ( ) * 0.05f ;
float itemBackgroundYOffset = Height ( ) * 0.6f ;
float itemBackgroundXPos = itemBackgroundXOffset ;
float itemBackgroundYPos = Height ( ) - itemBackgroundHeight - itemBackgroundYOffset ;
2023-10-15 23:36:26 -04:00
2023-10-31 11:11:14 -04:00
// Selected item background
2023-10-15 23:36:26 -04:00
glColor4f ( 1.0f , 1.0f , 1.0f , 0.2f ) ;
glBegin ( GL_QUADS ) ;
2023-10-31 11:11:14 -04:00
glVertex2f ( itemBackgroundXPos , itemBackgroundYPos ) ;
glVertex2f ( itemBackgroundXPos + itemBackgroundWidth , itemBackgroundYPos ) ;
glVertex2f ( itemBackgroundXPos + itemBackgroundWidth , itemBackgroundYPos + itemBackgroundHeight ) ;
glVertex2f ( itemBackgroundXPos , itemBackgroundYPos + itemBackgroundHeight ) ;
2023-10-15 23:36:26 -04:00
glEnd ( ) ;
// HP Bar
2023-09-15 11:24:43 -04:00
float playerHp = m_player . GetHP ( ) ;
2023-12-06 13:23:33 -05:00
if ( playerHp < 0. )
playerHp = = 0 ;
2023-09-16 00:12:14 -04:00
float facteurOmbrage = m_displayInfo ? 0.5f : 1.0f ;
2023-09-15 11:24:43 -04:00
2023-10-31 11:11:14 -04:00
float hpBarWidthProportion = 0.25f ;
float hpBarHeightProportion = 0.045f ;
float hpBarWidth = Width ( ) * hpBarWidthProportion ;
float hpBarHeight = Height ( ) * hpBarHeightProportion ;
float hpBarXOffset = Width ( ) * 0.05f ;
float hpBarYOffset = Height ( ) * 0.7f ;
float hpBarYPos = Height ( ) - hpBarHeight - hpBarYOffset ;
2023-10-15 23:36:26 -04:00
// HP Bar Background
2023-09-16 00:12:14 -04:00
glColor3f ( 1.0f * facteurOmbrage , 1.0f * facteurOmbrage , 1.0f * facteurOmbrage ) ;
2023-09-15 11:24:43 -04:00
glBegin ( GL_QUADS ) ;
2023-10-31 11:11:14 -04:00
glVertex2f ( itemBackgroundXPos , hpBarYPos - hpBarHeight ) ;
glVertex2f ( itemBackgroundXPos + itemBackgroundWidth , hpBarYPos - hpBarHeight ) ;
glVertex2f ( itemBackgroundXPos + itemBackgroundWidth , hpBarYPos ) ;
glVertex2f ( itemBackgroundXPos , hpBarYPos ) ;
2023-09-15 11:24:43 -04:00
glEnd ( ) ;
2023-10-18 09:33:56 -04:00
//TODO: Associer avec mechanique de vie du joueur
2023-09-16 00:12:14 -04:00
// Barre HP
glColor3f ( 0.0f * facteurOmbrage , 1.0f * facteurOmbrage , 0.0f * facteurOmbrage ) ;
2023-09-15 11:24:43 -04:00
glBegin ( GL_QUADS ) ;
2023-10-31 11:11:14 -04:00
glVertex2f ( itemBackgroundXPos , hpBarYPos - hpBarHeight ) ;
glVertex2f ( itemBackgroundXPos + itemBackgroundWidth * playerHp , hpBarYPos - hpBarHeight ) ;
glVertex2f ( itemBackgroundXPos + itemBackgroundWidth * playerHp , hpBarYPos ) ;
glVertex2f ( itemBackgroundXPos , hpBarYPos ) ;
2023-09-15 11:24:43 -04:00
glEnd ( ) ;
2023-09-16 00:12:14 -04:00
2023-10-15 23:36:26 -04:00
// Equip Bar
2023-09-15 11:24:43 -04:00
glEnable ( GL_BLEND ) ;
2023-09-16 00:12:14 -04:00
glBlendFunc ( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ) ;
glColor3f ( 1.0f * facteurOmbrage , 1.0f * facteurOmbrage , 1.0f * facteurOmbrage ) ;
2023-12-03 00:15:18 -05:00
float equipWidthProportion = 0.8f ;
float equipHeightProportion = 0.7f ;
2023-10-31 11:11:14 -04:00
float equipWidth = itemBackgroundWidth * equipWidthProportion ;
float equipHeight = itemBackgroundHeight * equipHeightProportion ;
float equipXOffset = itemBackgroundXPos + ( itemBackgroundWidth - equipWidth ) * 0.1f ;
2023-12-03 00:15:18 -05:00
float equipYOffset = itemBackgroundYPos + ( itemBackgroundHeight - equipHeight ) * 0.75f ;
2023-09-16 00:12:14 -04:00
2023-10-31 11:11:14 -04:00
glTranslatef ( equipXOffset , equipYOffset , 0 ) ;
2023-09-16 00:12:14 -04:00
2023-10-15 23:36:26 -04:00
m_textureGun . Bind ( ) ;
2023-09-16 00:12:14 -04:00
glBegin ( GL_QUADS ) ;
2023-10-31 11:11:14 -04:00
glTexCoord2f ( 0 , 0 ) ; glVertex2f ( 0 , 0 ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2f ( equipWidth , 0 ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2f ( equipWidth , equipHeight ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2f ( 0 , equipHeight ) ;
2023-09-16 00:12:14 -04:00
glEnd ( ) ;
// Username
glEnable ( GL_BLEND ) ;
glBlendFunc ( GL_SRC_ALPHA , GL_ONE ) ;
2023-09-15 20:28:20 -04:00
glColor3f ( 1.0f , 1.0f , 1.0f ) ;
2023-10-15 23:36:26 -04:00
2023-09-16 00:12:14 -04:00
m_textureFont . Bind ( ) ;
std : : ostringstream ss ;
2023-10-31 11:11:14 -04:00
float fUsernamePosY = hpBarYPos - ( hpBarHeight * 2 ) ;
2023-10-25 01:01:25 -04:00
ss . str ( " " ) ;
2023-09-15 20:28:20 -04:00
ss < < m_player . GetUsername ( ) ;
2023-10-31 11:11:14 -04:00
PrintText ( itemBackgroundXPos , fUsernamePosY , ss . str ( ) , 1.5f ) ;
2023-09-23 17:15:35 -04:00
2023-10-25 01:01:25 -04:00
ss . str ( " " ) ;
2023-10-15 23:36:26 -04:00
ss < < m_player . GetHP ( ) * 100 < < " % " ;
2023-10-31 11:11:14 -04:00
PrintText ( itemBackgroundXPos * 5.25f , fUsernamePosY , ss . str ( ) , 1.5f ) ;
2023-12-03 00:15:18 -05:00
2023-10-31 11:11:14 -04:00
float countdownXOffset = Width ( ) * 0.2f ;
float countdownYOffset = Height ( ) * 0.1f ;
float countdownXPos = Width ( ) - countdownXOffset ;
float countdownYPos = Height ( ) - countdownYOffset ;
2023-09-23 17:15:35 -04:00
2023-10-15 23:36:26 -04:00
// Countdown
2023-09-23 17:15:35 -04:00
ss . str ( " " ) ;
ss < < " Time: " < < ( int ) ( timer / 60 ) < < " : " < < std : : setw ( 2 ) < < std : : setfill ( ' 0 ' ) < < timer % 60 ;
2023-10-31 11:11:14 -04:00
PrintText ( countdownXPos , countdownYPos , ss . str ( ) , 2.0f ) ;
2023-09-15 11:24:43 -04:00
}
2023-12-03 00:15:18 -05:00
void Engine : : DrawHud ( float elapsedTime , BlockType bloc ) {
// Setter le blend function, tout ce qui sera noir sera transparent
glDisable ( GL_STENCIL_TEST ) ;
glDisable ( GL_DEPTH_TEST ) ;
glBlendFunc ( GL_SRC_ALPHA , GL_ONE ) ;
glBlendEquation ( GL_FUNC_ADD ) ;
glEnable ( GL_BLEND ) ;
glMatrixMode ( GL_PROJECTION ) ;
glPushMatrix ( ) ;
glLoadIdentity ( ) ;
glOrtho ( 0 , Width ( ) , 0 , Height ( ) , - 1 , 1 ) ;
glMatrixMode ( GL_MODELVIEW ) ;
glPushMatrix ( ) ;
int timer = GetCountdown ( elapsedTime ) ;
2023-12-06 11:16:39 -05:00
/*for (int i = 1; i < WORLD_SIZE_X; i++) {
2023-12-03 00:15:18 -05:00
if ( timer < = COUNTDOWN - m_timerReductionChunk * i ) {
m_world . RemoveChunk ( m_nbReductionChunk * i ) ;
m_renderer . RemoveChunk ( m_nbReductionChunk * i ) ;
}
2023-12-06 11:16:39 -05:00
} */
2023-12-03 00:15:18 -05:00
if ( m_keyK ) {
SystemNotification ( m_messageNotification ) ;
m_keyK = false ;
}
if ( m_keyL ) {
KillNotification ( m_player , m_player ) ;
m_keyL = false ;
}
if ( m_displayInfo ) {
DisplayInfo ( elapsedTime , bloc ) ;
}
if ( m_displayHud ) {
DisplayHud ( timer ) ;
}
if ( m_displayCrosshair ) {
DisplayCrosshair ( ) ;
}
glBlendFunc ( GL_CONSTANT_COLOR , GL_ONE_MINUS_CONSTANT_COLOR ) ;
glBlendEquation ( GL_FUNC_SUBTRACT ) ;
glEnable ( GL_STENCIL_TEST ) ;
glEnable ( GL_DEPTH_TEST ) ;
glMatrixMode ( GL_PROJECTION ) ;
glPopMatrix ( ) ;
glMatrixMode ( GL_MODELVIEW ) ;
glPopMatrix ( ) ;
}
void Engine : : DisplayPovGun ( ) {
// Setter le blend function, tout ce qui sera noir sera transparent
glDisable ( GL_STENCIL_TEST ) ;
glDisable ( GL_DEPTH_TEST ) ;
glBlendFunc ( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ) ;
glBlendEquation ( GL_FUNC_ADD ) ;
glMatrixMode ( GL_PROJECTION ) ;
glPushMatrix ( ) ;
glLoadIdentity ( ) ;
glOrtho ( 0 , Width ( ) , 0 , Height ( ) , - 1 , 1 ) ;
glMatrixMode ( GL_MODELVIEW ) ;
glPushMatrix ( ) ;
float baseXOffsetPercentage = 0.4958 ;
float baseWidthPercentage = 0.4688 ;
float baseHeightPercentage = 0.5787 ;
float xTranslation = baseXOffsetPercentage * Width ( ) ;
float quadWidth = baseWidthPercentage * Width ( ) ;
float quadHeight = baseHeightPercentage * Height ( ) ;
m_texturePovGun . Bind ( ) ;
glLoadIdentity ( ) ;
glTranslated ( xTranslation , 0 , 0 ) ;
glBegin ( GL_QUADS ) ;
glTexCoord2f ( 0 , 0 ) ;
glVertex2i ( 0 , 0 ) ;
glTexCoord2f ( 1 , 0 ) ;
glVertex2i ( quadWidth , 0 ) ;
glTexCoord2f ( 1 , 1 ) ;
glVertex2i ( quadWidth , quadHeight ) ;
glTexCoord2f ( 0 , 1 ) ;
glVertex2i ( 0 , quadHeight ) ;
glEnd ( ) ;
// Reset du blend function
glBlendFunc ( GL_CONSTANT_COLOR , GL_ONE_MINUS_CONSTANT_COLOR ) ;
glBlendEquation ( GL_FUNC_SUBTRACT ) ;
glEnable ( GL_STENCIL_TEST ) ;
glEnable ( GL_DEPTH_TEST ) ;
glMatrixMode ( GL_PROJECTION ) ;
glPopMatrix ( ) ;
glMatrixMode ( GL_MODELVIEW ) ;
glPopMatrix ( ) ;
}
void Engine : : PrintText ( float x , float y , const std : : string & t , float charSizeMultiplier ) {
float windowWidth = static_cast < float > ( Width ( ) ) ;
float windowHeight = static_cast < float > ( Height ( ) ) ;
float posX = x * windowWidth ;
float posY = y * windowHeight ;
float baseCharSize = 20 + ( 24 - 20 ) * ( windowWidth - 1600 ) / ( 1920 - 1600 ) ;
float charSize = baseCharSize * charSizeMultiplier ;
glPushMatrix ( ) ;
glLoadIdentity ( ) ;
glTranslated ( x , y , 0 ) ;
for ( unsigned int i = 0 ; i < t . length ( ) ; + + i ) {
float left = ( float ) ( ( t [ i ] - 32 ) % 16 ) / 16.f ;
float top = ( float ) ( ( t [ i ] - 32 ) / 16 ) / 16.f ;
top + = 0.5f ;
glBegin ( GL_QUADS ) ;
glTexCoord2f ( left , 1.f - top - .0625f ) ; glVertex2f ( 0 , 0 ) ;
glTexCoord2f ( left + .0625f , 1.f - top - .0625f ) ; glVertex2f ( charSize , 0 ) ;
glTexCoord2f ( left + .0625f , 1.f - top ) ; glVertex2f ( charSize , charSize ) ;
glTexCoord2f ( left , 1.f - top ) ; glVertex2f ( 0 , charSize ) ;
glEnd ( ) ;
glTranslated ( 0.5555f * charSize , 0 , 0 ) ;
}
glPopMatrix ( ) ;
}
int Engine : : GetFps ( float elapsedTime ) const { return 1 / elapsedTime ; }
int Engine : : GetCountdown ( float elapsedTime ) {
2023-12-07 12:10:47 -05:00
return m_countdown ;
2023-12-03 00:15:18 -05:00
}
int Engine : : GetOptionsChoice ( ) {
return m_selectedOption ;
}
2023-09-15 20:28:20 -04:00
void Engine : : DisplayInfo ( float elapsedTime , BlockType bloc ) {
2021-10-26 17:28:37 -04:00
m_textureFont . Bind ( ) ;
std : : ostringstream ss ;
2023-09-16 00:12:14 -04:00
2023-10-31 11:11:14 -04:00
float marginX = Width ( ) * 0.01 ;
float marginY = Height ( ) * 0.05 ;
float fPosX = marginX ;
float fPosY = Height ( ) - marginY ;
2023-09-16 00:12:14 -04:00
2023-10-15 23:36:26 -04:00
float charSize = 20 + ( 24 - 20 ) * ( Width ( ) - 1600 ) / ( 1920 - 1600 ) ;
2023-09-16 00:12:14 -04:00
2021-10-26 17:28:37 -04:00
ss < < " Fps : " < < GetFps ( elapsedTime ) ;
2023-10-15 23:36:26 -04:00
PrintText ( fPosX , fPosY , ss . str ( ) ) ;
2021-10-26 17:28:37 -04:00
ss . str ( " " ) ;
2023-10-15 23:36:26 -04:00
fPosY - = charSize ;
2021-11-26 11:59:02 -05:00
ss < < " Rendered Chunks : " < < m_renderCount ;
2023-10-15 23:36:26 -04:00
PrintText ( fPosX , fPosY , ss . str ( ) ) ;
2021-11-26 11:59:02 -05:00
ss . str ( " " ) ;
2023-10-15 23:36:26 -04:00
fPosY - = charSize ;
2021-12-15 21:00:06 -05:00
ss < < " To-Be-Deleted Chunks : " < < m_world . GettbDeleted ( ) ;
2023-10-15 23:36:26 -04:00
PrintText ( fPosX , fPosY , ss . str ( ) ) ;
2021-12-15 21:00:06 -05:00
ss . str ( " " ) ;
2023-10-15 23:36:26 -04:00
fPosY - = charSize ;
2023-10-31 11:11:14 -04:00
float fPosYJump = Height ( ) * 0.09 ;
2023-10-15 23:36:26 -04:00
fPosY = fPosYJump ;
fPosY - = charSize ;
2023-12-05 13:44:54 -05:00
ss < < " Velocity : " < < m_player . GetVelocity ( ) ;
2023-10-15 23:36:26 -04:00
PrintText ( fPosX , fPosY , ss . str ( ) ) ;
2021-10-26 17:28:37 -04:00
ss . str ( " " ) ;
2023-10-15 23:36:26 -04:00
fPosY - = charSize ;
2023-11-19 16:46:13 -05:00
ss < < " Player Position : " < < m_player . GetPosition ( ) ;
2023-10-15 23:36:26 -04:00
PrintText ( fPosX , fPosY , ss . str ( ) ) ;
2021-10-26 17:28:37 -04:00
ss . str ( " " ) ;
2023-10-15 23:36:26 -04:00
fPosY - = charSize ;
2023-12-05 13:44:54 -05:00
ss < < " Remote Position : " < < m_otherplayerpos ;
2023-10-15 23:36:26 -04:00
PrintText ( fPosX , fPosY , ss . str ( ) ) ;
2021-12-07 18:59:50 -05:00
ss . str ( " " ) ;
2023-10-15 23:36:26 -04:00
fPosY - = charSize ;
2023-09-16 00:12:14 -04:00
2023-12-06 13:23:33 -05:00
//ss << " Block : ";
//if (bloc == BTYPE_LAST)
// ss << "Weapon";
//else
// ss << (int)bloc;
2023-10-15 23:36:26 -04:00
PrintText ( fPosX , fPosYJump , ss . str ( ) ) ;
2023-09-15 20:28:20 -04:00
}
2023-12-03 00:15:18 -05:00
void Engine : : DisplaySplashScreen ( ) {
glDisable ( GL_LIGHTING ) ;
glDisable ( GL_DEPTH_TEST ) ;
glDisable ( GL_STENCIL_TEST ) ;
glMatrixMode ( GL_PROJECTION ) ;
glPushMatrix ( ) ;
glLoadIdentity ( ) ;
glOrtho ( - Width ( ) / 2 , Width ( ) / 2 , - Height ( ) / 2 , Height ( ) / 2 , - 1 , 1 ) ;
glMatrixMode ( GL_MODELVIEW ) ;
glPushMatrix ( ) ;
glLoadIdentity ( ) ;
int imageWidth = Width ( ) ;
int imageHeight = Height ( ) ;
m_textureSplashScreen . Bind ( ) ;
glBegin ( GL_QUADS ) ;
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( - imageWidth / 2 , - imageHeight / 2 ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( imageWidth / 2 , - imageHeight / 2 ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( imageWidth / 2 , imageHeight / 2 ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( - imageWidth / 2 , imageHeight / 2 ) ;
glEnd ( ) ;
2023-10-31 11:11:14 -04:00
2023-12-03 00:15:18 -05:00
glMatrixMode ( GL_PROJECTION ) ;
glPopMatrix ( ) ;
glMatrixMode ( GL_MODELVIEW ) ;
glPopMatrix ( ) ;
}
2023-12-03 00:47:04 -05:00
void Engine : : DisplayPauseMenu ( ) {
m_texturePauseMenu . Bind ( ) ;
glBegin ( GL_QUADS ) ;
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( 0 , 0 ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( Width ( ) , 0 ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( Width ( ) , Height ( ) ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( 0 , Height ( ) ) ;
glEnd ( ) ;
}
2023-12-03 00:15:18 -05:00
void Engine : : DisplayMainMenu ( ) {
GLint viewport [ 4 ] ;
glGetIntegerv ( GL_VIEWPORT , viewport ) ;
2023-10-25 01:01:25 -04:00
2023-10-23 16:11:35 -04:00
glDisable ( GL_STENCIL_TEST ) ;
glDisable ( GL_DEPTH_TEST ) ;
2023-12-03 00:15:18 -05:00
glEnable ( GL_BLEND ) ;
glBlendFunc ( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ) ;
glBlendEquation ( GL_FUNC_ADD ) ;
2023-10-23 16:11:35 -04:00
glMatrixMode ( GL_PROJECTION ) ;
glPushMatrix ( ) ;
glLoadIdentity ( ) ;
glOrtho ( 0 , Width ( ) , 0 , Height ( ) , - 1 , 1 ) ;
glMatrixMode ( GL_MODELVIEW ) ;
glPushMatrix ( ) ;
2023-10-31 11:11:14 -04:00
// Background
2023-12-03 00:15:18 -05:00
m_textureMainMenu . Bind ( ) ;
2023-10-23 16:11:35 -04:00
glBegin ( GL_QUADS ) ;
2023-10-31 11:11:14 -04:00
glTexCoord2f ( 0.0f , 0.0f ) ; glVertex2f ( 0.0f , 0.0f ) ;
glTexCoord2f ( 1.0f , 0.0f ) ; glVertex2f ( Width ( ) , 0.0f ) ;
glTexCoord2f ( 1.0f , 1.0f ) ; glVertex2f ( Width ( ) , Height ( ) ) ;
glTexCoord2f ( 0.0f , 1.0f ) ; glVertex2f ( 0.0f , Height ( ) ) ;
2023-10-23 16:11:35 -04:00
glEnd ( ) ;
2023-10-29 15:39:29 -04:00
// Title
2023-12-03 00:15:18 -05:00
float centerX = Width ( ) * 0.5f ;
float centerY = Height ( ) * 0.5f ;
2023-10-31 11:11:14 -04:00
glColor4f ( 1.0f , 0.5f , 0.0f , 1.0f ) ;
2023-12-03 00:15:18 -05:00
m_textureMenuTitle . Bind ( ) ;
2023-10-25 01:01:25 -04:00
glBegin ( GL_QUADS ) ;
2023-12-03 00:15:18 -05:00
glTexCoord2f ( 0.0f , 0.0f ) ; glVertex2f ( centerX + Width ( ) * 0.05 , centerY + Height ( ) * 0.05 ) ;
glTexCoord2f ( 1.0f , 0.0f ) ; glVertex2f ( centerX + Width ( ) * 0.45 , centerY + Height ( ) * 0.05 ) ;
glTexCoord2f ( 1.0f , 1.0f ) ; glVertex2f ( centerX + Width ( ) * 0.45 , centerY + Height ( ) * 0.45 ) ;
glTexCoord2f ( 0.0f , 1.0f ) ; glVertex2f ( centerX + Width ( ) * 0.05 , centerY + Height ( ) * 0.45 ) ;
2023-10-25 01:01:25 -04:00
glEnd ( ) ;
2023-12-03 00:15:18 -05:00
DrawButtonBackgrounds ( centerX , centerY , 3 ) ;
if ( m_gamestate = = GameState : : MAIN_MENU ) {
if ( m_selectedPlayOptions ) {
DrawSingleMultiButtons ( centerX , centerY ) ;
}
else {
DrawMainMenuButtons ( centerX , centerY ) ;
}
}
glColor4f ( 1.0f , 1.0f , 1.0f , 1.0f ) ;
glViewport ( viewport [ 0 ] , viewport [ 1 ] , viewport [ 2 ] , viewport [ 3 ] ) ;
glEnable ( GL_STENCIL_TEST ) ;
glEnable ( GL_DEPTH_TEST ) ;
2023-10-25 01:01:25 -04:00
2023-12-03 00:15:18 -05:00
glMatrixMode ( GL_PROJECTION ) ;
glPopMatrix ( ) ;
glMatrixMode ( GL_MODELVIEW ) ;
glPopMatrix ( ) ;
ShowCursor ( ) ;
}
2023-10-25 01:01:25 -04:00
2023-12-03 00:15:18 -05:00
void Engine : : DrawMainMenuButtons ( float centerX , float centerY ) {
m_textureMenuPlay . Bind ( ) ;
glColor4f ( 0.75f , 0.05f , 0.0f , 1.0f ) ;
glBegin ( GL_QUADS ) ;
glTexCoord2f ( 0.0f , 0.0f ) ; glVertex2f ( centerX + Width ( ) * 0.16 , centerY - Height ( ) * 0.065 ) ;
glTexCoord2f ( 1.0f , 0.0f ) ; glVertex2f ( centerX + Width ( ) * 0.34 , centerY - Height ( ) * 0.065 ) ;
glTexCoord2f ( 1.0f , 1.0f ) ; glVertex2f ( centerX + Width ( ) * 0.34 , centerY - Height ( ) * 0.01 ) ;
glTexCoord2f ( 0.0f , 1.0f ) ; glVertex2f ( centerX + Width ( ) * 0.16 , centerY - Height ( ) * 0.01 ) ;
glEnd ( ) ;
2023-10-25 01:01:25 -04:00
2023-12-03 00:15:18 -05:00
m_textureMenuOptions . Bind ( ) ;
glColor4f ( 0.75f , 0.05f , 0.0f , 1.0f ) ;
glBegin ( GL_QUADS ) ;
glTexCoord2f ( 0.0f , 0.0f ) ; glVertex2f ( centerX + Width ( ) * 0.08 , centerY - Height ( ) * 0.165 ) ;
glTexCoord2f ( 1.0f , 0.0f ) ; glVertex2f ( centerX + Width ( ) * 0.42 , centerY - Height ( ) * 0.165 ) ;
glTexCoord2f ( 1.0f , 1.0f ) ; glVertex2f ( centerX + Width ( ) * 0.42 , centerY - Height ( ) * 0.11 ) ;
glTexCoord2f ( 0.0f , 1.0f ) ; glVertex2f ( centerX + Width ( ) * 0.08 , centerY - Height ( ) * 0.11 ) ;
glEnd ( ) ;
2023-10-25 01:01:25 -04:00
2023-12-03 00:15:18 -05:00
m_textureMenuQuit . Bind ( ) ;
glColor4f ( 0.75f , 0.05f , 0.0f , 1.0f ) ;
2023-10-25 01:01:25 -04:00
glBegin ( GL_QUADS ) ;
2023-12-03 00:15:18 -05:00
glTexCoord2f ( 0.0f , 0.0f ) ; glVertex2f ( centerX + Width ( ) * 0.16 , centerY - Height ( ) * 0.265 ) ;
glTexCoord2f ( 1.0f , 0.0f ) ; glVertex2f ( centerX + Width ( ) * 0.34 , centerY - Height ( ) * 0.265 ) ;
glTexCoord2f ( 1.0f , 1.0f ) ; glVertex2f ( centerX + Width ( ) * 0.34 , centerY - Height ( ) * 0.21 ) ;
glTexCoord2f ( 0.0f , 1.0f ) ; glVertex2f ( centerX + Width ( ) * 0.16 , centerY - Height ( ) * 0.21 ) ;
2023-10-25 01:01:25 -04:00
glEnd ( ) ;
2023-12-03 00:15:18 -05:00
}
2023-10-25 01:01:25 -04:00
2023-12-03 00:15:18 -05:00
void Engine : : DrawSingleMultiButtons ( float centerX , float centerY ) {
m_textureMenuSingle . Bind ( ) ;
2023-10-31 11:11:14 -04:00
glColor4f ( 0.75f , 0.05f , 0.0f , 1.0f ) ;
2023-10-29 15:39:29 -04:00
glBegin ( GL_QUADS ) ;
2023-12-03 00:15:18 -05:00
glTexCoord2f ( 0.0f , 0.0f ) ; glVertex2f ( centerX + Width ( ) * 0.06 , centerY - Height ( ) * 0.065 ) ;
glTexCoord2f ( 1.0f , 0.0f ) ; glVertex2f ( centerX + Width ( ) * 0.44 , centerY - Height ( ) * 0.065 ) ;
glTexCoord2f ( 1.0f , 1.0f ) ; glVertex2f ( centerX + Width ( ) * 0.44 , centerY - Height ( ) * 0.01 ) ;
glTexCoord2f ( 0.0f , 1.0f ) ; glVertex2f ( centerX + Width ( ) * 0.06 , centerY - Height ( ) * 0.01 ) ;
2023-10-29 15:39:29 -04:00
glEnd ( ) ;
2023-10-25 01:01:25 -04:00
2023-12-03 00:15:18 -05:00
m_textureMenuMulti . Bind ( ) ;
glColor4f ( 0.75f , 0.05f , 0.0f , 1.0f ) ;
2023-10-25 01:01:25 -04:00
glBegin ( GL_QUADS ) ;
2023-12-03 00:15:18 -05:00
glTexCoord2f ( 0.0f , 0.0f ) ; glVertex2f ( centerX + Width ( ) * 0.08 , centerY - Height ( ) * 0.165 ) ;
glTexCoord2f ( 1.0f , 0.0f ) ; glVertex2f ( centerX + Width ( ) * 0.42 , centerY - Height ( ) * 0.165 ) ;
glTexCoord2f ( 1.0f , 1.0f ) ; glVertex2f ( centerX + Width ( ) * 0.42 , centerY - Height ( ) * 0.11 ) ;
glTexCoord2f ( 0.0f , 1.0f ) ; glVertex2f ( centerX + Width ( ) * 0.08 , centerY - Height ( ) * 0.11 ) ;
2023-10-25 01:01:25 -04:00
glEnd ( ) ;
2023-12-03 00:15:18 -05:00
m_textureMenuBack . Bind ( ) ;
2023-10-31 11:11:14 -04:00
glColor4f ( 0.75f , 0.05f , 0.0f , 1.0f ) ;
2023-10-29 15:39:29 -04:00
glBegin ( GL_QUADS ) ;
2023-12-03 00:15:18 -05:00
glTexCoord2f ( 0.0f , 0.0f ) ; glVertex2f ( centerX + Width ( ) * 0.16 , centerY - Height ( ) * 0.265 ) ;
glTexCoord2f ( 1.0f , 0.0f ) ; glVertex2f ( centerX + Width ( ) * 0.34 , centerY - Height ( ) * 0.265 ) ;
glTexCoord2f ( 1.0f , 1.0f ) ; glVertex2f ( centerX + Width ( ) * 0.34 , centerY - Height ( ) * 0.21 ) ;
glTexCoord2f ( 0.0f , 1.0f ) ; glVertex2f ( centerX + Width ( ) * 0.16 , centerY - Height ( ) * 0.21 ) ;
2023-10-25 01:01:25 -04:00
glEnd ( ) ;
2023-12-03 00:15:18 -05:00
}
2023-10-25 01:01:25 -04:00
2023-12-03 00:15:18 -05:00
void Engine : : DrawButtonBackgrounds ( float centerX , float centerY , int iterations ) {
glColor4f ( 1.0f , 1.0f , 1.0f , 0.5f ) ;
glBindTexture ( GL_TEXTURE_2D , 0 ) ;
2023-10-23 16:11:35 -04:00
2023-12-03 00:15:18 -05:00
float bottomOffset = 0.075f ;
float topOffset = 0.0f ;
float distanceBetween = 0.1f ;
2023-10-31 11:11:14 -04:00
2023-12-03 00:15:18 -05:00
for ( int i = 0 ; i < iterations ; i + + ) {
glBegin ( GL_QUADS ) ;
glTexCoord2f ( 0.0f , 0.0f ) ; glVertex2f ( centerX + Width ( ) * 0.05 , centerY - Height ( ) * bottomOffset ) ;
glTexCoord2f ( 1.0f , 0.0f ) ; glVertex2f ( centerX + Width ( ) * 0.45 , centerY - Height ( ) * bottomOffset ) ;
glTexCoord2f ( 1.0f , 1.0f ) ; glVertex2f ( centerX + Width ( ) * 0.45 , centerY - Height ( ) * topOffset ) ;
glTexCoord2f ( 0.0f , 1.0f ) ; glVertex2f ( centerX + Width ( ) * 0.05 , centerY - Height ( ) * topOffset ) ;
glEnd ( ) ;
2023-09-16 00:12:14 -04:00
2023-12-03 00:15:18 -05:00
bottomOffset + = distanceBetween ;
topOffset + = distanceBetween ;
}
}
2023-10-23 16:11:35 -04:00
2023-12-03 00:15:18 -05:00
void Engine : : DisplayOptionsMenu ( ) {
static const int sTitle = 400 ;
static const int sButton = 225 ;
2023-10-29 15:39:29 -04:00
2023-12-03 00:15:18 -05:00
float centerX = Width ( ) * 0.5f ;
float centerY = Height ( ) * 0.5f ;
2023-10-31 11:11:14 -04:00
GLint viewport [ 4 ] ;
glGetIntegerv ( GL_VIEWPORT , viewport ) ;
2023-09-15 20:28:20 -04:00
glDisable ( GL_STENCIL_TEST ) ;
2023-09-16 00:12:14 -04:00
glDisable ( GL_DEPTH_TEST ) ;
2023-10-25 01:01:25 -04:00
glEnable ( GL_BLEND ) ;
glBlendFunc ( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ) ;
glBlendEquation ( GL_FUNC_ADD ) ;
2023-10-23 16:11:35 -04:00
glMatrixMode ( GL_PROJECTION ) ;
glPushMatrix ( ) ;
glLoadIdentity ( ) ;
glOrtho ( 0 , Width ( ) , 0 , Height ( ) , - 1 , 1 ) ;
glMatrixMode ( GL_MODELVIEW ) ;
glPushMatrix ( ) ;
2023-12-03 00:15:18 -05:00
m_textureOptionsMenu . Bind ( ) ;
glLoadIdentity ( ) ;
2023-10-23 16:11:35 -04:00
glBegin ( GL_QUADS ) ;
2023-12-03 00:15:18 -05:00
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( 0 , 0 ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( Width ( ) , 0 ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( Width ( ) , Height ( ) ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( 0 , Height ( ) ) ;
2023-10-23 16:11:35 -04:00
glEnd ( ) ;
2023-12-03 00:15:18 -05:00
glColor4f ( 1.0f , 0.0f , 1.0f , 1.0f ) ;
m_textureOptOptions . Bind ( ) ;
2023-10-25 01:01:25 -04:00
glBegin ( GL_QUADS ) ;
2023-12-03 00:15:18 -05:00
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.175 , centerY + Height ( ) * 0.35 ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( centerX + Width ( ) * 0.175 , centerY + Height ( ) * 0.35 ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( centerX + Width ( ) * 0.175 , centerY + Height ( ) * 0.45 ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.175 , centerY + Height ( ) * 0.45 ) ;
2023-10-25 01:01:25 -04:00
glEnd ( ) ;
2023-12-03 00:15:18 -05:00
if ( m_selectedOption = = 0 ) {
glColor4f ( 0.5f , 1.0f , 0.0f , 1.0f ) ;
2023-10-02 15:55:45 -04:00
}
2023-12-03 00:15:18 -05:00
m_textureOptAudio . Bind ( ) ;
glBegin ( GL_QUADS ) ;
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.35 , centerY + Height ( ) * 0.2 ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.2 , centerY + Height ( ) * 0.2 ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.2 , centerY + Height ( ) * 0.25 ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.35 , centerY + Height ( ) * 0.25 ) ;
glEnd ( ) ;
2023-10-25 01:01:25 -04:00
2023-12-03 00:15:18 -05:00
glColor4f ( 1.0f , 0.0f , 1.0f , 1.0f ) ;
if ( m_selectedOption = = 1 ) {
glColor4f ( 0.5f , 1.0f , 0.0f , 1.0f ) ;
2023-09-15 20:28:20 -04:00
}
2023-12-03 00:15:18 -05:00
m_textureOptGraphics . Bind ( ) ;
2023-10-25 01:01:25 -04:00
glBegin ( GL_QUADS ) ;
2023-12-03 00:15:18 -05:00
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.4 , centerY + Height ( ) * 0.05 ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.2 , centerY + Height ( ) * 0.05 ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.2 , centerY + Height ( ) * 0.1 ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.4 , centerY + Height ( ) * 0.1 ) ;
2023-10-25 01:01:25 -04:00
glEnd ( ) ;
2023-12-03 00:15:18 -05:00
glColor4f ( 1.0f , 0.0f , 1.0f , 1.0f ) ;
if ( m_selectedOption = = 2 ) {
glColor4f ( 0.5f , 1.0f , 0.0f , 1.0f ) ;
2023-09-16 00:12:14 -04:00
}
2023-12-03 00:15:18 -05:00
m_textureOptGameplay . Bind ( ) ;
2023-10-29 15:39:29 -04:00
glBegin ( GL_QUADS ) ;
2023-12-03 00:15:18 -05:00
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.375 , centerY - Height ( ) * 0.1 ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.2 , centerY - Height ( ) * 0.1 ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.2 , centerY - Height ( ) * 0.05 ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.375 , centerY - Height ( ) * 0.05 ) ;
2023-10-29 15:39:29 -04:00
glEnd ( ) ;
2023-10-25 01:01:25 -04:00
2023-12-03 00:15:18 -05:00
// Séparateur
glColor4f ( 0.0f , 0.0f , 0.0f , 1.0f ) ;
2023-10-29 15:39:29 -04:00
glBindTexture ( GL_TEXTURE_2D , 0 ) ;
2023-10-25 01:01:25 -04:00
glBegin ( GL_QUADS ) ;
2023-12-03 00:15:18 -05:00
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.175 , centerY - Height ( ) * 0.1 ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.18 , centerY - Height ( ) * 0.1 ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.18 , centerY + Height ( ) * 0.25 ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.175 , centerY + Height ( ) * 0.25 ) ;
2023-10-25 01:01:25 -04:00
glEnd ( ) ;
2023-12-03 00:15:18 -05:00
glColor4f ( 1.0f , 0.0f , 1.0f , 1.0f ) ;
m_textureOptBack . Bind ( ) ;
2023-10-29 15:39:29 -04:00
glBegin ( GL_QUADS ) ;
2023-12-03 00:15:18 -05:00
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.075 , centerY - Height ( ) * 0.25 ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( centerX + Width ( ) * 0.075 , centerY - Height ( ) * 0.25 ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( centerX + Width ( ) * 0.075 , centerY - Height ( ) * 0.2 ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.075 , centerY - Height ( ) * 0.2 ) ;
2023-10-25 01:01:25 -04:00
glEnd ( ) ;
2023-10-25 02:06:29 -04:00
glColor4f ( 1.0f , 1.0f , 1.0f , 1.0f ) ;
2023-10-23 16:11:35 -04:00
2023-12-03 00:15:18 -05:00
if ( m_selectedOption = = 0 ) {
DisplayAudioMenu ( centerX , centerY ) ;
}
else if ( m_selectedOption = = 1 ) {
DisplayGraphicsMenu ( centerX , centerY ) ;
}
else if ( m_selectedOption = = 2 ) {
DisplayGameplayMenu ( centerX , centerY ) ;
2023-09-15 20:28:20 -04:00
}
2023-09-15 11:24:43 -04:00
2023-10-31 11:11:14 -04:00
glViewport ( viewport [ 0 ] , viewport [ 1 ] , viewport [ 2 ] , viewport [ 3 ] ) ;
2023-10-23 16:11:35 -04:00
glEnable ( GL_STENCIL_TEST ) ;
glEnable ( GL_DEPTH_TEST ) ;
2023-09-16 00:12:14 -04:00
2023-10-23 16:11:35 -04:00
glMatrixMode ( GL_PROJECTION ) ;
glPopMatrix ( ) ;
glMatrixMode ( GL_MODELVIEW ) ;
glPopMatrix ( ) ;
2023-09-15 20:28:20 -04:00
}
2023-12-03 00:15:18 -05:00
void Engine : : DisplayAudioMenu ( float centerX , float centerY ) {
float minBar = centerX - Width ( ) * 0.15 ;
float maxBar = centerX + Width ( ) * 0.3 ;
float percentPosX = centerX + Width ( ) * 0.31f ;
2023-09-16 00:12:14 -04:00
2023-12-03 00:15:18 -05:00
glColor4f ( 1.0f , 1.0f , 0.0f , 1.0f ) ;
m_textureOptMain . Bind ( ) ;
glBegin ( GL_QUADS ) ;
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.15 , centerY + Height ( ) * 0.215 ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.075 , centerY + Height ( ) * 0.215 ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.075 , centerY + Height ( ) * 0.25 ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.15 , centerY + Height ( ) * 0.25 ) ;
glEnd ( ) ;
2023-09-16 00:12:14 -04:00
2023-12-03 00:15:18 -05:00
float principalBottom = centerY + Height ( ) * 0.165f ;
float principalTop = centerY + Height ( ) * 0.2f ;
2023-09-15 11:24:43 -04:00
2023-12-03 00:15:18 -05:00
DrawSliderBackground ( centerX , centerY , minBar , maxBar , principalBottom , principalTop ) ;
DrawSlider ( centerX , centerY , m_volPrincipal , minBar , maxBar , principalBottom , principalTop ) ;
DisplayBarPercentValue ( centerX , centerY , percentPosX , principalBottom , minBar , maxBar , m_volPrincipal ) ;
2023-09-16 00:12:14 -04:00
2023-10-16 17:36:04 -04:00
glEnable ( GL_BLEND ) ;
2023-12-03 00:15:18 -05:00
glBlendFunc ( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ) ;
glBlendEquation ( GL_FUNC_ADD ) ;
2023-09-16 00:12:14 -04:00
2023-12-03 00:15:18 -05:00
glColor4f ( 1.0f , 1.0f , 0.0f , 1.0f ) ;
m_textureOptMusic . Bind ( ) ;
glBegin ( GL_QUADS ) ;
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.15 , centerY + Height ( ) * 0.09 ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.05 , centerY + Height ( ) * 0.09 ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.05 , centerY + Height ( ) * 0.125 ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.15 , centerY + Height ( ) * 0.125 ) ;
glEnd ( ) ;
2023-09-16 00:12:14 -04:00
2023-12-03 00:15:18 -05:00
float musiqueBottom = centerY + Height ( ) * 0.04f ;
float musiqueTop = centerY + Height ( ) * 0.075f ;
2023-09-16 00:12:14 -04:00
2023-12-03 00:15:18 -05:00
DrawSliderBackground ( centerX , centerY , minBar , maxBar , musiqueBottom , musiqueTop ) ;
DrawSlider ( centerX , centerY , m_volMusique , minBar , maxBar , musiqueBottom , musiqueTop ) ;
DisplayBarPercentValue ( centerX , centerY , percentPosX , musiqueBottom , minBar , maxBar , m_volMusique ) ;
2023-09-15 20:28:20 -04:00
2023-12-03 00:15:18 -05:00
glEnable ( GL_BLEND ) ;
glBlendFunc ( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ) ;
glBlendEquation ( GL_FUNC_ADD ) ;
2023-10-23 16:11:35 -04:00
2023-12-03 00:15:18 -05:00
glColor4f ( 1.0f , 1.0f , 0.0f , 1.0f ) ;
m_textureOptSfx . Bind ( ) ;
glBegin ( GL_QUADS ) ;
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.15 , centerY - Height ( ) * 0.035 ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.075 , centerY - Height ( ) * 0.035 ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.075 , centerY - Height ( ) * 0.00001 ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.15 , centerY - Height ( ) * 0.00001 ) ;
glEnd ( ) ;
2023-10-02 15:55:45 -04:00
2023-12-03 00:15:18 -05:00
float effectsBottom = centerY - Height ( ) * 0.085f ;
float effectsTop = centerY - Height ( ) * 0.05f ;
2023-09-15 20:28:20 -04:00
2023-12-03 00:15:18 -05:00
DrawSliderBackground ( centerX , centerY , minBar , maxBar , effectsBottom , effectsTop ) ;
DrawSlider ( centerX , centerY , m_volEffets , minBar , maxBar , effectsBottom , effectsTop ) ;
DisplayBarPercentValue ( centerX , centerY , percentPosX , effectsBottom , minBar , maxBar , m_volEffets ) ;
2023-09-16 00:12:14 -04:00
2023-12-03 00:15:18 -05:00
glColor4f ( 1.0f , 1.0f , 1.0f , 1.0f ) ;
}
2023-09-15 11:24:43 -04:00
2023-12-03 00:15:18 -05:00
void Engine : : DisplayGraphicsMenu ( float centerX , float centerY ) {
glColor4f ( 1.0f , 1.0f , 0.0f , 1.0f ) ;
m_textureOptResolution . Bind ( ) ;
glBegin ( GL_QUADS ) ;
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.15 , centerY + Height ( ) * 0.215 ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( centerX , centerY + Height ( ) * 0.215 ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( centerX , centerY + Height ( ) * 0.25 ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.15 , centerY + Height ( ) * 0.25 ) ;
glEnd ( ) ;
2023-09-16 00:12:14 -04:00
2023-12-03 00:15:18 -05:00
glColor4f ( 1.0f , 1.0f , 1.0f , 0.5f ) ;
glBindTexture ( GL_TEXTURE_2D , 0 ) ;
glBegin ( GL_QUADS ) ;
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.16 , centerY + Height ( ) * 0.165 ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( centerX + Width ( ) * 0.1 , centerY + Height ( ) * 0.165 ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( centerX + Width ( ) * 0.1 , centerY - Height ( ) * 0.04 ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.16 , centerY - Height ( ) * 0.04 ) ;
glEnd ( ) ;
2023-09-16 00:12:14 -04:00
2023-12-03 00:15:18 -05:00
glColor4f ( 0.0f , 0.0f , 0.0f , 1.0f ) ;
m_textureHd . Bind ( ) ;
glBegin ( GL_QUADS ) ;
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.15 , centerY + Height ( ) * 0.125 ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( centerX + Width ( ) * 0.05 , centerY + Height ( ) * 0.125 ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( centerX + Width ( ) * 0.05 , centerY + Height ( ) * 0.15 ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.15 , centerY + Height ( ) * 0.15 ) ;
glEnd ( ) ;
2023-09-16 00:12:14 -04:00
2023-12-03 00:15:18 -05:00
m_textureFhd . Bind ( ) ;
glBegin ( GL_QUADS ) ;
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.15 , centerY + Height ( ) * 0.075 ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( centerX , centerY + Height ( ) * 0.075 ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( centerX , centerY + Height ( ) * 0.1 ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.15 , centerY + Height ( ) * 0.1 ) ;
glEnd ( ) ;
2021-10-26 17:28:37 -04:00
2023-12-03 00:15:18 -05:00
m_textureQhd . Bind ( ) ;
glBegin ( GL_QUADS ) ;
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.15 , centerY + Height ( ) * 0.025 ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( centerX , centerY + Height ( ) * 0.025 ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( centerX , centerY + Height ( ) * 0.05 ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.15 , centerY + Height ( ) * 0.05 ) ;
glEnd ( ) ;
2023-10-15 23:36:26 -04:00
2023-12-03 00:15:18 -05:00
m_textureUhd . Bind ( ) ;
glBegin ( GL_QUADS ) ;
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.15 , centerY - Height ( ) * 0.025 ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( centerX + Width ( ) * 0.015 , centerY - Height ( ) * 0.025 ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( centerX + Width ( ) * 0.015 , centerY ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.15 , centerY ) ;
glEnd ( ) ;
2023-10-15 23:36:26 -04:00
2023-12-03 00:15:18 -05:00
glColor4f ( 1.0f , 1.0f , 1.0f , 1.0f ) ;
2023-10-15 23:36:26 -04:00
2023-12-03 00:15:18 -05:00
float heightRatioBottom = 0.125f ;
float heightRatioTop = 0.15 ;
2023-09-16 00:12:14 -04:00
2023-12-03 00:15:18 -05:00
// Checkboxes
for ( int i = 0 ; i < 4 ; i + + ) {
if ( static_cast < int > ( m_resolution ) = = i ) {
m_textureChecked . Bind ( ) ;
2021-12-07 18:59:50 -05:00
}
2023-12-03 00:15:18 -05:00
else {
m_textureCheck . Bind ( ) ;
2023-10-16 12:02:37 -04:00
}
2023-09-16 00:12:14 -04:00
2021-10-26 17:28:37 -04:00
glBegin ( GL_QUADS ) ;
2023-12-03 00:15:18 -05:00
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( centerX + Width ( ) * 0.075 , centerY + Height ( ) * heightRatioBottom ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( centerX + Width ( ) * 0.09 , centerY + Height ( ) * heightRatioBottom ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( centerX + Width ( ) * 0.09 , centerY + Height ( ) * heightRatioTop ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( centerX + Width ( ) * 0.075 , centerY + Height ( ) * heightRatioTop ) ;
2021-10-26 17:28:37 -04:00
glEnd ( ) ;
2023-09-15 11:24:43 -04:00
2023-12-03 00:15:18 -05:00
heightRatioBottom - = 0.05f ;
heightRatioTop - = 0.05f ;
2021-10-26 17:28:37 -04:00
}
2023-10-18 09:33:56 -04:00
2023-12-03 00:15:18 -05:00
glColor4f ( 1.0f , 1.0f , 1.0f , 1.0f ) ;
2023-09-23 17:15:35 -04:00
}
2021-10-26 17:28:37 -04:00
void Engine : : Render ( float elapsedTime ) {
2021-12-06 09:45:51 -05:00
glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT ) ;
2021-09-27 10:20:58 -04:00
2023-12-04 13:02:28 -05:00
if ( m_gamestate = = GameState : : SPLASH ) {
if ( m_splashTime > 0.0f ) {
DisplaySplashScreen ( ) ;
}
else {
m_gamestate = GameState : : MAIN_MENU ;
}
m_splashTime - = elapsedTime ;
return ;
}
if ( m_gamestate = = GameState : : MAIN_MENU ) {
DisplayMainMenu ( ) ;
return ;
}
if ( m_gamestate = = GameState : : OPTIONS ) {
DisplayOptionsMenu ( ) ;
return ;
}
if ( m_gamestate = = GameState : : PAUSE ) {
DisplayPauseMenu ( ) ;
return ;
2023-10-29 15:39:29 -04:00
}
2023-12-04 13:02:28 -05:00
if ( m_gamestate = = GameState : : PLAY ) {
2023-10-16 17:36:04 -04:00
HideCursor ( ) ;
2023-10-16 16:35:26 -04:00
CenterMouse ( ) ; //D<> placement de centermouse dans l'action de jouer
2021-09-27 10:20:58 -04:00
2023-10-16 16:35:26 -04:00
static irrklang : : ISound * step ; // Pour les sons de pas.
2023-10-16 17:36:04 -04:00
static float pollTime = 0 ;
2023-10-02 17:09:03 -04:00
static float bulletTime = 0 ;
static BlockType bloc = 1 ;
2022-04-02 15:26:55 -04:00
2023-10-02 17:09:03 -04:00
if ( elapsedTime > 0.1f ) return ;
2021-11-19 13:25:52 -05:00
2023-10-02 17:09:03 -04:00
pollTime + = elapsedTime ;
2023-09-15 11:24:43 -04:00
2023-10-02 17:09:03 -04:00
Transformation all ;
Transformation skybox ;
2023-11-18 14:16:24 -05:00
Transformation remotePlayer ;
2023-10-16 17:36:04 -04:00
Vector3f vstep ;
2021-12-06 21:46:46 -05:00
2023-10-02 17:09:03 -04:00
// Transformations initiales
glMatrixMode ( GL_MODELVIEW ) ;
glLoadIdentity ( ) ;
2021-12-07 18:59:50 -05:00
2023-10-02 17:09:03 -04:00
if ( bulletTime > 0.f ) bulletTime - = elapsedTime ;
if ( bulletTime < 0.f ) bulletTime = 0.f ;
2022-04-02 15:26:55 -04:00
2023-10-16 17:36:04 -04:00
static bool leftright = false ;
if ( pollTime > = .005f ) {
Player : : Sound snd = 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 ) ;
switch ( snd ) {
case Player : : Sound : : STEP :
if ( leftright )
vstep = Vector3f ( m_player . GetPosition ( ) . x + m_player . GetDirection ( ) . z , m_player . GetPosition ( ) . y - 1.7f , m_player . GetPosition ( ) . z + m_player . GetDirection ( ) . x ) ;
else vstep = Vector3f ( m_player . GetPosition ( ) . x - m_player . GetDirection ( ) . z , m_player . GetPosition ( ) . y - 1.7f , m_player . GetPosition ( ) . z - m_player . GetDirection ( ) . x ) ;
2023-10-30 15:36:43 -04:00
m_audio . Create3DAudioObj ( step , AUDIO_PATH " step.wav " , vstep , m_player . GetVelocity ( ) , false , .8f ) ;
2023-10-16 17:36:04 -04:00
leftright = ! leftright ;
break ;
case Player : : Sound : : FALL :
2023-10-30 15:36:43 -04:00
m_audio . Create3DAudioObj ( step , AUDIO_PATH " hit.wav " , m_player . GetPosition ( ) , m_player . GetVelocity ( ) , false , 1.f ) ;
2023-10-16 17:36:04 -04:00
break ;
default : break ;
2021-12-07 18:59:50 -05:00
}
2023-10-18 09:33:56 -04:00
m_audio . Update3DAudio ( m_player . GetPOV ( ) , m_player . GetDirection ( ) , m_player . GetVelocity ( ) ) ; // Ajustement du positionnement 3D avec les coordonnees du joueur et
// son vecteur de velocite (pour l'effet Doppler)
2023-10-16 17:36:04 -04:00
pollTime = 0 ;
2023-10-02 17:09:03 -04:00
}
2021-11-19 13:25:52 -05:00
2023-10-02 17:09:03 -04:00
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!).
2023-12-04 13:02:28 -05:00
2023-11-19 16:46:13 -05:00
m_player . ApplyTransformation ( remotePlayer , true , false ) ;
2023-10-02 17:09:03 -04:00
2023-11-20 16:02:45 -05:00
m_mouseWU = m_mouseWD = m_key1 = m_key2 = false ;
2023-12-05 13:44:54 -05:00
netprot : : ChunkMod * cmod = nullptr ;
2023-10-16 17:36:04 -04:00
if ( m_mouseL ) {
2023-12-06 12:17:47 -05:00
if ( bulletTime < = 0.f ) {
2023-10-16 17:36:04 -04:00
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 . GetPOV ( ) + m_player . GetDirection ( ) , m_player . GetDirection ( ) ) ;
break ;
}
2023-10-27 13:27:00 -04:00
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.
2023-10-16 17:36:04 -04:00
m_bullets [ 0 ] - > ~ Bullet ( ) ;
m_bullets [ 0 ] = new Bullet ( m_player . GetPOV ( ) + m_player . GetDirection ( ) , m_player . GetDirection ( ) ) ;
}
2023-10-27 13:27:00 -04:00
bulletTime = BULLET_TIME ;
m_audio . Create3DAudioObj ( m_powpow , AUDIO_PATH " pow.wav " , m_player . GetPOV ( ) , m_player . GetDirection ( ) * 10 , false , .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 ;
}
2023-10-30 15:36:43 -04:00
}
2021-12-07 18:59:50 -05:00
}
2023-10-30 15:36:43 -04:00
else if ( m_mouseR )
2023-12-06 12:17:47 -05:00
cmod = m_world . ChangeBlockAtCursor ( BTYPE_METAL , m_player . GetPosition ( ) , m_player . GetDirection ( ) , m_block , m_networkgame ) ;
2023-10-30 15:36:43 -04:00
for ( int x = 0 ; x < MAX_BULLETS ; + + x ) { // Array de bullets en jeu.
if ( m_bullets [ x ] ) {
for ( int b = 0 ; b < BULLET_UPDATES_PER_FRAME ; + + b ) {
2023-12-05 13:44:54 -05:00
if ( m_bullets [ x ] - > Update ( & m_world , elapsedTime , BULLET_UPDATES_PER_FRAME , m_players , m_networkgame ? & m_chunkmod : nullptr ) ) {
2023-10-30 15:36:43 -04:00
m_bullets [ x ] - > ~ Bullet ( ) ;
if ( m_whoosh [ x ] )
m_whoosh [ x ] - > drop ( ) ;
m_bullets [ x ] = nullptr ;
m_whoosh [ x ] = nullptr ;
break ;
}
else if ( ! m_whoosh [ x ] ) {
m_whoosh [ x ] = m_audio . Create3DAudioObj ( m_whoosh [ x ] , AUDIO_PATH " noise.wav " , m_bullets [ x ] - > getPos ( ) , m_bullets [ x ] - > getVel ( ) , true , ( m_bullets [ x ] - > getPos ( ) - m_player . GetPosition ( ) ) . Length ( ) ) ;
}
else {
Vector3f pos = m_bullets [ x ] - > getPos ( ) , vel = m_bullets [ x ] - > getVel ( ) ;
m_audio . Render3DAudioObj ( m_whoosh [ x ] , pos , vel , 5 - ( m_bullets [ x ] - > getPos ( ) - m_player . GetPosition ( ) ) . Length ( ) ) ;
}
2023-10-27 12:23:45 -04:00
}
2023-10-27 13:27:00 -04:00
}
2023-10-16 12:02:37 -04:00
}
2021-12-07 18:59:50 -05:00
2023-10-16 17:36:04 -04:00
m_world . Update ( m_bullets , m_player . GetPosition ( ) , m_blockinfo ) ;
2023-10-27 14:08:06 -04:00
m_renderer . UpdateMesh ( & m_world , m_player . GetPosition ( ) , m_blockinfo ) ;
2023-11-20 16:27:19 -05:00
m_renderer . RenderWorld ( & m_world , m_renderCount , m_player . GetPosition ( ) , m_player . GetDirection ( ) , all , m_shader01 , m_textureAtlas ) ;
2021-11-26 11:59:02 -05:00
2023-10-16 17:36:04 -04:00
if ( m_isSkybox ) m_skybox . Render ( skybox ) ;
2023-10-02 17:09:03 -04:00
2023-10-27 14:53:45 -04:00
ProcessNotificationQueue ( ) ;
2023-12-04 13:02:28 -05:00
if ( m_damage ) {
2023-10-30 14:36:44 -04:00
InstantDamage ( ) ;
}
2023-12-07 12:10:47 -05:00
static bool died = false ;
2023-12-07 12:21:21 -05:00
if ( ( m_player . GetPosition ( ) . y < - 1.7f | | m_player . AmIDead ( ) ) & & ! died ) {
2023-10-30 15:36:43 -04:00
m_audio . Create3DAudioObj ( m_scream , AUDIO_PATH " scream.wav " , m_player . GetPOV ( ) , m_player . GetVelocity ( ) , false , 1.f ) ;
2023-12-07 12:10:47 -05:00
died = true ;
2023-10-16 17:36:04 -04:00
}
2023-12-07 12:32:36 -05:00
if ( m_player . GetPosition ( ) . y < - 21.f | | died ) {
2023-12-07 12:10:47 -05:00
died = false ;
std : : string user = m_player . m_username . append ( " (Dead) " ) ;
m_player = Player ( Vector3f ( .5 , CHUNK_SIZE_Y + 1.7f , .5 ) , 0 , 0 ) ;
m_player . m_username = user ;
}
m_time + = elapsedTime ;
2023-09-15 11:24:43 -04:00
2023-11-07 07:56:59 -05:00
if ( m_networkgame ) { // Pour se gerer le paquet.
2023-12-05 13:44:54 -05:00
static bool has_synced = false ;
2023-11-02 15:47:15 -04:00
using namespace std : : chrono ;
using namespace netprot ;
2023-11-07 07:56:59 -05:00
Timestamp tstamp = duration_cast < milliseconds > ( high_resolution_clock : : now ( ) - m_startTime ) . count ( ) ;
2023-12-05 13:44:54 -05:00
static Timestamp last = 0 ;
2023-11-02 15:47:15 -04:00
Input input ;
2023-11-07 07:56:59 -05:00
Sync sync ;
uint64_t id = m_conn . getId ( ) ;
2023-11-06 17:59:57 -05:00
static std : : vector < char * > lsPck ;
2023-12-05 06:25:48 -05:00
static int sync_acc = 0 , cmod_acc = 0 ;
2023-10-23 16:44:34 -04:00
2023-12-02 11:05:00 -05:00
if ( cmod )
m_chunkmod_manifest . emplace_back ( cmod ) ;
2023-11-27 16:12:12 -05:00
if ( last = = 0 )
last = tstamp ;
sync_acc + = tstamp - last ;
2023-12-05 06:25:48 -05:00
cmod_acc + = tstamp - last ;
2023-11-27 16:12:12 -05:00
if ( sync_acc > = 1000 ) {
2023-11-24 12:36:01 -05:00
sync_acc - = 1000 ;
2023-11-07 07:56:59 -05:00
sync . sid = id ;
sync . timestamp = tstamp ;
2023-12-05 13:44:54 -05:00
sync . position = m_player . GetPositionAbs ( ) ;
2023-11-07 07:56:59 -05:00
sync . hp = m_player . GetHP ( ) ;
2023-12-05 13:44:54 -05:00
if ( ! has_synced ) {
has_synced = true ;
sendPackTo < Sync > ( m_conn . m_sock_udp , & sync , & m_bufout , & m_conn . m_srvsockaddr ) ;
}
m_syncs [ sync . timestamp ] = sync ;
2023-11-07 07:56:59 -05:00
}
2023-10-23 16:44:34 -04:00
2023-12-05 06:25:48 -05:00
if ( cmod_acc > = 1000 ) {
2023-12-06 13:23:33 -05:00
while ( cmod_acc > = 1000 )
cmod_acc - = 1000 ;
2023-12-05 06:25:48 -05:00
if ( ! m_chunkmod_manifest . empty ( ) ) {
ChunkMod * cmod = m_chunkmod_manifest . front ( ) ;
m_chunkmod_manifest . pop_front ( ) ;
m_world . ChangeBlockAtPosition ( cmod - > old_b_type , cmod - > pos ) ;
delete cmod ;
}
}
2023-11-07 07:56:59 -05:00
input . sid = id ;
2023-10-23 16:44:34 -04:00
input . direction = m_player . GetDirection ( ) ;
2023-11-07 07:56:59 -05:00
input . timestamp = tstamp ;
2023-10-23 16:44:34 -04:00
input . keys . forward = m_keyW ;
input . keys . backward = m_keyS ;
input . keys . left = m_keyA ;
input . keys . right = m_keyD ;
input . keys . jump = m_keySpace ;
input . keys . block = m_mouseR ;
input . keys . shoot = m_mouseL ;
2023-11-06 17:59:57 -05:00
sendPackTo < Input > ( m_conn . m_sock_udp , & input , & m_bufout , & m_conn . m_srvsockaddr ) ;
lsPck = recvPacks ( m_conn . m_sock_udp , & m_buf ) ;
2023-11-07 07:46:11 -05:00
char * prevptr = nullptr ;
for ( auto & pck : lsPck ) { // We could make a few threads out of this.
2023-12-06 11:16:39 -05:00
Sync sync ; Output out ; ChunkMod cmod ; BulletAdd bull ; Chat chat ;
2023-11-07 07:46:11 -05:00
if ( ! prevptr )
prevptr = m_buf . ptr ;
uint32_t bsize = m_buf . len - ( pck - prevptr ) ;
prevptr = pck ;
switch ( getType ( pck , 1 ) ) {
using enum PACKET_TYPE ;
2023-11-06 17:59:57 -05:00
case SYNC :
2023-11-07 07:46:11 -05:00
if ( Deserialize ( & sync , pck , & bsize ) ) {
2023-12-05 13:44:54 -05:00
if ( sync . sid ! = m_conn . getId ( ) ) {
2023-12-06 11:16:39 -05:00
SystemNotification ( " syncsid be no good. " ) ;
2023-11-07 07:46:11 -05:00
break ;
2023-12-05 13:44:54 -05:00
}
if ( m_syncs . count ( sync . timestamp ) ) {
Sync comp = m_syncs [ sync . timestamp ] ;
2023-12-06 14:31:05 -05:00
2023-12-07 12:15:57 -05:00
//m_player.InflictDamage(sync.hp - comp.hp);
2023-12-05 13:44:54 -05:00
Vector3f diff = sync . position - comp . position ;
2023-12-05 14:25:21 -05:00
2023-12-05 13:44:54 -05:00
if ( diff . y < 1. )
diff . y = 0 ;
if ( diff . Length ( ) > 1.5 ) {
diff . Normalize ( ) ;
m_player . Move ( - diff ) ;
}
2023-12-06 11:16:39 -05:00
m_countdown = sync . timer ;
2023-12-05 13:44:54 -05:00
m_syncs . erase ( sync . timestamp ) ;
}
2023-11-07 07:46:11 -05:00
}
2023-11-06 17:59:57 -05:00
break ;
case OUTPUT :
2023-11-07 07:46:11 -05:00
if ( Deserialize ( & out , pck , & bsize ) ) {
2023-12-05 13:44:54 -05:00
if ( ! m_players . contains ( out . id ) ) {
2023-12-06 11:16:39 -05:00
SystemNotification ( std : : to_string ( out . id ) . append ( " is id no good. " ) ) ;
2023-12-05 13:44:54 -05:00
break ;
}
RemotePlayer * rt = static_cast < RemotePlayer * > ( m_players [ out . id ] ) ;
rt - > Feed ( out ) ;
2023-12-07 12:32:36 -05:00
if ( rt - > AmIDead ( ) ) {
m_audio . Create3DAudioObj ( m_scream , AUDIO_PATH " scream.wav " , m_player . GetPOV ( ) , m_player . GetVelocity ( ) , false , 1.f ) ;
}
2023-11-07 07:46:11 -05:00
}
2023-11-06 17:59:57 -05:00
break ;
2023-12-05 06:25:48 -05:00
case CHUNKMOD :
if ( Deserialize ( & cmod , pck , & bsize ) ) {
if ( ! std : : erase_if ( m_chunkmod_manifest , // Efface le chunkmod du manifeste s'il est dedans et reset le countdown, sinon fait la modification.
[ cmod ] ( ChunkMod * c ) {
return cmod . pos = = c - > pos & &
cmod . b_type = = c - > b_type & &
cmod . old_b_type = = c - > old_b_type ;
} ) )
m_world . ChangeBlockAtPosition ( cmod . b_type , cmod . pos ) ;
else cmod_acc = 0 ;
}
2023-12-06 11:16:39 -05:00
else SystemNotification ( " cmod iznogoud. " ) ;
2023-12-05 06:25:48 -05:00
break ;
case BULLET :
if ( Deserialize ( & bull , pck , & bsize ) ) {
2023-12-06 11:16:39 -05:00
Bullet * bult = new Bullet ( bull . pos , bull . dir ) ;
2023-12-05 06:25:48 -05:00
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 ] = bult ;
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 ] = bult ;
2023-12-06 16:36:21 -05:00
break ;
2023-12-05 06:25:48 -05:00
}
m_audio . Create3DAudioObj ( m_powpow , AUDIO_PATH " pow.wav " , bull . pos , bull . dir * 10 , false , .5f ) ;
}
2023-12-06 11:16:39 -05:00
else SystemNotification ( " Bullet is kraput. " ) ;
break ;
case CHAT :
if ( Deserialize ( & chat , pck , & bsize ) )
SystemNotification ( chat . mess ) ;
else SystemNotification ( " Chat iznogoud. " ) ;
2023-12-05 06:25:48 -05:00
break ;
2023-11-06 17:59:57 -05:00
default :
2023-12-06 11:16:39 -05:00
SystemNotification ( " packet be no good. " ) ;
2023-11-06 17:59:57 -05:00
break ;
}
}
lsPck . clear ( ) ;
2023-12-05 13:44:54 -05:00
2023-12-06 11:16:39 -05:00
2023-12-05 13:44:54 -05:00
glDisable ( GL_CULL_FACE ) ;
for ( auto & [ key , player ] : m_players ) {
RemotePlayer * rt = static_cast < RemotePlayer * > ( player ) ;
glClear ( GL_STENCIL_BUFFER_BIT ) ;
2023-12-02 15:19:46 -05:00
rt - > Render ( m_animeAtlas , m_shader01 , all , elapsedTime , m_player ) ;
2023-12-05 13:44:54 -05:00
}
glEnable ( GL_CULL_FACE ) ;
2023-10-23 16:44:34 -04:00
}
2023-12-07 12:10:47 -05:00
else {
if ( m_resetcountdown ) {
m_nbReductionChunk = 4 ;
m_timerReductionChunk = 30 ;
m_countdown = m_time + COUNTDOWN ;
m_resetcountdown = false ;
}
if ( ! m_stopcountdown )
m_countdown - = ( int ) m_time ;
}
2023-12-05 13:44:54 -05:00
2023-12-06 14:31:05 -05:00
DrawHud ( elapsedTime , bloc ) ;
DisplayPovGun ( ) ;
2021-12-07 18:59:50 -05:00
}
2023-12-04 13:02:28 -05:00
}
2023-12-03 00:15:18 -05:00
void Engine : : DisplayGameplayMenu ( float centerX , float centerY ) {
float minBar = centerX - Width ( ) * 0.15 ;
float maxBar = centerX + Width ( ) * 0.3 ;
float percentPosX = centerX + Width ( ) * 0.31f ;
2021-11-26 11:59:02 -05:00
2023-12-03 00:15:18 -05:00
glColor4f ( 1.0f , 1.0f , 0.0f , 1.0f ) ;
m_textureOptSensitivity . Bind ( ) ;
glBegin ( GL_QUADS ) ;
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( centerX - Width ( ) * 0.15 , centerY + Height ( ) * 0.215 ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( centerX , centerY + Height ( ) * 0.215 ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( centerX , centerY + Height ( ) * 0.25 ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( centerX - Width ( ) * 0.15 , centerY + Height ( ) * 0.25 ) ;
glEnd ( ) ;
2021-11-26 11:59:02 -05:00
2023-12-03 00:15:18 -05:00
float sensibleBottom = centerY + Height ( ) * 0.165f ;
float sensibleTop = centerY + Height ( ) * 0.2f ;
2023-10-02 17:09:03 -04:00
2023-12-03 00:15:18 -05:00
DrawSliderBackground ( centerX , centerY , minBar , maxBar , sensibleBottom , sensibleTop ) ;
DrawSlider ( centerX , centerY , m_volSensible , minBar , maxBar , sensibleBottom , sensibleTop ) ;
DisplayBarPercentValue ( centerX , centerY , percentPosX , sensibleBottom , minBar , maxBar , m_volSensible ) ;
2023-09-15 11:24:43 -04:00
2023-12-03 00:15:18 -05:00
glColor4f ( 1.0f , 1.0f , 1.0f , 1.0f ) ;
}
2023-10-23 16:44:34 -04:00
2023-12-03 00:15:18 -05:00
void Engine : : DrawSliderBackground ( float centerX , float centerY , float minVal , float maxVal , float bottomSideValue , float topSideValue ) {
glColor4f ( 0.0f , 0.0f , 0.0f , 1.0f ) ;
glBindTexture ( GL_TEXTURE_2D , 0 ) ;
glBegin ( GL_QUADS ) ;
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( minVal , bottomSideValue ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( maxVal , bottomSideValue ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( maxVal , topSideValue ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( minVal , topSideValue ) ;
glEnd ( ) ;
}
2023-10-23 16:44:34 -04:00
2023-12-03 00:15:18 -05:00
void Engine : : DisplayBarPercentValue ( float centerX , float centerY , float posX , float posY , float minVal , float maxVal , float value ) {
glEnable ( GL_BLEND ) ;
glBlendFunc ( GL_SRC_ALPHA , GL_ONE ) ;
2023-10-23 16:44:34 -04:00
2023-12-03 00:15:18 -05:00
float percentage = ( value / ( maxVal - minVal ) ) * 100 ;
2023-11-06 17:59:57 -05:00
2023-12-03 00:15:18 -05:00
if ( percentage < 0.0f ) {
percentage = 0.0f ;
2021-12-07 18:59:50 -05:00
}
2023-12-03 00:15:18 -05:00
else if ( percentage > 100.0f ) {
percentage = 100.0f ;
}
m_textureFont . Bind ( ) ;
std : : ostringstream ss ;
ss . str ( " " ) ;
ss < < std : : fixed < < std : : setprecision ( 2 ) ;
ss < < percentage < < " % " ;
glColor4f ( 1.0f , 1.0f , 1.0f , 1.0f ) ;
PrintText ( posX , posY , ss . str ( ) , 2.0f ) ;
glDisable ( GL_BLEND ) ;
}
void Engine : : DrawSlider ( float centerX , float centerY , float value , float minVal , float maxVal , float bottomSideValue , float topSideValue ) {
if ( value < 0.0f ) {
value = 0.0f ;
2021-12-07 18:59:50 -05:00
}
2023-12-03 00:15:18 -05:00
else if ( value > ( maxVal - minVal ) ) {
value = ( maxVal - minVal ) ;
}
if ( value > = 0.0f & & value < = ( maxVal - minVal ) ) {
glColor4f ( 0.0f , 1.0f , 0.0f , 1.0f ) ;
glBegin ( GL_QUADS ) ;
glTexCoord2f ( 0 , 0 ) ; glVertex2i ( minVal , bottomSideValue ) ;
glTexCoord2f ( 1 , 0 ) ; glVertex2i ( minVal + value , bottomSideValue ) ;
glTexCoord2f ( 1 , 1 ) ; glVertex2i ( minVal + value , topSideValue ) ;
glTexCoord2f ( 0 , 1 ) ; glVertex2i ( minVal , topSideValue ) ;
glEnd ( ) ;
2021-12-07 18:59:50 -05:00
}
2021-09-24 10:15:43 -04:00
}
2023-12-03 00:15:18 -05:00
2021-12-02 18:12:35 -05:00
void Engine : : KeyPressEvent ( unsigned char key ) {
2021-10-11 11:37:58 -04:00
switch ( key ) {
2023-09-15 11:24:43 -04:00
case 0 : // A - Gauche
2021-09-27 10:20:58 -04:00
if ( ! m_keyA ) {
m_keyA = true ;
}
break ;
2023-09-15 11:24:43 -04:00
case 3 : // D - Droite
if ( ! m_keyD ) {
m_keyD = true ;
}
break ;
case 18 : // S - Reculer
2021-09-27 10:20:58 -04:00
if ( ! m_keyS ) {
m_keyS = true ;
}
break ;
2023-09-15 11:24:43 -04:00
case 22 : // W - Avancer
if ( ! m_keyW ) {
m_keyW = true ;
2021-09-27 10:20:58 -04:00
}
break ;
2023-09-15 11:24:43 -04:00
case 36 : // ESC - Quitter
2023-12-06 11:16:39 -05:00
if ( m_networkgame )
2023-12-06 12:08:44 -05:00
Stop ( ) ;
2023-12-03 00:15:18 -05:00
if ( m_gamestate = = GameState : : PLAY ) {
2023-10-30 15:49:17 -04:00
m_gamestate = GameState : : PAUSE ;
}
2023-12-03 00:15:18 -05:00
else if ( m_gamestate = = GameState : : PAUSE ) {
2023-10-30 15:49:17 -04:00
m_gamestate = GameState : : PLAY ;
}
2023-10-16 17:36:04 -04:00
//Stop();
2021-10-04 12:29:10 -04:00
break ;
2023-09-15 11:24:43 -04:00
case 57 : // Space - Sauter
2021-10-01 10:52:33 -04:00
if ( ! m_keySpace ) {
m_keySpace = true ;
}
break ;
2023-10-16 16:35:26 -04:00
case 94 : // F10 - Plein <20> cran
2023-09-16 21:38:58 -04:00
IsFullscreen ( ) ? SetFullscreen ( false ) : SetFullscreen ( true ) ;
//SetFullscreen(!IsFullscreen());
2023-09-15 11:24:43 -04:00
break ;
2023-09-15 20:28:20 -04:00
case 2 : // C - Ignorer
break ;
2021-12-07 18:59:50 -05:00
case 5 : // F - Ignorer
2023-09-15 11:24:43 -04:00
break ;
2023-10-02 15:55:45 -04:00
case 10 : // K - Debugging DisplayNotification()
m_keyK = true ;
2023-10-18 09:33:56 -04:00
m_messageNotification = " notifications systeme peuvent etre affichees " ;
2023-10-02 15:55:45 -04:00
break ;
case 11 : // L - Debugging DisplayNotification()
m_keyL = true ;
break ;
2023-09-23 17:15:35 -04:00
case 6 : // G - Ignorer
break ;
2021-10-19 10:27:59 -04:00
case 12 : // M - Ignorer
2023-09-15 11:24:43 -04:00
break ;
case 7 : // H - Ignorer
break ;
case 8 : // I - Ignorer
break ;
2023-10-23 15:43:55 -04:00
case 9 : // J - InstantDamage
m_damage = true ;
2023-10-16 12:02:37 -04:00
case 15 : // P - Ignorer
break ;
2021-11-26 11:59:02 -05:00
case 17 : // R - Ignorer
2021-09-27 10:20:58 -04:00
break ;
2023-09-23 17:15:35 -04:00
case 19 : // T - Ignorer
2023-10-23 16:11:35 -04:00
break ;
2023-09-15 11:24:43 -04:00
case 24 : // Y - Ignorer
break ;
2023-11-20 16:02:45 -05:00
case 27 : // 1
break ;
case 28 : // 2
break ;
2023-09-15 11:24:43 -04:00
case 255 : // Fn - Ignorer
break ;
2021-09-27 10:20:58 -04:00
default :
std : : cout < < " Unhandled key: " < < ( int ) key < < std : : endl ;
}
2021-09-24 10:15:43 -04:00
}
2021-12-02 18:12:35 -05:00
void Engine : : KeyReleaseEvent ( unsigned char key ) {
2021-10-11 11:37:58 -04:00
switch ( key ) {
2023-09-15 11:24:43 -04:00
case 0 : // A - Stop gauche
m_keyA = false ;
break ;
2023-09-15 20:28:20 -04:00
case 2 : // C - Toggle crosshair
m_displayCrosshair = ! m_displayCrosshair ;
break ;
2023-09-15 11:24:43 -04:00
case 3 : // D - Stop droite
m_keyD = false ;
break ;
case 5 : // F - Toggle flash
2021-12-07 18:59:50 -05:00
m_flash = ! m_flash ;
break ;
2023-09-23 17:15:35 -04:00
case 6 : // G - Toggle Stop Countdown
m_stopcountdown = ! m_stopcountdown ;
std : : cout < < " STOP COUNTDOWN " < < ( m_stopcountdown ? " enabled " : " disabled " ) < < std : : endl ;
break ;
2023-09-15 11:24:43 -04:00
case 7 : // H - Toggle HUD
m_displayHud = ! m_displayHud ;
std : : cout < < " DISPLAY HUD " < < ( m_displayHud ? " enabled " : " disabled " ) < < std : : endl ;
break ;
case 8 : // I - Toggle render data
2023-09-15 20:28:20 -04:00
m_displayInfo = ! m_displayInfo ;
std : : cout < < " DISPLAY INFO " < < ( m_displayInfo ? " enabled " : " disabled " ) < < std : : endl ;
2023-09-15 11:24:43 -04:00
break ;
2023-10-02 15:55:45 -04:00
case 10 : // K
m_keyK = false ;
break ;
case 11 : // L - Debugging DisplayNotification()
m_keyL = false ;
break ;
2023-09-15 11:24:43 -04:00
case 12 : // M - Toggle music
2021-10-25 10:50:08 -04:00
m_audio . ToggleMusicState ( ) ;
2021-10-19 10:27:59 -04:00
break ;
2023-10-16 12:02:37 -04:00
case 15 :
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 ] ) {
2023-10-30 15:36:43 -04:00
m_bullets [ x ] = new Bullet ( m_player . GetPOV ( ) - Vector3f ( 1.f , 0.f , 1.f ) , Vector3f ( 1.f , 0.f , 1.f ) ) ;
2023-10-16 12:02:37 -04:00
break ;
}
2023-10-16 17:43:32 -04:00
else if ( x = = MAX_BULLETS - 1 ) { // S'il y a pas d'espace dans l'array, prendre la place de la premi<6D> re balle de l'array.
2023-10-16 12:02:37 -04:00
m_bullets [ 0 ] - > ~ Bullet ( ) ;
m_bullets [ 0 ] = new Bullet ( m_player . GetPOV ( ) - Vector3f ( 1.f , 0.f , 1.f ) , Vector3f ( 1.f , 0.f , 1.f ) ) ;
}
break ;
2023-09-15 11:24:43 -04:00
case 17 : // R - Toggle skybox
2021-12-01 21:21:45 -05:00
m_isSkybox = ! m_isSkybox ;
2021-11-26 11:59:02 -05:00
break ;
2023-09-15 11:24:43 -04:00
case 18 : // S - Stop reculer
m_keyS = false ;
break ;
2023-09-23 17:15:35 -04:00
case 19 : // T -Reset countdown
m_resetcountdown = true ;
std : : cout < < " RESET COUNTDOWN " < < std : : endl ;
break ;
2023-09-15 11:24:43 -04:00
case 22 : // W - Stop avancer
m_keyW = false ;
break ;
case 24 : // Y - Wireframe
2021-09-27 10:20:58 -04:00
m_wireframe = ! m_wireframe ;
if ( m_wireframe )
glPolygonMode ( GL_FRONT_AND_BACK , GL_LINE ) ;
else
glPolygonMode ( GL_FRONT_AND_BACK , GL_FILL ) ;
break ;
2023-11-20 16:02:45 -05:00
case 27 : // 1
m_key1 = true ;
break ;
case 28 : // 2
m_key2 = true ;
break ;
2023-09-15 11:24:43 -04:00
case 57 : // Espace - Stop sauter
2021-10-01 10:52:33 -04:00
m_keySpace = false ;
break ;
2021-09-27 10:20:58 -04:00
}
2021-09-24 10:15:43 -04:00
}
2021-12-02 18:12:35 -05:00
void Engine : : MouseMoveEvent ( int x , int y ) {
2023-12-01 17:55:25 -05:00
if ( m_gamestate = = GameState : : PLAY ) {
m_player . TurnLeftRight ( x - ( Width ( ) / 2 ) ) ;
m_player . TurnTopBottom ( y - ( Height ( ) / 2 ) ) ;
// Centrer la souris seulement si elle n'est pas d<> j<EFBFBD> centr<74> e
// Il est n<> cessaire de faire la v<> rification pour <20> viter de tomber
// dans une boucle infinie o<> l'appel <20> CenterMouse g<> n<EFBFBD> re un
// MouseMoveEvent, qui rapelle CenterMouse qui rapelle un autre
// MouseMoveEvent, etc
if ( x = = ( Width ( ) / 2 ) & & y = = ( Height ( ) / 2 ) )
return ;
}
2023-12-03 00:15:18 -05:00
else if ( m_gamestate = = GameState : : MAIN_MENU ) {
DisplayMainMenu ( ) ;
}
2023-12-01 17:55:25 -05:00
else if ( m_gamestate = = GameState : : OPTIONS ) {
float centerX = Width ( ) * 0.5f ;
float centerY = Height ( ) * 0.5f ;
float leftBar = centerX - Width ( ) * 0.15f ;
float rightBar = centerX + Width ( ) * 0.3f ;
2021-09-27 10:20:58 -04:00
2023-12-03 00:15:18 -05:00
if ( m_selectedOption = = 0 & & m_selectedOptAudioMainBar ) {
2023-12-01 17:55:25 -05:00
m_volPrincipal = x - leftBar ;
}
2023-12-03 00:15:18 -05:00
else if ( m_selectedOption = = 0 & & m_selectedOptAudioMusicBar ) {
2023-12-01 17:55:25 -05:00
m_volMusique = x - leftBar ;
}
2023-12-03 00:15:18 -05:00
else if ( m_selectedOption = = 0 & & m_selectedOptAudioSfxBar ) {
2023-12-01 17:55:25 -05:00
m_volEffets = x - leftBar ;
}
2023-12-03 00:15:18 -05:00
else if ( m_selectedOption = = 2 & & m_selectedGameplaySensitivityBar ) {
2023-12-01 17:55:25 -05:00
m_volSensible = x - leftBar ;
}
}
2021-09-24 10:15:43 -04:00
}
2021-11-26 11:59:02 -05:00
void Engine : : MousePressEvent ( const MOUSE_BUTTON & button , int x , int y ) {
2023-10-02 17:09:03 -04:00
m_mousemx = x ;
m_mousemy = y ;
2023-12-03 00:15:18 -05:00
float centerX = Width ( ) * 0.5f ;
float centerY = Height ( ) * 0.5f ;
2023-10-02 17:09:03 -04:00
2023-12-03 00:15:18 -05:00
if ( m_gamestate = = GameState : : PLAY ) {
2023-10-02 17:09:03 -04:00
switch ( button ) {
case MOUSE_BUTTON_LEFT :
m_mouseL = true ;
break ;
case MOUSE_BUTTON_RIGHT :
m_mouseR = true ;
break ;
case MOUSE_BUTTON_MIDDLE :
m_mouseC = true ;
break ;
case MOUSE_BUTTON_WHEEL_UP :
m_mouseWU = true ;
break ;
case MOUSE_BUTTON_WHEEL_DOWN :
m_mouseWD = true ;
break ;
case MOUSE_BUTTON_NONE : break ;
}
}
2023-12-03 00:15:18 -05:00
else if ( m_gamestate = = GameState : : MAIN_MENU ) {
float leftButton = centerX + Width ( ) * 0.045f ;
float rightButton = centerX + Width ( ) * 0.4455f ;
float topFirst = centerY + Height ( ) * 0.073f ;
float bottomFirst = centerY ;
float topSecond = centerY + Height ( ) * 0.177f ;
float bottomSecond = centerY + Height ( ) * 0.105f ;
float topThird = centerY + Height ( ) * 0.275f ;
float bottomThird = centerY + Height ( ) * 0.198f ;
if ( x > leftButton & & x < rightButton & & y > bottomFirst & & y < topFirst ) {
if ( m_selectedPlayOptions ) {
m_gamestate = GameState : : PLAY ;
}
else {
m_selectedPlayOptions = true ;
}
}
else if ( x > leftButton & & x < rightButton & & y > bottomSecond & & y < topSecond ) {
if ( m_selectedPlayOptions ) {
m_gamestate = GameState : : PLAY ;
}
else {
m_gamestate = GameState : : OPTIONS ;
}
}
else if ( x > leftButton & & x < rightButton & & y > bottomThird & & y < topThird ) {
if ( m_selectedPlayOptions ) {
m_selectedPlayOptions = false ;
}
else {
m_gamestate = GameState : : QUIT ;
}
}
2021-11-26 11:59:02 -05:00
}
2023-12-01 09:49:00 -05:00
else if ( m_gamestate = = GameState : : OPTIONS ) {
2023-12-03 00:15:18 -05:00
float leftAudio = centerX - Width ( ) * 0.35f ;
float rightAudio = centerX - Width ( ) * 0.2f ;
float topAudio = ( Height ( ) * 0.25f ) + ( ( Height ( ) * 0.25f ) - ( Height ( ) * 0.2f ) ) ;
float bottomAudio = ( Height ( ) * 0.2f ) + ( ( Height ( ) * 0.25f ) - ( Height ( ) * 0.2f ) ) ;
2023-12-01 09:49:00 -05:00
float leftGraph = centerX - Width ( ) * 0.4f ;
float rightGraph = centerX - Width ( ) * 0.2f ;
float topGraph = centerY - Height ( ) * 0.05f ;
float bottomGraph = centerY - Height ( ) * 0.1f ;
float leftGameplay = centerX - Width ( ) * 0.375f ;
float rightGameplay = centerX - Width ( ) * 0.2f ;
float topGameplay = centerY + Height ( ) * 0.1f ;
float bottomGameplay = centerY + Height ( ) * 0.05f ;
2023-12-03 00:15:18 -05:00
float leftBack = centerX - Width ( ) * 0.075f ;
float rightBack = centerX + Width ( ) * 0.075f ;
float topBack = centerY + Height ( ) * 0.25f ;
float bottomBack = centerY + Height ( ) * 0.2f ;
2023-12-01 20:26:52 -05:00
2023-12-03 00:15:18 -05:00
if ( x > leftAudio & & x < rightAudio & & y > bottomAudio & & y < topAudio ) {
2023-12-01 09:49:00 -05:00
m_selectedOption = 0 ; // Volume
2023-10-29 15:39:29 -04:00
}
2023-12-01 09:49:00 -05:00
else if ( x > leftGraph & & x < rightGraph & & y > bottomGraph & & y < topGraph ) {
m_selectedOption = 1 ; // Graphics
}
else if ( x > leftGameplay & & x < rightGameplay & & y > bottomGameplay & & y < topGameplay ) {
m_selectedOption = 2 ; // Gameplay
}
2023-12-03 00:15:18 -05:00
else if ( x > leftBack & & x < rightBack & & y > bottomBack & & y < topBack ) {
2023-12-01 20:26:52 -05:00
m_gamestate = GameState : : MAIN_MENU ;
}
2023-12-01 13:48:48 -05:00
2023-12-03 00:15:18 -05:00
// Audio
2023-12-01 14:37:12 -05:00
float leftBar = centerX - Width ( ) * 0.15f ;
float rightBar = centerX + Width ( ) * 0.3f ;
float topBarPrincipal = centerY - Height ( ) * 0.165f ;
float bottomBarPrincipal = centerY - Height ( ) * 0.2f ;
float topBarMusique = centerY - Height ( ) * 0.0415f ;
float bottomBarMusique = centerY - Height ( ) * 0.075f ;
float topBarEffets = centerY + Height ( ) * 0.085f ;
float bottomBarEffets = centerY + Height ( ) * 0.05f ;
if ( m_selectedOption = = 0 & & x > leftBar & & x < rightBar & & y > bottomBarPrincipal & & y < topBarPrincipal ) {
2023-12-01 17:55:25 -05:00
m_volPrincipal = x - leftBar ;
2023-12-03 00:15:18 -05:00
m_selectedOptAudioMainBar = true ;
2023-12-01 14:37:12 -05:00
}
else if ( m_selectedOption = = 0 & & x > leftBar & & x < rightBar & & y > bottomBarMusique & & y < topBarMusique ) {
2023-12-01 17:55:25 -05:00
m_volMusique = x - leftBar ;
2023-12-03 00:15:18 -05:00
m_selectedOptAudioMusicBar = true ;
2023-12-01 14:37:12 -05:00
}
else if ( m_selectedOption = = 0 & & x > leftBar & & x < rightBar & & y > bottomBarEffets & & y < topBarEffets ) {
2023-12-01 17:55:25 -05:00
m_volEffets = x - leftBar ;
2023-12-03 00:15:18 -05:00
m_selectedOptAudioSfxBar = true ;
2023-12-01 14:37:12 -05:00
}
// Resolution
2023-12-01 13:48:48 -05:00
float leftChk = centerX + Width ( ) * 0.075f ;
float rightChk = centerX + Width ( ) * 0.09f ;
float topChkHD = centerY - Height ( ) * 0.125f ;
float bottomChkHD = centerY - Height ( ) * 0.155f ;
float topChkFHD = centerY - Height ( ) * 0.0725f ;
float bottomChkFHD = centerY - Height ( ) * 0.1f ;
float topChkQHD = centerY - Height ( ) * 0.025f ;
float bottomChkQHD = centerY - Height ( ) * 0.05f ;
float topChkUHD = centerY + Height ( ) * 0.025f ;
float bottomChkUHD = centerY ;
2023-12-01 14:37:12 -05:00
if ( m_selectedOption = = 1 & & leftChk & & x < rightChk & & y > bottomChkHD & & y < topChkHD ) {
2023-12-01 13:48:48 -05:00
m_resolution = HD ;
}
2023-12-01 14:37:12 -05:00
else if ( m_selectedOption = = 1 & & x > leftChk & & x < rightChk & & y > bottomChkFHD & & y < topChkFHD ) {
2023-12-01 13:48:48 -05:00
m_resolution = FHD ;
}
2023-12-01 14:37:12 -05:00
else if ( m_selectedOption = = 1 & & x > leftChk & & x < rightChk & & y > bottomChkQHD & & y < topChkQHD ) {
2023-12-01 13:48:48 -05:00
m_resolution = QHD ;
}
2023-12-01 14:37:12 -05:00
else if ( m_selectedOption = = 1 & & x > leftChk & & x < rightChk & & y > bottomChkUHD & & y < topChkUHD ) {
2023-12-01 13:48:48 -05:00
m_resolution = UHD ;
2023-12-01 09:49:00 -05:00
}
2023-12-01 14:37:12 -05:00
// Gameplay
if ( m_selectedOption = = 2 & & x > leftBar & & x < rightBar & & y > bottomBarPrincipal & & y < topBarPrincipal ) {
2023-12-01 15:46:08 -05:00
m_volSensible = x - leftBar ;
2023-12-03 00:15:18 -05:00
m_selectedGameplaySensitivityBar = true ;
2023-10-29 15:39:29 -04:00
}
}
2021-09-24 10:15:43 -04:00
}
2021-11-26 11:59:02 -05:00
void Engine : : MouseReleaseEvent ( const MOUSE_BUTTON & button , int x , int y ) {
switch ( button ) {
case MOUSE_BUTTON_LEFT :
m_mouseL = false ;
2021-11-27 13:35:39 -05:00
m_block = false ;
2023-12-03 00:15:18 -05:00
m_selectedOptAudioMainBar = false ;
m_selectedOptAudioMusicBar = false ;
m_selectedOptAudioSfxBar = false ;
m_selectedGameplaySensitivityBar = false ;
2021-11-26 11:59:02 -05:00
break ;
case MOUSE_BUTTON_RIGHT :
m_mouseR = false ;
2021-11-27 13:35:39 -05:00
m_block = false ;
2021-11-26 11:59:02 -05:00
break ;
case MOUSE_BUTTON_MIDDLE :
m_mouseC = false ;
break ;
case MOUSE_BUTTON_WHEEL_UP :
m_mouseWU = false ;
break ;
case MOUSE_BUTTON_WHEEL_DOWN :
m_mouseWD = false ;
break ;
case MOUSE_BUTTON_NONE : break ;
}
2021-09-24 10:15:43 -04:00
}
2023-09-16 00:12:14 -04:00
bool Engine : : LoadTexture ( Texture & texture , const std : : string & filename , bool useMipmaps , bool stopOnError ) {
texture . Load ( filename , useMipmaps ) ;
2023-09-15 11:24:43 -04:00
if ( ! texture . IsValid ( ) ) {
2021-09-27 10:20:58 -04:00
std : : cerr < < " Unable to load texture ( " < < filename < < " ) " < < std : : endl ;
if ( stopOnError )
Stop ( ) ;
2021-09-24 10:15:43 -04:00
2021-09-27 10:20:58 -04:00
return false ;
}
2021-09-24 10:15:43 -04:00
2021-09-27 10:20:58 -04:00
return true ;
2021-09-24 10:15:43 -04:00
}
2023-11-20 16:02:45 -05:00