Skip to main content
GameDev.net gamedev.net
🔒 Locked

My First Game Engine PROBLEMS!

Started by arwez Jul 7, 2000 at 3:44 PM 10 replies 650+ views
Original Post
arwez
arwez
I get this error: --------------------Configuration: VinEngine - Win32 Debug-------------------- Compiling... TestEngine.cpp c:\myprojects\vinengine\testengine.cpp(48) : warning C4101: ''buffer'' : unreferenced local variable c:\myprojects\vinengine\testengine.cpp(146) : warning C4101: ''hdc'' : unreferenced local variable Skipping... (no relevant changes detected) VinEngine.cpp Linking... VinEngine.obj : error LNK2005: "void __cdecl InitializeDirectDraw(int,int,int)" (?InitializeDirectDraw@@YAXHHH@Z) already defined in TestEngine.obj VinEngine.obj : error LNK2005: "void __cdecl CreateDoubleBuffer(void)" (?CreateDoubleBuffer@@YAXXZ) already defined in TestEngine.obj VinEngine.obj : error LNK2005: "struct _DDSURFACEDESC2 ddsd" (?ddsd@@3U_DDSURFACEDESC2@@A) already defined in TestEngine.obj VinEngine.obj : error LNK2005: "struct IDirectDrawSurface4 * primsurf" (?primsurf@@3PAUIDirectDrawSurface4@@A) already defined in TestEngine.obj VinEngine.obj : error LNK2005: "struct HWND__ * hwnd" (?hwnd@@3PAUHWND__@@A) already defined in TestEngine.obj VinEngine.obj : error LNK2005: "struct IDirectDrawSurface4 * backsurf" (?backsurf@@3PAUIDirectDrawSurface4@@A) already defined in TestEngine.obj VinEngine.obj : error LNK2005: "struct IDirectDraw4 * ddraw4obj" (?ddraw4obj@@3PAUIDirectDraw4@@A) already defined in TestEngine.obj Debug/VinEngine.exe : fatal error LNK1169: one or more multiply defined symbols found Error executing link.exe. VinEngine.exe - 8 error(s), 2 warning(s) ****************************************************** HEADER FILE OF ENGINE ****************************************************** //VINENGINE.H #ifndef VinEngine #define VinEngine LPDIRECTDRAW4 ddraw4obj; LPDIRECTDRAWSURFACE4 primsurf, backsurf; DDSURFACEDESC2 ddsd; HWND hwnd; void InitializeDirectDraw(int width, int height, int bpp); void CreateDoubleBuffer(); #endif ****************************************************** ****************************************************** CPP FILE OF ENGINE ****************************************************** ************* #define WIN32_LEAN_AND_MEAN #include #include"VinEngine.h" #include void InitializeDirectDraw(int width, int height, int bpp) { LPDIRECTDRAW ddraw1obj; if(FAILED(DirectDrawCreate(NULL, &ddraw1obj, NULL))) return; if(FAILED(ddraw4obj->QueryInterface(IID_IDirectDraw4, (LPVOID *)&ddraw4obj))) return; ddraw1obj->Release(); ddraw1obj = NULL; if(FAILED(ddraw4obj->SetCooperativeLevel(hwnd, DDSCL_FULLSCREEN // DDSCL_ALLOWMODEX // DDSCL_EXCLUSIVE // DDSCL_ALLOWREBOOT))) return; if(FAILED(ddraw4obj->SetDisplayMode(width, height, bpp, NULL, NULL))) return; } void CreateDoubleBuffer() { DDSURFACEDESC2 surfdesc; memset(&surfdesc,0,sizeof(surfdesc)); surfdesc.dwSize=sizeof(surfdesc); surfdesc.dwFlags= DDSD_CAPS // DDSD_BACKBUFFERCOUNT; surfdesc.dwBackBufferCount = 1; surfdesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE // DDSCAPS_COMPLEX // DDSCAPS_FLIP; if(FAILED(ddraw4obj->CreateSurface(&surfdesc,&primsurf,NULL))) return; surfdesc.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; if(FAILED(primsurf->GetAttachedSurface(&surfdesc.ddsCaps,&backsurf))) return; } ***************************************** ***************************************** MAIN CPP FILE TO TEST ENGINE ***************************************** ****************************************** // MAIN CPP TO TEST ENGINE! // INCLUDES /////////////////////////////////////////////// #define WIN32_LEAN_AND_MEAN // just say no to MFC #include // include important windows stuff #include #include #include // include important C/C++ stuff #include #include #include #include #include #include #include #include #include #include #include #include "VinEngine.h" #include "VinEngine.cpp" // DEFINES //////////////////////////////////////////////// // defines for windows #define WINDOW_CLASS_NAME "WINCLASS1" // MACROS ///////////////////////////////////////////////// #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) #define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1) // GLOBALS //////////////////////////////////////////////// HWND main_window_handle = NULL; // globally track main window HINSTANCE hinstance_app = NULL; // globally track hinstance char buffer[80]; // general printing buffer // FUNCTIONS ////////////////////////////////////////////// LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { // this is the main message handler of the system PAINTSTRUCT ps; // used in WM_PAINT HDC hdc; // handle to a device context char buffer[80]; // used to print strings // what is the message switch(msg) { case WM_CREATE: { // do initialization stuff here // return success return(0); } break; case WM_PAINT: { // simply validate the window hdc = BeginPaint(hwnd,&ps); // end painting EndPaint(hwnd,&ps); // return success return(0); } break; case WM_DESTROY: { // kill the application, this sends a WM_QUIT message PostQuitMessage(0); // return success return(0); } break; default:break; } // end switch // process any messages that we didn''t take care of return (DefWindowProc(hwnd, msg, wparam, lparam)); } // end WinProc /////////////////////////////////////////////////////////// int Game_Main(void *parms = NULL, int num_parms = 0) { // this is the main loop of the game, do all your processing // here // for now test if user is hitting ESC and send WM_CLOSE if (KEYDOWN(VK_ESCAPE)) SendMessage(main_window_handle,WM_CLOSE,0,0); // return success or failure or your own return code here return(1); } // end Game_Main //////////////////////////////////////////////////////////// int Game_Init(void *parms = NULL, int num_parms = 0) { // this is called once after the initial window is created and // before the main event loop is entered, do all your initialization // here // return success or failure or your own return code here return(1); } // end Game_Init ///////////////////////////////////////////////////////////// int Game_Shutdown(void *parms = NULL, int num_parms = 0) { // this is called after the game is exited and the main event // loop while is exited, do all you cleanup and shutdown here // return success or failure or your own return code here return(1); } // end Game_Shutdown // WINMAIN //////////////////////////////////////////////// int WINAPI WinMain( HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) { WNDCLASSEX winclass; // this will hold the class we create HWND hwnd; // generic window handle MSG msg; // generic message HDC hdc; // graphics device context // first fill in the window class stucture winclass.cbSize = sizeof(WNDCLASSEX); winclass.style = CS_DBLCLKS / CS_OWNDC / CS_HREDRAW / CS_VREDRAW; winclass.lpfnWndProc = WindowProc; winclass.cbClsExtra = 0; winclass.cbWndExtra = 0; winclass.hInstance = hinstance; winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); winclass.hCursor = LoadCursor(NULL, IDC_ARROW); winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); winclass.lpszMenuName = NULL; winclass.lpszClassName = WINDOW_CLASS_NAME; winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // save hinstance in global hinstance_app = hinstance; // register the window class if (!RegisterClassEx(&winclass)) return(0); // create the window if (!(hwnd = CreateWindowEx(NULL, // extended style WINDOW_CLASS_NAME, // class "T3D Game Console Version 1.0", // title WS_OVERLAPPEDWINDOW / WS_VISIBLE, 0,0, // initial x,y 400,300, // initial width, height NULL, // handle to parent NULL, // handle to menu hinstance,// instance of this application NULL))) // extra creation parms return(0); // save main window handle main_window_handle = hwnd; // initialize game here Game_Init(); // enter main event loop while(TRUE) { // test if there is a message in queue, if so get it if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { // test if this is a quit if (msg.message == WM_QUIT) break; // translate any accelerator keys TranslateMessage(&msg); // send the message to the window proc DispatchMessage(&msg); } // end if // main game processing goes here Game_Main(); } // end while // closedown game here Game_Shutdown(); // return to Windows like this return(msg.wParam); } // end WinMain /////////////////////////////////////////////////////////// I don''t know where I have redeclared those things! plz help thx reply to this post or email me @ arw3z@hotmail.com
richardve
richardve
Remove the included "vinengine.h" from testengine.cpp/h and define the needed variables from vinengine.h extern in testengine.cpp/h like this:
    
