Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

[DX 9.0] WATERBALL - JEU COMPLET EN DX9 (STYLE ARKANOÏD)


Information sur la source

Catégorie :DirectX Niveau : Expert Date de création : 27/07/2004 Date de mise à jour : 26/10/2004 17:06:29 Vu / téléchargé: 11 281 / 757

Note :
8,55 / 10 - par 11 personnes
8,55 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (43)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Salut a tous !

Je vous présente enfin notre projet qui nous a pris un tout petit peu plus d'un an à développer.
Ce jeu est un remake du célèbre casse-brique arkanoïd à la différence que les bonus sont légions, les briques multiples

Vous trouverez ici le code de main.cpp, fichier principal.
Dans le zip, vous trouverez la version 1.0 de Waterball et tous les fichiers C++ sauf ceux de CResManager et la partie permettant de décrypter le pass des skins (et oui, jeu avec 4 skins !).

Le projet contient :

CCustomSprites.h & cpp => Deux fichiers regroupant toutes les classes des sprites. Ces classes sont toutes dérivées de CSprites.

CDXList & CDXTableList => Le premier est une liste simplement chainée assez performante avec deux modes d'iterations : par tete et global. CDXTableList est une version statique de CDXList : quand on a crée une liste chainée et qu'elle est a présent statique, on la transforme en tableau pour aller plus vite

CGameManager.h & cpp => Regroupe CMenuManager et CLevelsManager : les deux classes maitresses du jeu

CInputManager.h & cpp => Contient la classe CInputManager permettant le controle de la souris et du clavier

CLogsManager.h & cpp => les logs

CMusicManager.h & cpp => Une classe optimisée contenant une liste chainée pour la liste des sons a jouer. Elle utilise DMusic.

CPrimitiveManager.h & cpp => Ce sont deux fichiers qui permettent le dessin de lignes et autres polygones simples et aléatoires (eclairs) avec DX9.

CRegmanager.h => Permet l'accés au registre. Contient un registre virtuel et réel

CSprites.h & Cpp => LA classe CSprites, maitresse

CTexManager.h & cpp => Un gestionnaire avancé de texture. Il est trés rapide et efficace.

