Apelez si eu la cei care au mai multa experienta in ale programarii sa ma ajute sa gasesc de ce nu se compileaza urmatorul program. Vreau sa fac un mini-engine bazat pe DirectX pentru un posibil viitor joc. O sa postez fragmentele din cod in care compilatorul imi indica unde e greseala.
Programul e compus din cateva fisiere:
winmain.cpp (aici este functia WinMain in care creez doar un obiect de tip cApplication si apelez metoda Run() a acestuia)
Cod sursă:
#include "cApp.h"
intL WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{ /* aici imi indica 3 greseli si anume:
"1>c:beginning visual c++ 2005corescores 1.01winmain.cpp(5) : error C2628: 'cApp' followed by 'int' is illegal (did you forget a ';'?)"
"1>c:beginning visual c++ 2005corescores 1.01winmain.cpp(9) : error C2556: 'cApp WinMain(HINSTANCE,HINSTANCE,LPSTR,int)' : overloaded function differs only by return type from 'int WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
1> c:program filesmicrosoft visual studio 8vcplatformsdkincludewinbase.h(1875) : see declaration of 'WinMain' "
";1>c:beginning visual c++ 2005corescores 1.01winmain.cpp(9) : error C2371: 'WinMain' : redefinition; different basic types
1> c:program filesmicrosoft visual studio 8vcplatformsdkincludewinbase.h(1875) : see declaration of 'WinMain' "
*/
int a;
cApp App(nCmdShow, hInstance, 800, 600);
App.Run();
App.ShutDown();
return 0;
}
-system_core.cpp si system_core.h (aici se afla clasa cApplication care in principiu contine metode pentru crearea fereastrei in windows, functia Run() si mai contine si un handler la fereastra)
-cApp.cpp si cApp.h. Aici se afla clasa cApp care mosteneste pe cApplication si in care se rescriu metodele virtuale din cApplication :Init(), Frame() si ShutDown() specifice jocului. Mai jos fragmentul de cod contine prima eroare.
Cod sursă:
#include "cApp.h"
cApp::cApp( int nCmdShow,
HINSTANCE hInstance,
DWORD Width, DWORD Height,
int iFrameDelay,
DWORD XPos ,
DWORD YPos ,
BOOL Windowed)
:cApplication(nCmdShow, hInstance, Width, Height, iFrameDelay, XPos, YPos, Windowed)
{
/* pe linia de mai sus imi indica ca ar fi eroare urmatoare
1>c:beginning visual c++ 2005corescores 1.01capp.cpp(11) : error C2533: 'cApp::{ctor}' : constructors not allowed a return type
*/
m_pD3D = NULL;
m_pD3D = new cGraphic();
}
cApp::~cApp()
{
}
//+ definitia altor functii pe care din motive de spatiu nu le-am mai pus
Ordinea in care apar erorile e cam asa:
cApp.cpp
1>c:beginning visual c++ 2005corescores 1.01capp.cpp(11) : error C2533: 'cApp::{ctor}' : constructors not allowed a return type
1>winmain.cpp
1>c:beginning visual c++ 2005corescores 1.01winmain.cpp(5) : error C2628: 'cApp' followed by 'int' is illegal (did you forget a ';'?)
1>c:beginning visual c++ 2005corescores 1.01winmain.cpp(9) : error C2556: 'cApp WinMain(HINSTANCE,HINSTANCE,LPSTR,int)' : overloaded function differs only by return type from 'int WinMain(HINSTANCE,HINSTANCE,LPSTR,int)'
1> c:program filesmicrosoft visual studio 8vcplatformsdkincludewinbase.h(1875) : see declaration of 'WinMain'
1>c:beginning visual c++ 2005corescores 1.01winmain.cpp(9) : error C2371: 'WinMain' : redefinition; different basic types
1> c:program filesmicrosoft visual studio 8vcplatformsdkincludewinbase.h(1875) : see declaration of 'WinMain'
1>Generating Code...
1>Build log was saved at "file://c:Beginning Visual C++ 2005CoresCores 1.01DebugBuildLog.htm"
1>Cores 1.01 - 4 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
-graphyx_core.cpp si graphyx_core.h (aici se afla clasa cGraphic care inglobeaza functiile Direct3D-ului dar care momentan nu contine decat o functie de initializare a Direct3D-ului si un handler la Device).
O sa continui sa spun despre cum e structurat programul ca sa va faceti o idee mai buna despre ce e vorba.
Clasa cApp mosteneste clasa cApplication si e o clasa in care scriu codul specific jocului si scriu metodele virtuale din cApplication Init(), ShutDown() si Frame() care contin cod specific jocului. Pe langa aceste 3 metode virtuale mai sunt si doua metode virtuale GameStart() si GameEnd() care nu prea le-am folosit dar sunt puse acolo ca "sa fie".
Functia Run() din cApplication are in mare structura urmatoare:
Cod sursă:
Run()
{
InitCore(); //creeaza fereastra si apeleaza metodele virtuale care nu fac nimic Init() si GameStart()
while(TRUE)
{
if(mesaj)
{
trimite mesaj catre handlerul de mesaje
}
else
Frame() //este apelata metoda virtuala Frame() care in cAplication nu face nimic
}
}
In WinMain() instantiez un obiect cApp si apelez metoda Run() a acestuia in felul urmator
WINMAI()
{
cApp App(...)
cApp.Run()
cApp.ShutDownCore() //metoda a lui cApplication care apeleaza metoda virtuala ShutDown() si GameEnd()
// care sunt rescrise in cApp
}
Si putin cod din definitia clasei cApplication, poate are relevanta:
system_core.h
Cod sursă:
#ifndef _SYSTEM_CORE
#define _SYSTEM_CORE
#include
#include
#include
LRESULT CALLBACK WndProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam);
class cApplication
{
public:
//constructors & destructors
static cApplication* m_pApplication; //static pointer to the class
cApplication(
int nCmdShow,
HINSTANCE hInstance,
DWORD Width,
DWORD Height,
int iFrameDelay = 50,
DWORD XPos = 200, //up-left coord of window (if fullscreen doesn't matter)
DWORD YPos = 200, //up-left coord of window (if fullscreen doesn't matter)
BOOL Windowed = TRUE);
virtual ~cApplication();
//essential functions for the game core
BOOL InitCore(); //creates window and calls Init() and GameInit()
void ShutDownCore(); //calls GameEnd() and ShutDown()
int Run();
//virtual functions for overloading when creating games
virtual BOOL Init(){return TRUE;};
virtual void ShutDown(){};
virtual BOOL Frame(){return TRUE;}; //called once each frame;
virtual BOOL GameInit(){return TRUE;}; //called to initialize game data, called by InitCore()
virtual BOOL GameEnd(){return TRUE;}; //called to cleanup game data, called by ShutDownCore()
//window event callback function
LRESULT HandleEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); //
protected:
BOOL m_Windowed;
HWND m_hWnd;
HINSTANCE m_hInstance;
DWORD m_XPos;
DWORD m_YPos;
DWORD m_Width;
DWORD m_Height;
int m_iFrameDelay;
int m_nCmdShow;
int m_done; // 1 when game is exiting
};
#endif
system_core.cpp
Cod sursă:
#include "system_core.h"
cApplication *cApplication::m_pApplication = NULL;
//First the local window procedure
LRESULT CALLBACK WinProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam)
{
// Route all Windows messages to the game engine
return cApplication::m_pApplication->HandleEvent(hWindow, msg, wParam, lParam);
}
//Constructors and Destructors
cApplication::cApplication( int nCmdShow,
HINSTANCE hInstance,
DWORD Width,
DWORD Height,
int iFrameDelay, /* =50*/
DWORD XPos /*= 200*/,
DWORD YPos /*= 200*/,
BOOL Windowed /*= TRUE*/ )
{
m_Windowed = Windowed;
m_iFrameDelay = iFrameDelay;
m_done = 0;
if (m_Windowed)
{
m_XPos = XPos;
m_YPos = YPos;
}
else
{
m_XPos = 0;
m_YPos = 0;
}
m_Width = Width;
m_Height = Height;
m_hInstance = hInstance;
m_iFrameDelay = 50; //set the default frames per second
m_nCmdShow = nCmdShow;
m_pApplication = this;
}
cApplication::~cApplication()
{
}
Pana sa introduc clasa cGraphic a mers. Clasa cGraphic e un wrapper pentru Direct3D care momentan doar initializeaza Direct3D-ul si continte un pointer catre Direct3DDevice.
Am introdus un pointer catre cGraphic in clasa mea cApp si in metoda Init() am apelat metoda de initializare a lui cGraphic (in care se initializeaza Direct3D-ul)
Nu cred ca problema sta in cGraphic cine am gresit cumva cand am scris codul de mostenire al clasei cApp din cApplication.
Daca poate cineva sa ma ajute ii multumesc anticipat.