Advertisement

Confused newbie...

Started by April 16, 2001 12:17 AM
1 comment, last by ArtemisX 23 years, 9 months ago
Ok, I'm having problems setting up a simple application. I'm just expecting it to display a blank DDraw window (which I can usually do) but I'm trying to get used to using multiple files. Beware, I'm posting a LOT of junk on here. Ok, here goes (oh, and I know the code is probably jumbled, I just need help with the linker problems): blit.cpp

// blit.cpp : Defines the entry point for the application.
//

#include "stdafx.h"

// 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_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

// first create base IDirectDraw interface
if (FAILED(DirectDrawCreate(NULL, &lpdd, NULL)))
   {
   // error
   return(0);
   } // end if

// now query for IDirectDraw4
if (FAILED(lpdd->QueryInterface(IID_IDirectDraw4,
                               (LPVOID *)&lpdd4)))
   {
   // error
   return(0);
   } // end if

// set cooperation to full screen
if (FAILED(lpdd4->SetCooperativeLevel(main_window_handle, 
                                      DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX | 
                                      DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT)))
   {
   // error
   return(0);
   } // end if

// set display mode to 640x480x8
if (FAILED(lpdd4->SetDisplayMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP,0,0)))
   {
   // error
   return(0);
   } // end if


// 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

// simply blow away the IDirectDraw4 interface
if (lpdd4)
   {
   lpdd4->Release();
   lpdd4 = NULL;
   } // end if

// 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
						    "DirectDraw Full-Screen Demo", // title
						    WS_POPUP | WS_VISIBLE,
					 	    0,0,	  // initial x,y
						    SCREEN_WIDTH,SCREEN_HEIGHT,  // 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

///////////////////////////////////////////////////////////
  
game.cpp

#include "stdafx.h"
///////////////////////////////////////////////////////////