def.h & cpp => toutes les definitions (#define, variables globales, etc)

DXUtils.h => les fonctions utiles telles que DXUtils_Timer ou encore PrintText

mleaks.h & cpp => une redefinition de new, delete, malloc, etc.... et une classe pour traquer trés efficacement tout memoryleak !!!!! (automatiquement inséré en mode debug)

structdef.h => definition de structures telleque SBallPos, etc..
 

Source

  • /************************************************************************************************
  • *******************************
  • * Commencé le 17 juillet 2003 *
  • * par Heliopraetor *
  • * et NaOs *
  • *******************************
  • Version : 1.1
  • Commentaires : 254.7Fps sur un AMD TBird 1.1 GHz, 512Mo DDR, G4 Ti4200 128Mo AGP 8x en cfg Release
  • et une moyenne de 145 fps dans le jeu.
  • *************************************************************************************************/
  • //-----defines nécessaires
  • #define DIRECTINPUT_VERSION 0x0800
  • #define MAIN_FILE
  • //-----includes nécessaires
  • #include <windows.h>
  • #include "resource.h"
  • #include "Def.h"
  • #include "Mleaks.h"
  • #include "DXUtils.h"
  • //----------------------------------------------------------------------------------------------//
  • // //
  • // //
  • // //
  • //-----------------------------------------"Champ global"---------------------------------------//
  • // //
  • // //
  • // //
  • //----------------------------------------------------------------------------------------------//
  • //-----déclarations
  • extern LPD3DXFONT *g_FontList; //liste de polices
  • extern void InitBonusTableAndBriquesTable(); //initialisation de la table des bonus et briques
  • extern void InitEffectsConstants();
  • extern int g_NumbOfFonts; //nombre de polices
  • extern LPDIRECT3DTEXTURE9 g_BrickTex;
  • //-----instances de classes propres au jeu
  • CTexManager* g_CTM = NULL; //gestionnaire de textures *
  • CResManager* g_CRM = NULL; //gestionnaire de fichiers ressources *
  • CMusicManager *g_CMuM = NULL; //gestionnaire de sons *
  • CLevelsManager *g_CLM = NULL; //gestionnaire du jeu *
  • CMenuManager *g_CMM = NULL; //gestionnaire du menu *
  • CInputManager* g_CIM = NULL; //gestionnaire de DirectInput *
  • CLogsManager* g_CLogM = NULL; //gestionnaire du fichier log WB.log *
  • COptionsPanel* g_COPPtr = NULL; //panneau des options *
  • CRegManager* g_CReg = NULL; //gestionnaire du registre *
  • CCadre* g_Cadre = NULL; //cadre de fond du jeu *
  • CCurseur* g_Curseur = NULL;
  • LPSRenderArgs g_SA = NULL; //structure de renseignement inter-classes *
  • LPSFontProperties g_FontTab = NULL; //propriétés des polices *
  • CPrimitivesEngine* g_PrE = NULL; //affichage des primitives *
  • //----------------------------------------------------------------------------------------------//
  • // //
  • // //
  • // //
  • //--------------------------------Fonctions de suppression finale-------------------------------//
  • // //
  • // //
  • // //
  • //----------------------------------------------------------------------------------------------//
  • void DeleteTemporaryFiles()
  • {
  • //------Suppression des éventuels fichiers du répertoire temporaire du jeu (.../_wbr)
  • WIN32_FIND_DATA wData;
  • HANDLE listing;
  • char* tmp = NULL;
  • tmp = new char[strlen(g_CRM->GetFilesDir())+4];
  • strcpy(tmp,g_CRM->GetFilesDir());
  • strcat(tmp,"*.*");
  • listing = FindFirstFile(tmp, &wData);
  • char buffer[256];
  • if (listing != INVALID_HANDLE_VALUE)
  • {
  • do
  • if(wData.cFileName[0] != '.')
  • {
  • sprintf(buffer,"%s%s",g_CRM->GetFilesDir(),wData.cFileName);
  • DeleteFile(buffer);
  • }
  • while (FindNextFile(listing, &wData));
  • FindClose(listing);
  • }
  • delete tmp;
  • }
  • void FreeAll()
  • {
  • if( g_PrE )
  • delete g_PrE;
  • if( g_Cadre ) //fond d'écran
  • delete g_Cadre;
  • if( g_Curseur ) //curseur
  • delete g_Curseur;
  • if( g_CLM ) //levelsmanager
  • delete g_CLM;
  • if( g_CMM ) //menumanager
  • delete g_CMM;
  • if( g_CIM ) //inputmanager
  • delete g_CIM;
  • if( g_CMuM ) //musicmanager
  • delete g_CMuM;
  • if( g_CTM ) //texturemanager
  • delete g_CTM;
  • if( g_CReg ) //regmanager
  • delete g_CReg;
  • if( g_SA ) //structure de communication
  • delete g_SA;
  • if( g_FontList && g_FontTab) //liste de polices
  • {
  • for (int i=0 ; i<g_NumbOfFonts ; i++)
  • g_FontList[i]->Release();
  • delete [] g_FontTab;
  • delete [] g_FontList;
  • }
  • if( g_CRM ) //CRessourceManager
  • {
  • g_CRM->Delete(c_Tmp, NbWav);
  • g_CRM->Delete(l_Tmp, NbBmp);
  • for (int i=0 ; i<NbBmp ; i++) {delete l_Tmp[i];}
  • for (i=0 ; i<NbWav ; i++) {delete c_Tmp[i];}
  • delete [] c_Tmp;
  • delete [] l_Tmp;
  • DeleteTemporaryFiles();
  • delete g_CRM;
  • }
  • //CLogManager à supprimer
  • RELEASE(g_D3DXSprite); //
  • RELEASE(g_Surf); //variables
  • RELEASE(g_Device); //directx
  • RELEASE(g_D3D); //
  • g_CLogM->AddEvent("Instances supprimées - lancement de la suppression du loggeur");
  • delete g_CLogM;
  • }
  • //----------------------------------------------------------------------------------------------//
  • // //
  • // //
  • // //
  • //---------------Fonction pour récupérer le Device en cas de basculement------------------------//
  • // //
  • // //
  • // //
  • //----------------------------------------------------------------------------------------------//
  • bool CheckDevice()
  • {
  • HRESULT l_DeviceState = g_Device->TestCooperativeLevel();
  • if( l_DeviceState == D3DERR_DEVICENOTRESET )
  • {
  • Sleep(100); //on alloue 100ms au systeme
  • // g_CMM->DrawMsgBox();
  • g_CTM->dr_UnloadAll();
  • g_CMM->dr_Unload();
  • g_CLM->dr_Unload();
  • if( g_FontList ) //liste de polices
  • {
  • for (int i=0 ; i<g_NumbOfFonts ; i++)
  • g_FontList[i]->Release();
  • delete [] g_FontList;
  • }
  • RELEASE(g_D3DXSprite); //
  • RELEASE(g_Surf); //variables
  • HRESULT l_Res = g_Device->Reset(&g_d3dpp);
  • if( l_Res != D3D_OK )
  • {
  • char l_Msg[256];
  • switch(l_Res)
  • {
  • case D3DERR_DEVICELOST : strcpy(l_Msg,"Le device a été perdu !"); break;
  • case D3DERR_DRIVERINTERNALERROR : strcpy(l_Msg,"Le driver a rencontré une erreur interne !"); break;
  • case D3DERR_INVALIDCALL : strcpy(l_Msg,"L'appel à IDirect3DDevice9::Reset a été mal effectué !"); break;
  • case D3DERR_OUTOFVIDEOMEMORY : strcpy(l_Msg,"Pas assez de mémoire vidéo !"); break;
  • case E_OUTOFMEMORY : strcpy(l_Msg,"Pas assez de mémoire !"); break;
  • }
  • MessageBox(g_hDlg,l_Msg,"Erreur Fatale !",0+MB_ICONHAND);
  • return false;
  • }
  • //HYPER IMPORTANT POUR RE-RENDRE LES VERTEX
  • g_Device->SetRenderState(D3DRS_ALPHATESTENABLE, true);
  • g_Device->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_NOTEQUAL);
  • g_Device->SetRenderState(D3DRS_ALPHAREF, 0x00);
  • g_Device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
  • g_Device->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
  • g_Device->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
  • g_Device->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE);
  • g_Device->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
  • g_Device->SetTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_DIFFUSE);
  • //filtrage bilinéaire pour un effet d'antialiasing lors des distorsions des sprites
  • //désactivation de la lumière (sinon les sprites seront noirs)
  • g_Device->SetRenderState(D3DRS_LIGHTING, FALSE);
  • g_Device->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE);
  • g_Device->SetVertexShader(NULL);
  • HFONT l_TmpFont;
  • g_FontList = new LPD3DXFONT[g_NumbOfFonts];
  • for(int k=0 ; k<g_NumbOfFonts ; k++)
  • {
  • l_TmpFont = CreateFont( g_FontTab[k].m_Size, //taille de la police : 10, 12, 16, etc
  • 0, 0, 0,
  • g_FontTab[k].m_Flag, //texte gras ou non
  • g_FontTab[k].m_Italic, //italique : true ou false
  • g_FontTab[k].m_Underlined, //souligné : true ou false
  • FALSE,
  • ANSI_CHARSET,
  • OUT_DEFAULT_PRECIS,
  • CLIP_DEFAULT_PRECIS,
  • ANTIALIASED_QUALITY,
  • VARIABLE_PITCH,
  • g_FontTab[k].m_Name);
  • D3DXCreateFont( g_Device, l_TmpFont, &g_FontList[k] );
  • DeleteObject( l_TmpFont );
  • }
  • g_Device->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&g_Surf);
  • D3DXCreateSprite( g_Device, &g_D3DXSprite );
  • if( g_Surf == NULL )
  • {
  • g_CLogM->AddEvent("[ERREUR] Impossible de récupérer la surface de base !");
  • return false;
  • }
  • if( g_D3DXSprite == NULL )
  • {
  • g_CLogM->AddEvent("[ERREUR] Impossible de récupérer l'objet D3DXSPRITE !");
  • return false;
  • }
  • g_CLM->dr_Reload();
  • g_CTM->dr_ReloadAll(g_SA->m_Time);
  • g_CMM->dr_Reload();
  • g_BrickTex = (*g_CTM)[GX_BRIQUES]->m_lpTexture;
  • }
  • return true;
  • }
  • //----------------------------------------------------------------------------------------------//
  • // //
  • // //
  • // //
  • //-----------------------------------Fonction de rendu de frame---------------------------------//
  • // //
  • // //
  • // //
  • //----------------------------------------------------------------------------------------------//
  • bool Update()
  • {
  • static float CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);
  • bool DontPlay = (IsIconic(g_hDlg)||g_hDlg!=GetForegroundWindow());
  • if( DXUtil_Timer(TIMER_GETABSOLUTETIME)-CurrentTime>0.015f )//64 fps ( 1/fps. calculé par 1/66 mais a cause des arrondis on a 64fps)
  • {
  • srand((unsigned int)timeGetTime()); //On réinitialise le hasard.
  • //-----------Préparation des variables d'affichage------
  • static float Timer = 0.0f;
  • static float dwFrames = 0.0f;
  • CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);
  • //-----------Préparation du device pour l'affichage-----
  • if (!DontPlay)
  • {
  • if (!g_CLM->Is_Paused())
  • DXUtil_Timer(TIMER_START);
  • if( !CheckDevice() )
  • {
  • g_CLogM->AddEvent("[ERREUR] CheckDevice() a échoué");
  • return false;
  • }
  • g_Device->Clear(NULL,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
  • g_Device->BeginScene();
  • //-----------Acquisition des données périphériques----------
  • g_CIM->ActualiseState();
  • g_SA->m_Time = DXUtil_Timer(TIMER_GETAPPTIME);
  • g_SA->m_RealTime = CurrentTime;
  • g_SA->m_LastChar = g_CIM->GetInputChar();
  • g_SA->m_LeftButton = g_CIM->GetButtonsState(1);
  • g_SA->m_RightButton = g_CIM->GetButtonsState(2);
  • g_SA->m_x = g_CIM->GetBattleX();
  • g_SA->m_y = g_CIM->GetBattleY();
  • //------------Dessin et calcul d'une frame-------------
  • g_Cadre->Draw();
  • g_CLM->RenderFrame();
  • if (!g_CMM->RenderFrame() )
  • return false;
  • //------------Calcul des FPS
  • if( g_COPPtr->GetFps() )
  • {
  • dwFrames++;
  • PrintText(g_FPS,0,0,D3DCOLOR_ARGB(255,0,255,64),WBF_IMPACT);
  • }
  • }
  • //------------Verifie l'utilité d'une texture-----------
  • if( CurrentTime - Timer > 1.0f )
  • {
  • g_CTM->Head_Reset();
  • for(int i=0; i<g_ListSize ; i++)
  • {
  • STexture* l_TexTmp = g_CTM->Head_GetPointer();
  • if( l_TexTmp && l_TexTmp->m_Loaded ) //Si texture chargée => vérifie temps
  • if( CurrentTime - l_TexTmp->m_LastTimeUsed > 7.0f ) //7s
  • g_CTM->Head_UnloadTexture();
  • g_CTM->Head_Next();
  • }
  • //FPS
  • sprintf(g_FPS,"%.2f",dwFrames / (CurrentTime - Timer));
  • dwFrames = 0;
  • Timer = CurrentTime;
  • }
  • /*char tmp[20];
  • sprintf(tmp,"RealTime : %.1f",g_SA->m_RealTime);
  • PrintText(tmp,5,300,D3DCOLOR_ARGB(255,0,255,64),WBF_IMPACT);
  • sprintf(tmp,"Time : %.1f",g_SA->m_Time);
  • PrintText(tmp,5,350,D3DCOLOR_ARGB(255,0,255,64),WBF_IMPACT);*/
  • //-----------Affichage de la frame----------------------
  • if (!DontPlay)
  • {
  • g_Device->EndScene();
  • g_Device->Present(NULL,NULL,NULL,NULL);
  • }
  • else
  • {
  • DXUtil_Timer(TIMER_STOP);
  • Sleep(100);
  • }
  • }
  • return true;
  • }
  • //----------------------------------------------------------------------------------------------//
  • // //
  • // //
  • // //
  • //------------------------------Fonction de traitement des messages-----------------------------//
  • // //
  • // //
  • // //
  • //----------------------------------------------------------------------------------------------//
  • LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  • {
  • switch (message)
  • {
  • /*case WM_CLOSE:
  • case WM_DESTROY:
  • case WM_ENDSESSION:
  • case WM_QUIT:
  • g_CallBoucle=false;
  • break;*/
  • default:
  • break;
  • }
  • return DefWindowProc(hwnd, message, wParam, lParam);
  • }
  • //----------------------------------------------------------------------------------------------//
  • // //
  • // //
  • // //
  • //----------------------------------------Fonction WinMain--------------------------------------//
  • // //
  • // //
  • // //
  • //----------------------------------------------------------------------------------------------//
  • int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
  • {
  • //------Variables de gestion générale
  • g_Instance = hInstance;
  • MSG Msg;
  • bool l_Abort = false;
  • bool l_ExtractActionFailed=false;
  • #ifndef _DEBUG
  • CSplashScreen::Run();
  • #endif
  • //------Création d'un objet de gestion de logs
  • g_CLogM = new CLogsManager(true,true,true,true,true,true,"WB.log");
  • g_CLogM->AddEvent("CLogsManager créé");
  • //------Création de la classe de fenêtre
  • WNDCLASSEX wc;
  • wc.hInstance = hInstance;
  • wc.lpszClassName = szClassName;
  • wc.lpfnWndProc = WindowProcedure;
  • wc.style = 0/*CS_OWNDC*/;
  • wc.cbSize = sizeof(WNDCLASSEX);
  • wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_WATERBALL));
  • wc.hIconSm = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_WATERBALL));
  • wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  • wc.lpszMenuName = NULL;
  • wc.cbClsExtra = 0;
  • wc.cbWndExtra = 0;
  • wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
  • if(!RegisterClassEx(&wc))
  • {
  • /*#ifndef _DEBUG
  • CSplashScreen::Exit();
  • #endif
  • return 0;*/ //apparemment pas nécessaire : classe déjà enregistrée
  • g_CLogM->AddEvent("Méthode RegisterClassEx échouée");
  • }
  • //création de l'interface de transmission des infos périphériques
  • g_SA = new SRenderArgs;
  • if( g_SA == NULL )
  • {
  • g_CLogM->AddEvent("Impossible de créer la structure d'arguments");
  • l_Abort = true;
  • }
  • g_CLogM->AddEvent("Structure d'arguments créée");
  • //------Chargement des paramètres à partir du registre
  • int Res_X, Res_Y;
  • g_CReg = new CRegManager(); //création du gestionnaire de registre
  • if( g_CReg == NULL )
  • {
  • g_CLogM->AddEvent("Erreur dans l'initialisation du registre");
  • FreeAll();
  • #ifndef _DEBUG
  • CSplashScreen::Exit();
  • #endif
  • return -1; //si erreur on quitte
  • }
  • else
  • {
  • char l_MainKey[256];
  • strcpy(l_MainKey,"Software\\Waterball\\");
  • g_CReg->SetHK( HKEY_CURRENT_USER );
  • g_CReg->SetKey( l_MainKey );
  • g_CReg->SetValueName( "Res" );
  • if (g_CReg->rGetInt() == -1) //la clé registre n'existe pas !
  • {
  • //mise en place des valeurs par défault
  • Res_X = 800;
  • Res_Y = 600;
  • g_SA->m_Zoom = 0.781f;
  • g_TexQual=2;
  • g_Skin=0;
  • strcpy(g_SkinName,"Skins\\WaterData.wbr");
  • //initialisation du registre
  • g_CReg->SetValueName( "Res" );
  • g_CReg->rWriteInt(g_ResolutionIs800);
  • g_CReg->SetValueName( "Window" );
  • g_CReg->rWriteInt(g_Windowed);
  • g_CReg->SetValueName( "TexQuality" );
  • g_CReg->rWriteInt(g_TexQual);
  • g_CReg->SetValueName( "Volume" );
  • g_CReg->rWriteInt(g_Volume);
  • g_CReg->SetValueName( "Skin" );
  • g_CReg->rWriteInt(g_Skin);
  • g_CReg->SetValueName( "ShowFPS" );
  • g_CReg->rWriteInt(
  • #ifdef _DEBUG
  • true
  • #else
  • false
  • #endif
  • );
  • }
  • else //le registre a déjà été initialisé
  • {
  • g_ResolutionIs800 = g_CReg->rGetInt()?true:false;
  • if( g_ResolutionIs800 )
  • {
  • Res_X = 800;
  • Res_Y = 600;
  • g_SA->m_Zoom = 0.781f;
  • }
  • else
  • {
  • Res_X = 1024;
  • Res_Y = 768;
  • g_SA->m_Zoom = 1.0f;
  • }
  • g_CReg->SetValueName( "Window" );
  • g_Windowed = g_CReg->rGetInt()?true:false;
  • g_CReg->SetValueName( "TexQuality" );
  • g_TexQual = g_CReg->rGetInt();
  • g_CReg->SetValueName( "Volume" );
  • g_Volume = g_CReg->rGetInt();
  • g_CReg->SetValueName( "Skin" );
  • g_Skin = g_CReg->rGetInt();
  • switch(g_Skin)
  • {
  • case 1:
  • strcpy(g_SkinName,"Skins\\MatrixData.wbr");
  • break;
  • case 2:
  • strcpy(g_SkinName,"Skins\\DarkData.wbr");
  • break;
  • case 3:
  • strcpy(g_SkinName,"Skins\\Skin4.wbr");
  • break;
  • default:
  • strcpy(g_SkinName,"Skins\\WaterData.wbr");
  • }
  • }
  • }
  • //------Création de la fenêtre
  • //initialisation de variables
  • #ifdef _DEBUG
  • #define CHOIX_AFF NULL
  • #else
  • #define CHOIX_AFF WS_POPUP
  • #endif
  • DWORD Flag;
  • if( g_Windowed && Res_X==GetSystemMetrics(SM_CXSCREEN) )
  • Flag = WS_CLIPCHILDREN | WS_CAPTION;
  • else
  • Flag = WS_CLIPCHILDREN;
  • //création elle-même
  • g_hDlg = CreateWindowEx(
  • 0, //Extended possibilites for variation
  • szClassName, //Classname
  • szClassName, //Title Text
  • CHOIX_AFF | Flag , //default window
  • 0, //Windows decides the position
  • 0, //where the window ends up on the screen
  • Res_X, //The programs width
  • Res_Y, //and height in pixels
  • NULL, //The window is a child-window to desktop
  • NULL, //No menu
  • hInstance, //Program Instance handler
  • NULL //No Window Creation data
  • );
  • //validation
  • g_CLogM->AddEvent("Fenêtre créée");
  • g_CLogM->AddEvent("Opérations registre effectuées");
  • //-----Initialisation de l'extraction des ressources (sons et graphismes)
  • g_CRM = new CResManager("UnAceV2.Dll","_wbr",true);
  • if( g_CRM->GetErrValue() > 0 )
  • {
  • MessageBox(g_hDlg,"UnaceV2.dll non présente sur ce systeme !","Erreur fatale !",MB_ICONHAND);
  • FreeAll();
  • #ifndef _DEBUG
  • CSplashScreen::Exit();
  • #endif
  • return -1;
  • }
  • //------Chargement du skin
  • if( !FileExist(g_SkinName) )
  • {
  • MessageBox(g_hDlg,"Skin sélectionné inexistant !","Erreur fatale !",MB_ICONHAND);
  • assert(1!=1); //big problème
  • strcpy(g_SkinName,"Skins\\WaterData.wbr"); //on met celui par defaut
  • if( !FileExist(g_SkinName) )
  • {
  • MessageBox(g_hDlg,"Aucun skin présent !","Erreur fatale !",MB_ICONHAND);
  • g_CLogM->AddEvent("! Erreur ! Aucun skin présent !");
  • FreeAll();
  • #ifndef _DEBUG
  • CSplashScreen::Exit();
  • #endif
  • return -1;
  • }
  • }
  • //------Extraction des ressources
  • DeleteTemporaryFiles();
  • g_CRM->SetArchiveName(g_SkinName);
  • char *ptc=new char[7]; //petit codage express du password
  • for (int f=0;f<6;f++)
  • ptc[f]=0x60;
  • int in=0;
  • ptc[in++]+=4;
  • ptc[in++]+=9;
  • ptc[in++]+=5;
  • ptc[in++]+=16;
  • ptc[in++]+=16;
  • ptc[in++]+=5;
  • ptc[in]=NULL;
  • g_CRM->SetArchivePassword(ptc);
  • delete ptc;
  • if( !g_CRM->Extract() )
  • l_ExtractActionFailed=true;
  • else
  • g_CLogM->AddEvent("Ressources extraites");
  • if (l_ExtractActionFailed)
  • {
  • MessageBox(g_hDlg,"Impossible d'extraire les ressources !","Erreur fatale !",MB_ICONHAND);
  • FreeAll();
  • #ifndef _DEBUG
  • CSplashScreen::Exit();
  • #endif
  • return -1;
  • }
  • //------Test de la version de DirectX
  • if( GetDXVersion() < 0x900 )
  • {
  • MessageBox(g_hDlg,"Ce jeu requiert une version 9, ou ultérieure, de DirectX pour fonctionner","Erreur fatale !",MB_ICONHAND);
  • FreeAll();
  • #ifndef _DEBUG
  • CSplashScreen::Exit();
  • #endif
  • return -1;
  • }
  • g_CLogM->AddEvent("DirectX 9 supporté");
  • //-----Initialisation de DirectGraphics pour DX9
  • #ifndef _DEBUG
  • if( !InitDGraphics(1024,768,12+(g_TexQual*12),g_Windowed) )
  • #else
  • if( !InitDGraphics(1024,768,24,true) )
  • #endif
  • {
  • l_Abort = true;
  • MessageBox(g_hDlg,"Impossible d'initialiser DGraphics !","Erreur fatale !",MB_ICONHAND);
  • }
  • //-----Création et initialisation des polices
  • g_FontTab = LoadFonts(g_FontTab,"FontList.wbf") ;
  • if( g_FontTab == NULL )
  • {
  • l_Abort = true;
  • MessageBox(g_hDlg,"Impossible d'initialiser les polices !","Erreur fatale !",MB_ICONHAND);
  • }
  • else
  • {
  • HFONT l_TmpFont;
  • g_FontList = new LPD3DXFONT[g_NumbOfFonts];
  • for(int k=0 ; k<g_NumbOfFonts ; k++)
  • {
  • l_TmpFont = CreateFont( g_FontTab[k].m_Size, //taille de la police : 10, 12, 16, etc
  • 0, 0, 0,
  • g_FontTab[k].m_Flag, //texte gras ou non
  • g_FontTab[k].m_Italic, //italique : true ou false
  • g_FontTab[k].m_Underlined, //souligné : true ou false
  • FALSE,
  • ANSI_CHARSET,
  • OUT_DEFAULT_PRECIS,
  • CLIP_DEFAULT_PRECIS,
  • ANTIALIASED_QUALITY,
  • VARIABLE_PITCH,
  • g_FontTab[k].m_Name);
  • D3DXCreateFont( g_Device, l_TmpFont, &g_FontList[k] );
  • DeleteObject( l_TmpFont );
  • }
  • }
  • //------------Initialisation du tableau pour la génération de bonus
  • InitBonusTableAndBriquesTable();
  • //---------Mise en place du support des primitives
  • g_PrE = new CPrimitivesEngine(g_Device, &g_d3dpp);
  • g_CLogM->AddEvent("Moteur de primitives initialisé");
  • //-----Creation d'un objet pour gérer les textures-------
  • g_CTM = new CTexManager(g_Device,&g_d3dpp);
  • if( g_CTM->GetErrValue() > 0 )
  • {
  • MessageBox(g_hDlg,"Impossible d'initialiser le gestionnaire de textures !","Erreur fatale !",MB_ICONHAND);
  • l_Abort = true;
  • }
  • //-----Création d'un objet pour gérer les sons-------
  • g_CMuM = new CMusicManager();
  • if( g_CMuM->GetErrValue() > 0 )
  • {
  • MessageBox(g_hDlg,"Impossible d'initialiser DMusic !","Erreur fatale !",MB_ICONHAND);
  • l_Abort = true;
  • }
  • g_CLogM->AddEvent("DirectX 9 initialisé");
  • //-----Réglage du volume et des sons
  • if( g_Volume>-1 && g_Volume<12 )
  • g_CMuM->SetVolume( g_Volume*100/11 );
  • else
  • g_CMuM->SetVolume( VOLUME_DEFAULT_IN_PERCENT );
  • c_Tmp = new char*[NbWav];
  • int l_Volume = 0;
  • for (int w=0 ; w!=NbWav ; w++)
  • {
  • c_Tmp[w] = new char[strlen(g_CRM->GetFilesDir())+strlen(WavNames[w])+1];
  • strcpy(c_Tmp[w],g_CRM->GetFilesDir());
  • strcat(c_Tmp[w],WavNames[w]);
  • if( w > 26 )
  • l_Volume = 0;
  • if( g_CMuM->AddToPlayList(c_Tmp[w],false,false,l_Volume) == -1 )
  • {
  • l_Abort = true;
  • char l_Msg[256] = "Impossible de charger le son nommé ";
  • strcat(l_Msg,WavNames[w]);
  • g_CLogM->AddEvent(l_Msg);
  • MessageBox(g_hDlg,l_Msg,"Erreur Fatale !",0+MB_ICONHAND);
  • }
  • }
  • if( !l_Abort )
  • g_CLogM->AddEvent("Sons créés");
  • //-------Création des textures-------------
  • l_Tmp = new char*[NbBmp];
  • float l_Time = DXUtil_Timer(TIMER_GETAPPTIME);
  • for (int i=0 ; i!=NbBmp ; i++)
  • {
  • l_Tmp[i] = new char[strlen(g_CRM->GetFilesDir())+strlen(BmpNames[i])+1];
  • strcpy(l_Tmp[i],g_CRM->GetFilesDir());
  • strcat(l_Tmp[i],BmpNames[i]);
  • if( g_CTM->AddTexture(l_Tmp[i],l_Time,Coor[i][0],Coor[i][1]) == -1 )
  • {
  • char* l_ErrMsg;
  • l_ErrMsg = new char[22 + strlen(BmpNames[i]) + 3];
  • strcpy(l_ErrMsg,"Impossible de charger ");
  • strcat(l_ErrMsg,BmpNames[i]);
  • strcat(l_ErrMsg," !");
  • MessageBox(g_hDlg,l_ErrMsg,"Erreur fatale !",MB_ICONHAND);
  • delete [] l_ErrMsg;
  • l_Abort = true;
  • }
  • }
  • g_BrickTex = (*g_CTM)[GX_BRIQUES]->m_lpTexture;
  • g_CLogM->AddEvent("Textures créées");
  • //---------------------Création des éléments de jeu
  • //création du fond
  • g_Cadre = new CCadre(g_Device ,g_D3DXSprite ,&g_d3dpp);
  • g_Curseur = new CCurseur(g_Device ,g_D3DXSprite ,&g_d3dpp);
  • if( g_Cadre==NULL || g_Curseur==NULL )
  • {
  • MessageBox(g_hDlg,"Impossible d'initialiser le cadre ou le curseur !","Erreur fatale !",MB_ICONHAND);
  • l_Abort = true;
  • }
  • //création du jeu
  • g_CLM = new CLevelsManager(g_Device ,g_D3DXSprite ,&g_d3dpp, "Default.wbl");
  • if( g_CLM->GetErrValue() > 0 )
  • {
  • MessageBox(g_hDlg,"Impossible d'initialiser le gestionnaire de niveau !","Erreur fatale !",MB_ICONHAND);
  • l_Abort = true;
  • }
  • //création du menu
  • g_CMM = new CMenuManager(g_Device ,g_D3DXSprite ,&g_d3dpp, "Default.wbs");
  • if( g_CMM == NULL || g_CMM->GetErrValue() > 0 )
  • {
  • MessageBox(g_hDlg,"Impossible d'initialiser le gestionnaire de menu !","Erreur fatale !",MB_ICONHAND);
  • l_Abort = true;
  • }
  • //Gestion des paramètres du registre
  • g_COPPtr = g_CMM->GetPanelPtr();
  • g_CReg->SetValueName( "ShowFPS" );
  • if( g_COPPtr==NULL || g_CReg->rGetInt()==-1 )
  • {
  • MessageBox(g_hDlg,"Impossible d'initialiser un panel de contrôle !","Erreur fatale !",MB_ICONHAND);
  • l_Abort = true;
  • }
  • g_COPPtr->SetFps( g_CReg->rGetInt()?true:false );
  • //-----Initialisation de DirectInput
  • g_CIM = new CInputManager();
  • if (g_CIM)
  • if ( !g_CIM->Init(hInstance,g_Windowed) )
  • {
  • MessageBox(g_hDlg,"Impossible d'initialiser DInput !","Erreur fatale !",MB_ICONHAND);
  • l_Abort = true;
  • }
  • //--------------------Si erreur il y a, quitter il faut alors...
  • if( l_Abort )
  • {
  • g_CLogM->AddEvent("Une erreur s'est produite dans l'initialisation");
  • FreeAll();
  • #ifndef _DEBUG
  • CSplashScreen::Exit();
  • #endif
  • return -1;
  • }
  • //------Dernières initialisations
  • g_CLogM->AddEvent("Initialisation complète, lancement de la boucle de jeu");
  • g_ListSize = g_CTM->GetSize();
  • #ifndef _DEBUG
  • CSplashScreen::Exit();
  • #endif
  • ShowWindow(g_hDlg, nCmdShow);
  • SetForegroundWindow(g_hDlg);
  • sprintf(g_ProgInfos,"- Waterball %.1f Built on %s at %s -",_version,_date,_time);
  • g_CMuM->DSPlayNextMusic(true);
  • //--------------------Boucle de jeu : c'est parti !!!!!!!!
  • g_CallBoucle=true;
  • while(g_CallBoucle && IsWindow(g_hDlg))
  • {
  • //pour les erreurs non debug
  • #ifndef _DEBUG
  • try{
  • #endif
  • if( PeekMessage(&Msg, NULL, 0, 0, PM_NOREMOVE) )
  • {
  • if (Msg.message == WM_QUIT)
  • g_CallBoucle=false;
  • else
  • {
  • GetMessage(&Msg,NULL,0,0);
  • //TranslateMessage(&Msg);
  • //DispatchMessage(&Msg);
  • WindowProcedure(g_hDlg,Msg.message,Msg.wParam,Msg.lParam);
  • }
  • }
  • else
  • {
  • if( !Update() ) g_CallBoucle=false;
  • }
  • //suite de "pour les erreurs non debug"
  • #ifndef _DEBUG
  • }catch(...)
  • {
  • g_CLogM->AddEvent("Erreur dans la boucle de jeu");
  • g_CallBoucle=false;
  • }
  • #endif
  • }
  • g_CLogM->AddEvent("Boucle de jeu interrompue");
  • //-----Suppressions finales
  • FreeAll();
  • DestroyWindow(g_hDlg);
  • PostQuitMessage(0);
  • UnregisterClass(szClassName,g_Instance);
  • return Msg.wParam; //on quitte proprement
  • }