extern LPDIRECTDRAWSURFACE4 primsurf;

Muzzafarath
Muzzafarath
Never post so much code on a message board. I haven''t really looked through your code, but if I were you, I''d try to move all of the global variable declarations out of the header file and put them in a source file (global.cpp) for example. Then you define them extern in the header.

Header file:

extern LPDIRECTDRAW4 ddraw4obj;
extern LPDIRECTDRAWSURFACE4 primsurf, backsurf;
extern DDSURFACEDESC2 ddsd;
extern HWND hwnd;

Cpp file:

LPDIRECTDRAW4 ddraw4obj;
LPDIRECTDRAWSURFACE4 primsurf, backsurf;
DDSURFACEDESC2 ddsd;
HWND hwnd;

// other code...

Don''t know if it''ll work, but it''s worth a shot.

- Muzzafarath

Mad House Software
The Field Marshals
I'm reminded of the day my daughter came in, looked over my shoulder at some Perl 4 code, and said, "What is that, swearing?" - Larry Wall
Mr Cucumber
Mr Cucumber
Actually I think you put the externs in the source file you wan''t to use them in. Atleast that''s what I do with my globals, but maybe both mwthods work.
last-bastardo
last-bastardo
I know this might sound stupid but ahve you linked the .lib files to the code. IE dxcore.lib and other in tools settings link
-=Last Bastardo=-
Jrz
Jrz
Don''t link a lib that links dx AND link to dx your self
Jrz
Jrz
Oh yeah... please post sourcecode in the source or code tags (FAQ)
Muzzafarath
Muzzafarath
quote:
Actually I think you put the externs in the source file you wan't to use them in. Atleast that's what I do with my globals, but maybe both mwthods work.


Have no idea which method is the most correct, but since both work...

quote:
know this might sound stupid but ahve you linked the .lib files to the code. IE dxcore.lib and other in tools settings link


He has linked with the libs, if arwez didn't then the compiler would spit out errors saying that stuff like "struct DDSURFACEDESC2" unresolved external (or something like that ). His/her problem is that the structs/variables gets defined one too many times.

- Muzzafarath

Mad House Software
The Field Marshals

Edited by - Muzzafarath on July 8, 2000 12:50:24 PM
I'm reminded of the day my daughter came in, looked over my shoulder at some Perl 4 code, and said, "What is that, swearing?" - Larry Wall
arwez
arwez
Thx everyone I got it to work, but now I''m getting an illegal operation! when I run. I''m assuming it has to do with the 2 functions in my engine. Cause when I don''t use the functions it works fine.

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.