int Game_Main()
{
// 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

////////////////////////////////////////////////////////////
  
stdafx.h

// stdafx.h
//
#ifndef MAIN_HEADER_INCLUDED
#define MAIN_HEADER_INCLUDED

// 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 directdraw

// DEFINES ////////////////////////////////////////////////

// defines for windows 
#define WINDOW_CLASS_NAME "WINCLASS1"

// default screen size
#define SCREEN_WIDTH    640  // size of screen
#define SCREEN_HEIGHT   480
#define SCREEN_BPP      8    // bits per pixel
#define MAX_COLORS      256  // maximum colors

// TYPES //////////////////////////////////////////////////////

// basic unsigned types
typedef unsigned short USHORT;
typedef unsigned short WORD;
typedef unsigned char  UCHAR;
typedef unsigned char  BYTE;

// MACROS /////////////////////////////////////////////////

#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEYUP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)

// initializes a direct draw struct
#define DD_INIT_STRUCT(ddstruct) { memset(&ddstruct,0,sizeof(ddstruct)); ddstruct.dwSize=sizeof(ddstruct); }

// GLOBALS ////////////////////////////////////////////////
HWND      main_window_handle = NULL; // globally track main window
HINSTANCE hinstance_app      = NULL; // globally track hinstance

// directdraw stuff

LPDIRECTDRAW          lpdd         = NULL;   // dd object
LPDIRECTDRAW4         lpdd4        = NULL;   // dd4 object
LPDIRECTDRAWSURFACE4  lpddsprimary = NULL;   // dd primary surface
LPDIRECTDRAWSURFACE4  lpddsback    = NULL;   // dd back surface
LPDIRECTDRAWPALETTE   lpddpal      = NULL;   // a pointer to the created dd palette
LPDIRECTDRAWCLIPPER   lpddclipper  = NULL;   // dd clipper
PALETTEENTRY          palette[256];          // color palette
PALETTEENTRY          save_palette[256];     // used to save palettes
DDSURFACEDESC2        ddsd;                  // a direct draw surface description struct
DDBLTFX               ddbltfx;               // used to fill
DDSCAPS2              ddscaps;               // a direct draw surface capabilities struct
HRESULT               ddrval;                // result back from dd calls
DWORD                 start_clock_count = 0; // used for timing

// these defined the general clipping rectangle
int min_clip_x = 0,                          // clipping rectangle 
    max_clip_x = SCREEN_WIDTH-1,
    min_clip_y = 0,
    max_clip_y = SCREEN_HEIGHT-1;

// these are overwritten globally by DD_Init()
int screen_width  = SCREEN_WIDTH,            // width of screen
    screen_height = SCREEN_HEIGHT,           // height of screen
    screen_bpp    = SCREEN_BPP;              // bits per pixel


char buffer[80];                     // general printing buffer

// PROTOTYPES /////////////////////////////////////////////////

int Game_Main();
int Game_Init(void *parms, int num_parms);
int Game_Shutdown(void *parms, int num_parms);

#endif
  
Like I said, the code probably looks like crap, but that's not my big problem right now. Here is the error log:

--------------------Configuration: blit - Win32 Debug--------------------
Compiling...
game.cpp
blit.cpp
C:\src\blit\blit.cpp(15) : warning C4101: 'buffer' : unreferenced local variable
C:\src\blit\blit.cpp(130) : warning C4101: 'hdc' : unreferenced local variable
Linking...
blit.obj : error LNK2005: "int  screen_bpp" (?screen_bpp@@3HA) already defined in game.obj
blit.obj : error LNK2005: "int  screen_height" (?screen_height@@3HA) already defined in game.obj
blit.obj : error LNK2005: "int  screen_width" (?screen_width@@3HA) already defined in game.obj
blit.obj : error LNK2005: "int  max_clip_y" (?max_clip_y@@3HA) already defined in game.obj
blit.obj : error LNK2005: "int  min_clip_y" (?min_clip_y@@3HA) already defined in game.obj
blit.obj : error LNK2005: "int  max_clip_x" (?max_clip_x@@3HA) already defined in game.obj
blit.obj : error LNK2005: "int  min_clip_x" (?min_clip_x@@3HA) already defined in game.obj
blit.obj : error LNK2005: "unsigned long  start_clock_count" (?start_clock_count@@3KA) already defined in game.obj
blit.obj : error LNK2005: "struct IDirectDrawClipper *  lpddclipper" (?lpddclipper@@3PAUIDirectDrawClipper@@A) already defined in game.obj
blit.obj : error LNK2005: "struct IDirectDrawPalette *  lpddpal" (?lpddpal@@3PAUIDirectDrawPalette@@A) already defined in game.obj
blit.obj : error LNK2005: "struct IDirectDrawSurface4 *  lpddsback" (?lpddsback@@3PAUIDirectDrawSurface4@@A) already defined in game.obj
blit.obj : error LNK2005: "struct IDirectDrawSurface4 *  lpddsprimary" (?lpddsprimary@@3PAUIDirectDrawSurface4@@A) already defined in game.obj
blit.obj : error LNK2005: "struct IDirectDraw4 *  lpdd4" (?lpdd4@@3PAUIDirectDraw4@@A) already defined in game.obj
blit.obj : error LNK2005: "struct IDirectDraw *  lpdd" (?lpdd@@3PAUIDirectDraw@@A) already defined in game.obj
blit.obj : error LNK2005: "struct HINSTANCE__ *  hinstance_app" (?hinstance_app@@3PAUHINSTANCE__@@A) already defined in game.obj
blit.obj : error LNK2005: "struct HWND__ *  main_window_handle" (?main_window_handle@@3PAUHWND__@@A) already defined in game.obj
blit.obj : error LNK2005: "char *  buffer" (?buffer@@3PADA) already defined in game.obj
blit.obj : error LNK2005: "struct _DDSCAPS2  ddscaps" (?ddscaps@@3U_DDSCAPS2@@A) already defined in game.obj
blit.obj : error LNK2005: "struct _DDSURFACEDESC2  ddsd" (?ddsd@@3U_DDSURFACEDESC2@@A) already defined in game.obj
blit.obj : error LNK2005: "long  ddrval" (?ddrval@@3JA) already defined in game.obj
blit.obj : error LNK2005: "struct tagPALETTEENTRY *  save_palette" (?save_palette@@3PAUtagPALETTEENTRY@@A) already defined in game.obj
blit.obj : error LNK2005: "struct _DDBLTFX  ddbltfx" (?ddbltfx@@3U_DDBLTFX@@A) already defined in game.obj
blit.obj : error LNK2005: "struct tagPALETTEENTRY *  palette" (?palette@@3PAUtagPALETTEENTRY@@A) already defined in game.obj
Debug/blit.exe : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.

blit.exe - 24 error(s), 2 warning(s)
  
Well, while I don't expect anybody to actually sit through this disgrace of a project, there might be some poor, bored bastard out there that might wanna help Anyways, if you actually want to try it, be my guest, but do so at your own risk (Side note: okay, no idea why the include directives didn't show up properly in the post, but just assume they are there Mostly your standard windows junk and the ddraw header) Edited by - ArtemisX on April 16, 2001 1:20:12 AM
Well if you define a variable in another file...and want to use that variable in another...you have to use extern.

game.cpp
long mylong;

player.cpp
extern long mylong;

This just says the variable was defined elsewhere and is global.



Jenison
''Things are more like they are now then they ever were before'' - Truman
Advertisement
also if you would like to use a function from another file in another file make a .h (header) file for it. and include the prototypes in that file. just do
#ifndef FILE
#define FILE

// Prototypes
int BAD(scale);

#endif

hope that was of help >
bad!

This topic is closed to new replies.

Advertisement