/************************************************************************************************

                                *******************************
                               *  Commencé le 17 juillet 2003  *
                               *        par Heliopraetor       *
							   *			et NaOs 		   *
                                *******************************

Version : 1.1
Commentaires : 254.7Fps sur un AMD TBird 1.1 GHz, 512Mo DDR, G4 Ti4200 128Mo AGP 8x en cfg Release
				et une moyenne de 145 fps dans le jeu.
*************************************************************************************************/



//-----defines nécessaires
#define DIRECTINPUT_VERSION 0x0800
#define MAIN_FILE

//-----includes nécessaires
#include <windows.h>
#include "resource.h"
#include "Def.h"
#include "Mleaks.h"
#include "DXUtils.h"


//----------------------------------------------------------------------------------------------//
//																								//
//																								//
//																								//
//-----------------------------------------"Champ global"---------------------------------------//
//																								//
//																								//
//																								//
//----------------------------------------------------------------------------------------------//


//-----déclarations
extern LPD3DXFONT *g_FontList;					//liste de polices
extern void InitBonusTableAndBriquesTable();	//initialisation de la table des bonus et briques
extern void InitEffectsConstants();
extern int g_NumbOfFonts;						//nombre de polices
extern LPDIRECT3DTEXTURE9 g_BrickTex;


//-----instances de classes propres au jeu
CTexManager* g_CTM = NULL;					//gestionnaire de textures					*
CResManager* g_CRM = NULL;					//gestionnaire de fichiers ressources		*
CMusicManager *g_CMuM = NULL;				//gestionnaire de sons						*
CLevelsManager *g_CLM = NULL;				//gestionnaire du jeu						*
CMenuManager *g_CMM = NULL;					//gestionnaire du menu						*
CInputManager* g_CIM = NULL;				//gestionnaire de DirectInput				*
CLogsManager* g_CLogM = NULL;				//gestionnaire du fichier log WB.log		*
COptionsPanel* g_COPPtr = NULL;				//panneau des options						*
CRegManager* g_CReg = NULL;					//gestionnaire du registre					*
CCadre* g_Cadre = NULL;						//cadre de fond du jeu						*
CCurseur* g_Curseur = NULL;
LPSRenderArgs g_SA = NULL;					//structure de renseignement inter-classes	*
LPSFontProperties g_FontTab = NULL;			//propriétés des polices					*
CPrimitivesEngine* g_PrE = NULL;			//affichage des primitives					*


//----------------------------------------------------------------------------------------------//
//																								//
//																								//
//																								//
//--------------------------------Fonctions de suppression finale-------------------------------//
//																								//
//																								//
//																								//
//----------------------------------------------------------------------------------------------//
void DeleteTemporaryFiles()
{
	//------Suppression des éventuels fichiers du répertoire temporaire du jeu (.../_wbr)
	WIN32_FIND_DATA wData;
	HANDLE listing;
	char* tmp = NULL;
	tmp = new char[strlen(g_CRM->GetFilesDir())+4];
	strcpy(tmp,g_CRM->GetFilesDir());
	strcat(tmp,"*.*");
	listing = FindFirstFile(tmp, &wData);
	char buffer[256];
	if (listing != INVALID_HANDLE_VALUE)
	{
		do
			if(wData.cFileName[0] != '.')
			{
				sprintf(buffer,"%s%s",g_CRM->GetFilesDir(),wData.cFileName);
				DeleteFile(buffer);
			}
		while (FindNextFile(listing, &wData));
		FindClose(listing);
	}
	delete tmp;
}


void FreeAll()
{
	if( g_PrE )
		delete g_PrE;
	if( g_Cadre )			//fond d'écran
		delete g_Cadre;
	if( g_Curseur )			//curseur
		delete g_Curseur;
	if( g_CLM )				//levelsmanager
		delete g_CLM;
	if( g_CMM )				//menumanager
		delete g_CMM;
	if( g_CIM )				//inputmanager
		delete g_CIM;
	if( g_CMuM )			//musicmanager
		delete g_CMuM;
	if( g_CTM )				//texturemanager
		delete g_CTM;
	if( g_CReg )			//regmanager
		delete g_CReg;
	if( g_SA )				//structure de communication
		delete g_SA;

	if( g_FontList && g_FontTab)	//liste de polices
	{
		for (int i=0 ; i<g_NumbOfFonts ; i++)
			g_FontList[i]->Release();
		delete [] g_FontTab;
		delete [] g_FontList;
	}

	if( g_CRM )				//CRessourceManager
	{
		g_CRM->Delete(c_Tmp, NbWav);
		g_CRM->Delete(l_Tmp, NbBmp);

		for (int i=0 ; i<NbBmp ; i++) {delete l_Tmp[i];}
		for (i=0 ; i<NbWav ; i++) {delete c_Tmp[i];}
		delete [] c_Tmp;
		delete [] l_Tmp;

		DeleteTemporaryFiles();

		delete g_CRM;
	}

	//CLogManager à supprimer

	RELEASE(g_D3DXSprite); //
	RELEASE(g_Surf);	   //variables
	RELEASE(g_Device);	   //directx
	RELEASE(g_D3D);		   //
	g_CLogM->AddEvent("Instances supprimées - lancement de la suppression du loggeur");
	delete g_CLogM;
}


//----------------------------------------------------------------------------------------------//
//																								//
//																								//
//																								//
//---------------Fonction pour récupérer le Device en cas de basculement------------------------//
//																								//
//																								//
//																								//
//----------------------------------------------------------------------------------------------//
bool CheckDevice()
{
	HRESULT l_DeviceState = g_Device->TestCooperativeLevel();

	if( l_DeviceState == D3DERR_DEVICENOTRESET )
	{
		Sleep(100); //on alloue 100ms au systeme

//		g_CMM->DrawMsgBox();
		g_CTM->dr_UnloadAll();
		g_CMM->dr_Unload();
		g_CLM->dr_Unload();

		if( g_FontList )	//liste de polices
		{
			for (int i=0 ; i<g_NumbOfFonts ; i++)
				g_FontList[i]->Release();
			delete [] g_FontList;
		}

		RELEASE(g_D3DXSprite); //
		RELEASE(g_Surf);	   //variables

		HRESULT l_Res = g_Device->Reset(&g_d3dpp);

		if( l_Res != D3D_OK )
		{
			char l_Msg[256];
	
			switch(l_Res)
			{
				case D3DERR_DEVICELOST : strcpy(l_Msg,"Le device a été perdu !"); break;
				case D3DERR_DRIVERINTERNALERROR : strcpy(l_Msg,"Le driver a rencontré une erreur interne !"); break;
				case D3DERR_INVALIDCALL : strcpy(l_Msg,"L'appel à IDirect3DDevice9::Reset a été mal effectué !"); break;
				case D3DERR_OUTOFVIDEOMEMORY : strcpy(l_Msg,"Pas assez de mémoire vidéo !"); break;
				case E_OUTOFMEMORY : strcpy(l_Msg,"Pas assez de mémoire !"); break;
			}

			MessageBox(g_hDlg,l_Msg,"Erreur Fatale !",0+MB_ICONHAND);
		    return false;
		}

		//HYPER IMPORTANT POUR RE-RENDRE LES VERTEX
		g_Device->SetRenderState(D3DRS_ALPHATESTENABLE, true);
		g_Device->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_NOTEQUAL);
		g_Device->SetRenderState(D3DRS_ALPHAREF, 0x00);
		g_Device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
		g_Device->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
		g_Device->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
		g_Device->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE);
		g_Device->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
		g_Device->SetTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_DIFFUSE);
		//filtrage bilinéaire pour un effet d'antialiasing lors des distorsions des sprites
		//désactivation de la lumière (sinon les sprites seront noirs)
		g_Device->SetRenderState(D3DRS_LIGHTING, FALSE);
		g_Device->SetRenderState( D3DRS_CULLMODE,  D3DCULL_NONE);
		g_Device->SetVertexShader(NULL);

		HFONT l_TmpFont;
		g_FontList = new LPD3DXFONT[g_NumbOfFonts];

		for(int k=0 ; k<g_NumbOfFonts ; k++)
		{
			l_TmpFont = CreateFont( g_FontTab[k].m_Size,		//taille de la police : 10, 12, 16, etc
								  0, 0, 0,
								  g_FontTab[k].m_Flag,			//texte gras ou non
								  g_FontTab[k].m_Italic,		//italique : true ou false
								  g_FontTab[k].m_Underlined,    //souligné : true ou false
								  FALSE,
								  ANSI_CHARSET,
								  OUT_DEFAULT_PRECIS,
								  CLIP_DEFAULT_PRECIS,
								  ANTIALIASED_QUALITY,
								  VARIABLE_PITCH,
								  g_FontTab[k].m_Name);

			D3DXCreateFont( g_Device, l_TmpFont, &g_FontList[k] );
			DeleteObject( l_TmpFont );
		}

		g_Device->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&g_Surf);
		D3DXCreateSprite( g_Device, &g_D3DXSprite );

		if( g_Surf == NULL )
		{
			g_CLogM->AddEvent("[ERREUR] Impossible de récupérer la surface de base !");
			return false;
		}

		if( g_D3DXSprite == NULL )
		{
			g_CLogM->AddEvent("[ERREUR] Impossible de récupérer l'objet D3DXSPRITE !");
			return false;
		}

		g_CLM->dr_Reload();
		g_CTM->dr_ReloadAll(g_SA->m_Time);
		g_CMM->dr_Reload();
		g_BrickTex = (*g_CTM)[GX_BRIQUES]->m_lpTexture;
	}
	return true;
}


//----------------------------------------------------------------------------------------------//
//																								//
//																								//
//																								//
//-----------------------------------Fonction de rendu de frame---------------------------------//
//																								//
//																								//
//																								//
//----------------------------------------------------------------------------------------------//
bool Update()
{
	static float CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);

	bool DontPlay = (IsIconic(g_hDlg)||g_hDlg!=GetForegroundWindow());

	if( DXUtil_Timer(TIMER_GETABSOLUTETIME)-CurrentTime>0.015f )//64 fps ( 1/fps. calculé par 1/66 mais a cause des arrondis on a 64fps)
	{
		srand((unsigned int)timeGetTime());	//On réinitialise le hasard.

		//-----------Préparation des variables d'affichage------
		static float Timer = 0.0f;
		static float dwFrames = 0.0f;
		CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);

		//-----------Préparation du device pour l'affichage-----
		if (!DontPlay)
		{
			if (!g_CLM->Is_Paused())
				DXUtil_Timer(TIMER_START);

			if( !CheckDevice() )
			{
				g_CLogM->AddEvent("[ERREUR] CheckDevice() a échoué");
				return false;
			}

			g_Device->Clear(NULL,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
			g_Device->BeginScene();


			//-----------Acquisition des données périphériques----------
			g_CIM->ActualiseState();
			g_SA->m_Time = DXUtil_Timer(TIMER_GETAPPTIME);
			g_SA->m_RealTime = CurrentTime;
			g_SA->m_LastChar = g_CIM->GetInputChar();
			g_SA->m_LeftButton = g_CIM->GetButtonsState(1);
			g_SA->m_RightButton = g_CIM->GetButtonsState(2);
			g_SA->m_x = g_CIM->GetBattleX();
			g_SA->m_y = g_CIM->GetBattleY();

			//------------Dessin et calcul d'une frame-------------
			g_Cadre->Draw();
			g_CLM->RenderFrame();
			if (!g_CMM->RenderFrame() )
				return false;

			//------------Calcul des FPS
			if( g_COPPtr->GetFps() )
			{
				dwFrames++;
				PrintText(g_FPS,0,0,D3DCOLOR_ARGB(255,0,255,64),WBF_IMPACT);
			}
		}
		//------------Verifie l'utilité d'une texture-----------
		if( CurrentTime - Timer > 1.0f )
		{
			g_CTM->Head_Reset();

			for(int i=0; i<g_ListSize ; i++)
			{
				STexture* l_TexTmp = g_CTM->Head_GetPointer();

				if( l_TexTmp && l_TexTmp->m_Loaded )	//Si texture chargée => vérifie temps
					if( CurrentTime - l_TexTmp->m_LastTimeUsed > 7.0f ) //7s
						g_CTM->Head_UnloadTexture();

				g_CTM->Head_Next();
			}
			//FPS
			sprintf(g_FPS,"%.2f",dwFrames / (CurrentTime - Timer));
			dwFrames = 0;
			Timer = CurrentTime;
		}

		/*char tmp[20];
		sprintf(tmp,"RealTime : %.1f",g_SA->m_RealTime);
		PrintText(tmp,5,300,D3DCOLOR_ARGB(255,0,255,64),WBF_IMPACT);
		sprintf(tmp,"Time : %.1f",g_SA->m_Time);
		PrintText(tmp,5,350,D3DCOLOR_ARGB(255,0,255,64),WBF_IMPACT);*/

		//-----------Affichage de la frame----------------------
		if (!DontPlay)
		{
			g_Device->EndScene();
			g_Device->Present(NULL,NULL,NULL,NULL);
		}
		else
		{
			DXUtil_Timer(TIMER_STOP);
			Sleep(100);
		}
	}
	return true;
}


//----------------------------------------------------------------------------------------------//
//																								//
//																								//
//																								//
//------------------------------Fonction de traitement des messages-----------------------------//
//																								//
//																								//
//																								//
//----------------------------------------------------------------------------------------------//
LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
		/*case WM_CLOSE:
		case WM_DESTROY:
		case WM_ENDSESSION:
		case WM_QUIT:
			g_CallBoucle=false;
			break;*/
	default:
		break;
	}
	return DefWindowProc(hwnd, message, wParam, lParam);
}



//----------------------------------------------------------------------------------------------//
//																								//
//																								//
//																								//
//----------------------------------------Fonction WinMain--------------------------------------//
//																								//
//																								//
//																								//
//----------------------------------------------------------------------------------------------//
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
{
	//------Variables de gestion générale
	g_Instance = hInstance;
    MSG Msg;
	bool l_Abort = false;
	bool l_ExtractActionFailed=false;

#ifndef _DEBUG
	CSplashScreen::Run();
#endif

	//------Création d'un objet de gestion de logs
	g_CLogM = new CLogsManager(true,true,true,true,true,true,"WB.log");
	g_CLogM->AddEvent("CLogsManager créé");

	//------Création de la classe de fenêtre
    WNDCLASSEX wc;
    wc.hInstance = hInstance;
    wc.lpszClassName = szClassName;
    wc.lpfnWndProc = WindowProcedure;
    wc.style = 0/*CS_OWNDC*/;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_WATERBALL));
    wc.hIconSm = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_WATERBALL));
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.lpszMenuName = NULL;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
    if(!RegisterClassEx(&wc))
	{
/*#ifndef _DEBUG
		CSplashScreen::Exit();
#endif
		return 0;*/		//apparemment pas nécessaire : classe déjà enregistrée
		g_CLogM->AddEvent("Méthode RegisterClassEx échouée");
	}

	//création de l'interface de transmission des infos périphériques
	g_SA = new SRenderArgs;
	if( g_SA == NULL )
	{
		g_CLogM->AddEvent("Impossible de créer la structure d'arguments");
		l_Abort = true;
	}
	g_CLogM->AddEvent("Structure d'arguments créée");

	//------Chargement des paramètres à partir du registre
	int Res_X, Res_Y;
	g_CReg = new CRegManager();	//création du gestionnaire de registre
	if( g_CReg == NULL )
	{
		g_CLogM->AddEvent("Erreur dans l'initialisation du registre");
		FreeAll();
#ifndef _DEBUG
		CSplashScreen::Exit();
#endif
		return -1;	//si erreur on quitte
	}
	else
	{
		char l_MainKey[256];
		strcpy(l_MainKey,"Software\\Waterball\\");

		g_CReg->SetHK( HKEY_CURRENT_USER );
		g_CReg->SetKey( l_MainKey );

		g_CReg->SetValueName( "Res" );

		if (g_CReg->rGetInt() == -1)	//la clé registre n'existe pas !
		{
			//mise en place des valeurs par défault
			Res_X = 800;
			Res_Y = 600;
			g_SA->m_Zoom = 0.781f;
			g_TexQual=2;
			g_Skin=0;
			strcpy(g_SkinName,"Skins\\WaterData.wbr");

			//initialisation du registre
			g_CReg->SetValueName( "Res" );
			g_CReg->rWriteInt(g_ResolutionIs800);
			g_CReg->SetValueName( "Window" );
			g_CReg->rWriteInt(g_Windowed);
			g_CReg->SetValueName( "TexQuality" );
			g_CReg->rWriteInt(g_TexQual);
			g_CReg->SetValueName( "Volume" );
			g_CReg->rWriteInt(g_Volume);
			g_CReg->SetValueName( "Skin" );
			g_CReg->rWriteInt(g_Skin);
			g_CReg->SetValueName( "ShowFPS" );
			g_CReg->rWriteInt(
#ifdef _DEBUG 
								true 
#else 
								false 
#endif
								);
		}
		else							//le registre a déjà été initialisé
		{
			g_ResolutionIs800 = g_CReg->rGetInt()?true:false;

			if( g_ResolutionIs800 )
			{
				Res_X = 800;
				Res_Y = 600;
				g_SA->m_Zoom = 0.781f;
			}
			else
			{
				Res_X = 1024;
				Res_Y = 768;
				g_SA->m_Zoom = 1.0f;
			}

			g_CReg->SetValueName( "Window" );
			g_Windowed = g_CReg->rGetInt()?true:false;

			g_CReg->SetValueName( "TexQuality" );
			g_TexQual = g_CReg->rGetInt();

			g_CReg->SetValueName( "Volume" );
			g_Volume = g_CReg->rGetInt();

			g_CReg->SetValueName( "Skin" );
			g_Skin = g_CReg->rGetInt();

			switch(g_Skin)
			{
			case 1:
				strcpy(g_SkinName,"Skins\\MatrixData.wbr");
				break;
			case 2:
				strcpy(g_SkinName,"Skins\\DarkData.wbr");
				break;
			case 3:
				strcpy(g_SkinName,"Skins\\Skin4.wbr");
				break;
			default:
				strcpy(g_SkinName,"Skins\\WaterData.wbr");
			}
		}
	}

	//------Création de la fenêtre
	//initialisation de variables
	#ifdef _DEBUG
		#define CHOIX_AFF NULL
	#else
		#define CHOIX_AFF WS_POPUP
	#endif
    DWORD Flag;
	if( g_Windowed && Res_X==GetSystemMetrics(SM_CXSCREEN) )
		Flag = WS_CLIPCHILDREN | WS_CAPTION;
	else
		Flag = WS_CLIPCHILDREN;
	//création elle-même
    g_hDlg = CreateWindowEx(
           0,                   //Extended possibilites for variation
           szClassName,         //Classname
           szClassName,         //Title Text
           CHOIX_AFF | Flag ,	//default window
           0,					//Windows decides the position
           0,					//where the window ends up on the screen
           Res_X,               //The programs width
           Res_Y,               //and height in pixels
           NULL,				//The window is a child-window to desktop
           NULL,                //No menu
           hInstance,			//Program Instance handler
           NULL                 //No Window Creation data
           );
	//validation
	g_CLogM->AddEvent("Fenêtre créée");
	g_CLogM->AddEvent("Opérations registre effectuées");

	//-----Initialisation de l'extraction des ressources (sons et graphismes)
	g_CRM = new CResManager("UnAceV2.Dll","_wbr",true);
	if( g_CRM->GetErrValue() > 0 )
	{
		MessageBox(g_hDlg,"UnaceV2.dll non présente sur ce systeme !","Erreur fatale !",MB_ICONHAND);
		FreeAll();
#ifndef _DEBUG
		CSplashScreen::Exit();
#endif
		return -1;
	}

	//------Chargement du skin
	if( !FileExist(g_SkinName) )
	{
		MessageBox(g_hDlg,"Skin sélectionné inexistant !","Erreur fatale !",MB_ICONHAND);
		assert(1!=1);	//big problème

		strcpy(g_SkinName,"Skins\\WaterData.wbr"); //on met celui par defaut

		if( !FileExist(g_SkinName) )
		{
			MessageBox(g_hDlg,"Aucun skin présent !","Erreur fatale !",MB_ICONHAND);
			g_CLogM->AddEvent("! Erreur ! Aucun skin présent !");
			FreeAll();
#ifndef _DEBUG
			CSplashScreen::Exit();
#endif
			return -1;
		}
	}

	//------Extraction des ressources
	DeleteTemporaryFiles();
	g_CRM->SetArchiveName(g_SkinName);
		char *ptc=new char[7];	//petit codage express du password
		for (int f=0;f<6;f++)
			ptc[f]=0x60;
		int in=0;
		ptc[in++]+=4;
		ptc[in++]+=9;
		ptc[in++]+=5;
		ptc[in++]+=16;
		ptc[in++]+=16;
		ptc[in++]+=5;
		ptc[in]=NULL;
	g_CRM->SetArchivePassword(ptc);
		delete ptc;
	if( !g_CRM->Extract() )
		l_ExtractActionFailed=true;
	else
		g_CLogM->AddEvent("Ressources extraites");
	
	
	if (l_ExtractActionFailed)
	{
		MessageBox(g_hDlg,"Impossible d'extraire les ressources !","Erreur fatale !",MB_ICONHAND);
		FreeAll();
#ifndef _DEBUG
		CSplashScreen::Exit();
#endif
		return -1;
	}

	//------Test de la version de DirectX
	if( GetDXVersion() < 0x900 )
	{
		MessageBox(g_hDlg,"Ce jeu requiert une version 9, ou ultérieure, de DirectX pour fonctionner","Erreur fatale !",MB_ICONHAND);
		FreeAll();
#ifndef _DEBUG
		CSplashScreen::Exit();
#endif
		return -1;
	}
	g_CLogM->AddEvent("DirectX 9 supporté");

	//-----Initialisation de DirectGraphics pour DX9
#ifndef _DEBUG
	if( !InitDGraphics(1024,768,12+(g_TexQual*12),g_Windowed) )
#else
	if( !InitDGraphics(1024,768,24,true) )
#endif
	{
		l_Abort = true;
		MessageBox(g_hDlg,"Impossible d'initialiser DGraphics !","Erreur fatale !",MB_ICONHAND);
	}

	//-----Création et initialisation des polices
	g_FontTab = LoadFonts(g_FontTab,"FontList.wbf") ;
	if( g_FontTab == NULL )
	{
		l_Abort = true;
		MessageBox(g_hDlg,"Impossible d'initialiser les polices !","Erreur fatale !",MB_ICONHAND);
	}
	else
	{
		HFONT l_TmpFont;
		g_FontList = new LPD3DXFONT[g_NumbOfFonts];

		for(int k=0 ; k<g_NumbOfFonts ; k++)
		{
			l_TmpFont = CreateFont( g_FontTab[k].m_Size,		//taille de la police : 10, 12, 16, etc
								  0, 0, 0,
								  g_FontTab[k].m_Flag,			//texte gras ou non
								  g_FontTab[k].m_Italic,		//italique : true ou false
								  g_FontTab[k].m_Underlined,    //souligné : true ou false
								  FALSE,
								  ANSI_CHARSET,
								  OUT_DEFAULT_PRECIS,
								  CLIP_DEFAULT_PRECIS,
								  ANTIALIASED_QUALITY,
								  VARIABLE_PITCH,
								  g_FontTab[k].m_Name);

			D3DXCreateFont( g_Device, l_TmpFont, &g_FontList[k] );
			DeleteObject( l_TmpFont );
		}
	}

	//------------Initialisation du tableau pour la génération de bonus
	InitBonusTableAndBriquesTable();

	//---------Mise en place du support des primitives
	g_PrE = new CPrimitivesEngine(g_Device, &g_d3dpp);
	g_CLogM->AddEvent("Moteur de primitives initialisé");

	//-----Creation d'un objet pour gérer les textures-------
	g_CTM = new CTexManager(g_Device,&g_d3dpp);
	if( g_CTM->GetErrValue() > 0 )
	{
		MessageBox(g_hDlg,"Impossible d'initialiser le gestionnaire de textures !","Erreur fatale !",MB_ICONHAND);
		l_Abort = true;
	}

	//-----Création d'un objet pour gérer les sons-------
	g_CMuM = new CMusicManager();
	if( g_CMuM->GetErrValue() > 0 )
	{
		MessageBox(g_hDlg,"Impossible d'initialiser DMusic !","Erreur fatale !",MB_ICONHAND);
		l_Abort = true;
	}
	g_CLogM->AddEvent("DirectX 9 initialisé");

	//-----Réglage du volume et des sons
	if( g_Volume>-1 && g_Volume<12 )
		g_CMuM->SetVolume( g_Volume*100/11 );
	else
		g_CMuM->SetVolume( VOLUME_DEFAULT_IN_PERCENT );
	
	
	c_Tmp = new char*[NbWav];
	int l_Volume = 0;
	
	for (int w=0 ; w!=NbWav ; w++)
	{
		c_Tmp[w] = new char[strlen(g_CRM->GetFilesDir())+strlen(WavNames[w])+1];
		strcpy(c_Tmp[w],g_CRM->GetFilesDir());
		strcat(c_Tmp[w],WavNames[w]);

		if( w > 26 )
			l_Volume = 0;

		if( g_CMuM->AddToPlayList(c_Tmp[w],false,false,l_Volume) == -1 )
		{
		 l_Abort = true;

		 char l_Msg[256] = "Impossible de charger le son nommé ";
		 strcat(l_Msg,WavNames[w]);
		 g_CLogM->AddEvent(l_Msg);
		 MessageBox(g_hDlg,l_Msg,"Erreur Fatale !",0+MB_ICONHAND);
		}
	}

	if( !l_Abort )
		g_CLogM->AddEvent("Sons créés");


	//-------Création des textures-------------
	l_Tmp = new char*[NbBmp];
	float l_Time = DXUtil_Timer(TIMER_GETAPPTIME);
	for (int i=0 ; i!=NbBmp ; i++)
	{
		l_Tmp[i] = new char[strlen(g_CRM->GetFilesDir())+strlen(BmpNames[i])+1];
		strcpy(l_Tmp[i],g_CRM->GetFilesDir());
		strcat(l_Tmp[i],BmpNames[i]);

		if(	g_CTM->AddTexture(l_Tmp[i],l_Time,Coor[i][0],Coor[i][1]) == -1 )
		{
			char* l_ErrMsg;
			l_ErrMsg = new char[22 + strlen(BmpNames[i]) + 3];
			strcpy(l_ErrMsg,"Impossible de charger ");
			strcat(l_ErrMsg,BmpNames[i]);
			strcat(l_ErrMsg," !");

			MessageBox(g_hDlg,l_ErrMsg,"Erreur fatale !",MB_ICONHAND);
			delete [] l_ErrMsg;
			l_Abort = true;
		}
	}
    g_BrickTex = (*g_CTM)[GX_BRIQUES]->m_lpTexture;
	g_CLogM->AddEvent("Textures créées");
	
	//---------------------Création des éléments de jeu
	//création du fond
	g_Cadre = new CCadre(g_Device ,g_D3DXSprite ,&g_d3dpp);
	g_Curseur = new CCurseur(g_Device ,g_D3DXSprite ,&g_d3dpp);
	if( g_Cadre==NULL || g_Curseur==NULL )
	{
		MessageBox(g_hDlg,"Impossible d'initialiser le cadre ou le curseur !","Erreur fatale !",MB_ICONHAND);
		l_Abort = true;
	}
	//création du jeu
	g_CLM = new CLevelsManager(g_Device ,g_D3DXSprite ,&g_d3dpp, "Default.wbl");
	if( g_CLM->GetErrValue() > 0 )
	{
		MessageBox(g_hDlg,"Impossible d'initialiser le gestionnaire de niveau !","Erreur fatale !",MB_ICONHAND);
		l_Abort = true;
	}
	//création du menu
	g_CMM = new CMenuManager(g_Device ,g_D3DXSprite ,&g_d3dpp, "Default.wbs");
	if( g_CMM == NULL || g_CMM->GetErrValue() > 0 )
	{
		MessageBox(g_hDlg,"Impossible d'initialiser le gestionnaire de menu !","Erreur fatale !",MB_ICONHAND);
		l_Abort = true;
	}

	//Gestion des paramètres du registre
	g_COPPtr = g_CMM->GetPanelPtr();
	g_CReg->SetValueName( "ShowFPS" );
	if( g_COPPtr==NULL || g_CReg->rGetInt()==-1 )
	{
		MessageBox(g_hDlg,"Impossible d'initialiser un panel de contrôle !","Erreur fatale !",MB_ICONHAND);
		l_Abort  = true;
	}
	g_COPPtr->SetFps( g_CReg->rGetInt()?true:false );

	//-----Initialisation de DirectInput
	g_CIM = new CInputManager();
	if (g_CIM)
		if ( !g_CIM->Init(hInstance,g_Windowed) )
		{
			MessageBox(g_hDlg,"Impossible d'initialiser DInput !","Erreur fatale !",MB_ICONHAND);
			l_Abort = true;
		}

	//--------------------Si erreur il y a, quitter il faut alors...
	if( l_Abort )
	{
		g_CLogM->AddEvent("Une erreur s'est produite dans l'initialisation");
		FreeAll();
#ifndef _DEBUG
		CSplashScreen::Exit();
#endif
		return -1;
	}

	//------Dernières initialisations
	g_CLogM->AddEvent("Initialisation complète, lancement de la boucle de jeu");
	g_ListSize = g_CTM->GetSize();

#ifndef _DEBUG
	CSplashScreen::Exit();
#endif
    ShowWindow(g_hDlg, nCmdShow);
	SetForegroundWindow(g_hDlg);

	sprintf(g_ProgInfos,"- Waterball %.1f Built on %s at %s -",_version,_date,_time);

	g_CMuM->DSPlayNextMusic(true);
	
	//--------------------Boucle de jeu : c'est parti !!!!!!!!
	g_CallBoucle=true;
	while(g_CallBoucle && IsWindow(g_hDlg))
	{
//pour les erreurs non debug
#ifndef _DEBUG
		try{
#endif
			if( PeekMessage(&Msg, NULL, 0, 0, PM_NOREMOVE) )
			{
				if (Msg.message == WM_QUIT)
					g_CallBoucle=false;
				else
				{
	       			GetMessage(&Msg,NULL,0,0);
	       			//TranslateMessage(&Msg);
			   		//DispatchMessage(&Msg);
					WindowProcedure(g_hDlg,Msg.message,Msg.wParam,Msg.lParam);
				}
			}
			else
			{
				if( !Update() ) g_CallBoucle=false;
			}
//suite de "pour les erreurs non debug"
#ifndef _DEBUG
		}catch(...)
		{
			g_CLogM->AddEvent("Erreur dans la boucle de jeu");

			g_CallBoucle=false;
		}
#endif
	}
	g_CLogM->AddEvent("Boucle de jeu interrompue");

	//-----Suppressions finales
	FreeAll();
	DestroyWindow(g_hDlg);
	PostQuitMessage(0);
	UnregisterClass(szClassName,g_Instance);
    return Msg.wParam;					//on quitte proprement
}

Conclusion

www.waterball.fr.st
www.nahelworks.fr.st

Sur ces sites, vous trouverez les executables et surtout les ressources pour lancer le jeu (skin, etc... => 20Mo)
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

28 juillet 2004 10:27:35 :
Description plus précise du projet et de ses sources
26 août 2004 10:57:37 :
-------------Waterball------------- Changelog de la version 1.1 par rapport à la 1.0 AJOUT - Splash screen durant le chargement. AJOUT - Effet d'ondulation sur les images du menu. AJOUT - Informations sur l'executable dans la compilation AJOUT - Bonus Balle Multiple (nom officiel) (fonctionnement avec son et adaptation aux autres bonus). AJOUT - Gestion de trois musiques pour le jeu. FIX - Fondu pour une apparition moins brutale des crédits FIX - Meilleure gestion du volume. FIX - Boîte de dialogue de confirmation du changement des options à bon escient. FIX - Accélération du générique. FIX - Rectification des liens vers les dossiers PDF. FIX - Optimisation de certaines parties du code. FIX - Titre dans le menu "Crédit" comprennant à présent des informations sur l'executable. FIX - Bugs dans le titre de la section "Credits" FIX - On passe d'un rendu logiciel (D3DCREATE_SOFTWARE_VERTEXPROCESSING) à un rendu matériel (D3DCREATE_HARDWARE_VERTEXPROCESSING) => Qualité du rendu des vertex accrue (plus d'effet de confusion (ex: messagebox)) FIX - La méthode GetBackBuffer est correctement appelée : on a un pointeur valide sur le 1er backbuffer FIX - Les vagues sont adaptées pour les boutons petits : Petit Retour et Records. FIX - Conformation de l'indication score à la norme graphique. FIX - Bug de désactivation d'aimant et de balle folle. FIX - Réduction de la taille du skin matrix de 3 mo. FIX - Vérification complète de l'intégrité des fichiers ressources (images et +sons+). FIX - Bug de perte du device résolu à quasiment 100%
12 septembre 2004 20:57:20 :
Correction d'un sérieux bug ! On ne pouvait pas en avoir connaissance sous w2k (on développe dessous) car celui ci (et les windows de version supérieures) libére automatiquement toutes les ressources allouées pour le logiciel. Résultat, nous ne nous étions pas rendus comptes que lorsqu'on fermait WaterBall avec ALT+F4, RIEN N'ETAIT LIBERE.... donc assez embetant.
26 octobre 2004 17:06:29 :
Correction du bug qui empechait le jeu de se lancer et se produisait durant l'execution du splash screen

Commentaires et avis

signaler à un administrateur
Commentaire de Xs le 27/07/2004 22:53:36

Ah oui au fait : ce jeu est fait avec la technologie DirectGraphics donc utilise DInput, D3D (billboarding), DMusic etc...

signaler à un administrateur
Commentaire de AlexMAN le 27/07/2004 23:50:25

Enfin un projet en dx ! Non je plaisante, mais c bien kan mm et ca m'intéresse, jV mater le code ds la semaine.

merci ++

signaler à un administrateur
Commentaire de ILoveDevelopp le 28/07/2004 10:05:35

Ca m'a l'air pas mal ce code, mais vu la quantité, y a peut-être des choses à améliorer je vais regarder un peu...

Sinon le screenshot est alléchant !

signaler à un administrateur
Commentaire de Xs le 28/07/2004 10:11:23

La quantité ? 11058 lignes au dernier recensement :-D

signaler à un administrateur
Commentaire de Funto66 le 28/07/2004 12:12:22

Tu pourrais mettre le(s) exe(s) stp? parce que là, grosse flemme de télécharger le DirectX 9 SDK, qui est énorme...

signaler à un administrateur
Commentaire de Xs le 28/07/2004 12:40:13

Ah ben faut lire jusqu'au bout : www.waterball.fr.st pour les exe et les ressources... (20Mo ca ce met pas sur le site)

signaler à un administrateur
Commentaire de Penguin_X le 28/07/2004 13:19:01

Wow. Mes programmes sont minables LOL. Tas codé sa tout a la main ?

signaler à un administrateur
Commentaire de Xs le 28/07/2004 13:44:01

Bah en fait quand j'avais mal au poigné, j'utilisai mes pieds.

Euh je comprend pas trop ta question au sens propre.
Pour infos, peut etre que ca répondra a ta question, nous l'avons codé avec VC++ 6 (pas de C Managed, on hais ca).

signaler à un administrateur
Commentaire de ILoveDevelopp le 28/07/2004 16:15:58

euh c'est normal si j'arrive pas à lire les fins des phrases de la description de la source parce qu'elles sortent du cadre ?

Sinon bravo pour le jeu et je vous conseillerais d'être un peu mieux organisé dans votre code, mais remarque je vois pas trop comment faire mieux :D.

signaler à un administrateur
Commentaire de Funto66 le 28/07/2004 16:48:33

Oups pardon je m'excuse...
J'ai donc pu tester votre jeu, et j'ai plein de choses à dire, je commence par les points positifs :
-bah c'est un casse-briques très poussé, avec de beaux graphismes (j'ai pas testé les 3 autres skins cependant), félicitations ;)
-les sons sont super et bien intégrés
-comme vous le dites y'a des bonus délirants (toutes les briques qui deviennent invisibles, l'orage aussi mdr :D
-l'installateur, ça fait pro :p
-le code est apparemment très bien organisé (je juge sur ce que vous avez décrit, l'organisation en classes)
-un point très important et qu'on ne remarque jamais : il n'y a AUCUN bug dans le jeu; la balle rebondit parfaitement...etc, ce qui est quand même assez rare pour être signalé.

Bon, maintenant les points négatifs (haha ! :p), et les suggestions :
-déjà, ce qui saute aux yeux, ou plutôt aux oreilles, c'est le manque d'ambiance sonore; faudrait mettre une (ou plusieurs) musique(s), qui change(nt) selont le menu, le jeu, le level...
-la souris dans le menu est + lente que les mouvements que l'on fait avec en réalité, je veux dire par là que quand on déplace la souris en 1 points elle y arrive un peu plus tard (je vois pas comment l'arranger cependant :( )
-dans l'écran Options, quand on ne modifie rien, et qu'on revient au menu principal, on a quand même la boîte de dialogue bleue (que je trouve moche d'ailleurs, elle est pas intégrée avec le reste des graphismes du jeu, dsl :( ), et faudrait aussi que ça ne soit pas nécessaire de redémarrer le jeu pour avoir une autre skin...
-au sujet du générique, je le trouve bien fait mais trop lent, trop petit (je parle de la zone où défile le texte) et faudrait éviter que les noms apparaissent d'un seul coup, ça serait mieux si c'était fait progressivement.
-pour finir, je jouais tranquille et j'en étais au niveau 3, tout content, quand tout à coup ce c** de Mozilla m'ouvre une boîte de dialogue envoyée par nomade.fr qui met leur fenêtre en 1er plan; je perds donc ma balle, mais pire : quand je reviens au jeu, l'écran reste noir :(
Faudrait faire un "vrai" fullscreen, et désactiver le Alt+TAB, le Alt+F4...etc D'ailleurs il me semble qu'avec DirectX (je m'y connais pas bcp, moi c plutôt OpenGL^^) il y a un truc pour récupérer le Graphics Device si on l'a perdu, ça viendrait peut-être de là?

Voilà, fin de mon laius; pour résumer : votre jeu est cool ;)

signaler à un administrateur
Commentaire de jmhC le 28/07/2004 18:59:11

Celà à l'air pas mal. Mais un exe aurait été sympa pour se faire une idée globale !

signaler à un administrateur
Commentaire de Funto66 le 28/07/2004 20:10:32

L'exe est sur son site, il le dit plus haut (j'essaie de me rattraper lol).
J'avais aussi oublié de préciser que dans les remerciements le site de prografix est donné avec la vieille adresse sur free.fr au lieu de la nouvelle sur Games-creators.com

signaler à un administrateur
Commentaire de Xs le 28/07/2004 20:16:41

jmhC => y'en a qui ont al tete plutot dure. www.waterball.fr.st je répete que 17Mo ca tient pas ici.

funto66 > Ca c'est un commentaire constructif. Tout ce que tu as dit en "point négatif" et suggestion a été pris en compte. Ca veut pas dire qu'on fera tout (si c'est pas dans l'esprit du jeu). Mais sache que l'on a retenu :

musiques (paramétrée ?) -> CSoundManager
- options non modifiées : pas besoin de confirmer
- générique un peu trop lent, et les noms devraient apparaître progressivement
- bug écran noir

Pour le générique, c'est juste une constante a modifier. On va légerement accélerer la chose.
Pour les options, c'est résolu.
La musique, je m'en charge et fais ca (enfin, je fais le gestionnaire, helio nous retrouvera une bonne zik)
L'ecran noir apparait aussi chez moi et impossible de savoir d'ou ca  provient. Ca me faisait la meme chose avec CS 1.5 en DX....

Pour les credits et les noms qui apparaissent de but en blanc je vais te rectifier ca :D (mais PrintText ne peut afficher une partie d'un texte si tu vois ce que je veux dire, on fera nécesseraiment un fondu).

Toutes ces corrections et les updates prévues (2 bonus, 1 brique, et je sais plus quoi) arriveront d'ici la fin aout maxi (vacances obligent).

Cordialement et merci encore.

ps : Helio va etre content pour la raquette : on a s'y est repris a plusieurs reprises pour les rebonds (sache qu'en difficile les rebonds sur la raquette sont fait en fonction de la vitesse de la balle et de la direction de la raquette (et la balle) et qu'en normal/facile, ce sotn des rebonds classiques).

pps : je n'arrive pas a passer le 3e level, et ne connais pas bcp de monde qui passe le 5 ou 6e.

signaler à un administrateur
Commentaire de jmhC le 28/07/2004 20:17:58

Merci pour l'info, mais connection impossible sur les 2 sites.

signaler à un administrateur
Commentaire de Xs le 28/07/2004 20:20:37

Ah pour prografix c'est l'url qu'on utilse.
En fait, si tu regardes la source, tu veras que les credits sont dans CrtData.csf et organisés selon la syntaxe :

ma_phrase-ID_FONT|ROUGE|VERT|BLEU

ID_FONT va jusqu'a 4.
Si tu veux afficher ta phrase en rouge pur, tu n'as qu'a faire :

ma_phrase-ID_FONT|ROUGE

en vert pur :

ma_phrase-ID_FONT|ROUGE|VERT

etcc...

signaler à un administrateur
Commentaire de Xs le 28/07/2004 20:20:52

Ah pour prografix c'est l'url qu'on utilse.
En fait, si tu regardes la source, tu veras que les credits sont dans CrtData.csf et organisés selon la syntaxe :

ma_phrase-ID_FONT|ROUGE|VERT|BLEU

ID_FONT va jusqu'a 4.
Si tu veux afficher ta phrase en rouge pur, tu n'as qu'a faire :

ma_phrase-ID_FONT|ROUGE

en vert pur :

ma_phrase-ID_FONT|ROUGE|VERT

etcc...

ps : ui tu t'es rattrapé :D

signaler à un administrateur
Commentaire de Xs le 28/07/2004 20:34:08

Oups dsl triple post.
J'oubliais de dire que dans les options, une option invisible est situé sous "mode fenêtré" : elle affiche les FPS.

En parlant de FPS, ils oscillent entre 63.5 et 66 selon la charge du PC et surtout le probleme d'arrondi du timer (cf main.cpp::update() ). Sans limitations, en plein jeu on obtient aisement le 140 fps

signaler à un administrateur
Commentaire de Funto66 le 29/07/2004 02:20:37

Content de voir que mes remarques sont prises en compte :)

Je suis arrivé au level 5 :D score : 16 356 :)
Si mes FPS t'intéressent : j'en ai vers les 10 dans le menu (pas bcp qd même :(, mais bon c'est suffisant) et je tourne à 23 FPS dans le jeu.

J'ai encore quelques remarques à faire (ouais j'arrête pas :p) :
-y'a un problème lors de l'installation automatique; dans le dossier Démarrer les liens vers les fichiers PDF pointent vers des PDFs situés dans un sous-répertoire Documents, alors qu'en réalité les PDFs sont dans le répertoire du jeu lui-même, et que le dossier Documents n'existe pas.
-Pour ce qui est du rebond des balles, je sais pas si c'est normal mais ça m'arrive de rester "coincé" dans une trajectoire, qui peut se répéter dans un sens ou dans l'autre, c'est assez ch*** :( Aussi, il m'est arrivé que la balle change brusquement de direction O_o je vois pas pourquoi... Tout ce que je viens de dire concerne le mode difficile (j'ai pas testé les autres ;)).
-pour les briques qui se cassent après un certain nombre de coups, ce serait bien que graphiquement le niveau de la cassure actuelle soit visible; je veux dire par là, on donne un 1er coup et une 1ère fissure apparaît, un 2ème coup et la fissure grandit...etc.

Voilà c'est tout pour les remarques négatives/suggestions.

Et sinon j'ai aussi découvert d'autres bonus là, le mini-sol qui apparaît un moment sous la balle et l'explosion :) C'est bien fait tout ça ;)

signaler à un administrateur
Commentaire de Wett le 29/07/2004 08:16:42

Me retouvant dans l'impossibilite de tester, je tiens quand meme a vous feliciter pour une chose : Vous avez tenu ! Mine de rien vous etes 2 a coder, et tenir un projet pendant un an bah c'est une prouesse... Que je n'ai jamais reussie :)
Et puis le jeu a l'air complet, aboutit, un vrai projet quoi ! Ahh rien que de voir ca, bah ca m'a mit de bonne humeur... Je me mors les doigts de pas etre sur mon ordi :)

signaler à un administrateur
Commentaire de Xs le 29/07/2004 19:59:14

Funto666 > Sache que pour les briques, ont va faire selon tes recommendations. Pour les Pdf, c'est rectifié.

De plus, on a ajouté un splash screen :D

Tout cela dans la prochaine update

signaler à un administrateur
Commentaire de Funto66 le 30/07/2004 00:50:17

Yeah :) Ça fait vraiment plaisir de voir qu'on est écouté, ça m'arrive si rarement :D
Un détail : mon pseudo c'est Funto66, pas Funto666, simplement parce que j'habite dans le 66; aucune connotation diabolique ^^ Je suis sage moâ :p

signaler à un administrateur
Commentaire de Xs le 03/08/2004 18:32:11

Je me demande bien qui s'est amusé à mettre 4/10 (y'avais 10/10) sans aucunes justifications !

signaler à un administrateur
Commentaire de Funto66 le 03/08/2004 19:32:11

Pff y'a des cons partout, notamment sur ce site :(
D'ailleurs il me semble que le système de notations est buggué en plus :(
Enfin, j'avais pas voté au cas où ;) Je viens de te mettre un 10 ce qui te remonte à 8; tu le mérites bien ;)

signaler à un administrateur
Commentaire de hoxid le 18/08/2004 13:40:13

Waaa ! Super !
Super Xs ! Moi je suis debutant en C++, de plus que j'ai que 13 ans et que ya des trucs mathematiques en C++ que j'y piges rien parce que je l'ai pas lu en maths ! En fin bon je programme C++ depuis 3 jours ! Le code est super (je dis ca parce que j'y comprend rien) et ca a du etre dur ! Si tu peux me donner des conseils Xs, pour que je continue : hoxid@hotmail.com

signaler à un administrateur
Commentaire de Xs le 18/08/2004 17:57:06

Merci hoxid :D

3 jours seulement ? héhé ca va faire 4 ans pour moi :D
Des conseils ? Pas de problemes, dis moi par "mail" ce que tu voudrais savoir. Mais je ne saurais faire aussi bien que www.developpez.com ou même le forum juste sur ta droite sur la page d'acceuil.

Un code n'est pas bien seulement parce que tu n'y piges rien : un developpeur professionel ne pourrait pas tout comprendre de notre code car il ne l'a pas pensé lui-même, écrit lui-même. Chaque developpeur comprend principalement SON code (parce qu'il vient de SA logique). Pour capter celui d'un autre, y'a interêt qu'il soit vraiment aux normes (conventions, etc...).
Par exemple, essaie de comprendre celui de HL².... bon courage :D

Pour les maths, tu dois attaquer la 4e ou 3e d'ici pas longtemps ? Donc ne t'inquiete pas ca va venir tout seul. D'autant qu'en programmation, tu fais des maths appliquées, donc les notions rentre nettement plus facilement. Conitnue aussi la prog : ca aide a comprendre les principes de l'algorythmie, la logique récurrente, les vecteurs, etc... Les seules maths qu'on utilise sont des fonctions simples (tu verras ca en 3e, et même de suite tu peux te renseigner tu comprendras) telles que l'exponentielle (pour les points), et '1/x"

cordialement

signaler à un administrateur
Commentaire de hoxid le 18/08/2004 21:52:16

Ok merci Xs

signaler à un administrateur
Commentaire de hoxid le 18/08/2004 21:55:00

Euh... Xs ?
Tu sais sur www.developpez.com j'ai lu quelques trucs (et ils etaient bien) mais je compte aussi acheter des livres. C'est pas grave ?

signaler à un administrateur
Commentaire de Xs le 18/08/2004 22:00:16

LOlllll nan c'est pas grave du tout.
Mais j'ai renoncé aux livres parce que tu achetes un bouquin complet et dedans tu te serts d'une seule aprtie.

Mon ami Héliopraetor à acheté un ENORME pavé de Microsoft sur le C++  Il l'a lu, avalé, digéré et retenu. De mon coté, j'ai lu des tutoriaux (donc des documentations ciblant un probleme). Certes, j'ai mis un petit peu plus de temps à capter certains trucs, mais au final, on en est au même point.

Donc fait comme tu veux, sachant que tous les livres ne sont pas mauvais (ceux sur BCB sont trés bien, et de Microsoft Edition aussi).

signaler à un administrateur
Commentaire de hoxid le 18/08/2004 22:04:26

Ok. Merci. Bon a part ca mille felicitations pour ton jeu et si tu as un mail ou un MSN tu peux me le donner please si sa te derange pas ?
Merci de m'ecouter Xs, c'est pas le cas de tout le monde.

signaler à un administrateur
Commentaire de Xs le 26/08/2004 10:59:40

Salut tout le monde !

Juste pour vous dire qu'il y a eu une mise à jour plut^to fournie. Funto66, la majorité de tes suggestions ont été prises en compte

signaler à un administrateur
Commentaire de Xs le 26/08/2004 11:01:01

Pour les amateurs d'objets DX, on utilise à présent, en plus de DMusic, DShow pour l'ambiance.

signaler à un administrateur
Commentaire de Funto66 le 26/08/2004 12:17:39

Arf j'ai plus Visual C++ alors pour compiler c'est galère (d'autant plus que je sais pas si les fichiers StdAfx sont spécifiques à VC++, mais c'est possible...).
Tu pourrais mettre l'exe stp?

signaler à un administrateur
Commentaire de Xs le 26/08/2004 12:34:34

Salut funto66.

Rien n'a changé => www.waterball.fr.st pour le zip (exe + skins avec les nouvelles ressources).

signaler à un administrateur
Commentaire de Funto66 le 26/08/2004 16:35:35

Pfff excuse-moi je suis trop con j'avais déjà oublié ^^
Quand on fait la même erreur 2 fois d'affilée c'est que quelque part y'a qqch qui va pas lol.
Je vais tester la nouvelle version ;)

signaler à un administrateur
Commentaire de Funto66 le 02/09/2004 07:56:15

Bon oui j'ai mis du temps avant de le tester lol dsl, mais là je lance l'exe, et j'ai le splash screen et c'est tout...O_o
Le splash reste un certain temps jusqu'à ce que j'entende le bruit d'une MessageBox, seulement à mon avis celle-ci est cachée par le splash donc je ne peux pas te dire quelle est l'erreur, et là je dois quitter avec Ctrl+Alt+Suppr :'(

Je suis sous Win98SE - ATI Rage 128

Est-ce que tu pourrais faire une version sans splash histoire de voir ce qui ne va pas? C'est dommage parce que je me doute que le jeu doit être encore mieux que la fois d'avant :(

signaler à un administrateur
Commentaire de Xs le 02/09/2004 11:36:16

Hmm bizarre ton probléme.

Ok on va voir ca

signaler à un administrateur
Commentaire de Xs le 12/09/2004 21:01:09

Updaté.

Comme ca passe mal :
Correction d'un sérieux bug ! On ne pouvait pas en avoir connaissance sous w2k (on développe dessous) car celui ci (et les windows de version supérieures) libére automatiquement toutes les ressources allouées pour le logiciel

Résultat, nous ne nous étions pas rendus comptes que lorsqu'on fermait WaterBall avec ALT+F4, RIEN N'ETAIT LIBERE.... donc assez embetant.

Funto66 > je te fais la version sans splash dés que possible (bcp plus de taff en TS qu'en 1er alors pas bcp de temps libre !)

signaler à un administrateur
Commentaire de Xs le 13/09/2004 11:08:18

Voilà Funto66 : http://v.caltot.free.fr/nahelworks/WaterBall-nosplash.exe

J'attend tes commentaires

signaler à un administrateur
Commentaire de Funto66 le 13/09/2004 20:22:56

Je cite : "Erreur ! Affichage impossible en 32, 24 ou 16 bits ! Le programme va s'arrêter"
"Erreur fatale ! Impossible d'initialiser DGraphics !"
"Erreur fatale ! Impossible d'initialiser le gestionnaire de textures !"
"Erreur fatale ! Impossible de charger Bombe.bmp"
blablabla pour tous les BMPs et finalement plantage...
Je dois changer qqch à ma résolution?

signaler à un administrateur
Commentaire de Xs le 13/09/2004 21:05:49

Alors la c'est trés embetant !

Va falloir que tu me donnes ton msn ou un chan irc sur lequel on pourrais se voir en direct parce que la tu es le seul (a priori) a avoir ce probleme.

signaler à un administrateur
Commentaire de Funto66 le 13/09/2004 21:26:22

Pour MSN : funto66 at hotmail.com
Pour IRC : #Coder-Studio sur le réseau epiknet.

signaler à un administrateur
Commentaire de Xs le 26/10/2004 17:12:28

Correction du bug qui empechait le jeu de se lancer et se produisait durant l'execution du splash screen

signaler à un administrateur
Commentaire de Funto66 le 27/10/2004 11:18:33

Yeah, cool ça, je testerai quand je rebooterai sous Windows ;)

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,827 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.