Sign in to follow this  
Akul

Help on Errors Please

Recommended Posts

I am trying to get some sample code from here running and having a problem to two, I have Dev-C++ (V. 4.9.9.2) and Microsoft DirectX SDK (November 2007). Below is a screen shot of how my directories are set up and my error, and the code follows. http://img219.imageshack.us/my.php?image=screenvm0.jpg
#include "dxguid.lib"
#include "ddraw.lib"
#include "ddraw.h"
#include <cstdlib>
#include <iostream>

using namespace std;

    // globals (ugh)
LPDIRECTDRAW lpDD; // DirectDraw object defined in DDRAW.H

/*
 * Function to initialize DirectDraw
 * Demonstrates:
 *   1) Creating the Direct Draw Object
 *   2) Setting the Cooperative level
 *   3) Setting the Display mode
 *
 */
bool DirectDrawInit(HWND hwnd)
{
    HRESULT ddrval;
    
   /*
    * Create the main DirectDraw object.
    *
    * This function takes care of initializing COM and Constructing
    * the DirectDraw object.
    */
    ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
    if( ddrval != DD_OK )
    {
        return(false);
    }

   /*
    * The cooperative level determines how much control we have over the
    * screen. This must at least be either DDSCL_EXCLUSIVE or DDSCL_NORMAL
    *
    * DDSCL_EXCLUSIVE allows us to change video modes, and requires
    * the DDSCL_FULLSCREEN flag, which will cause the window to take over
    * the fullscreen. This is the preferred DirectDraw mode because it allows
    * us to have control of the whole screen without regard for GDI.
    *
    * DDSCL_NORMAL is used to allow the DirectDraw app to run windowed.
    */
    ddrval = lpDD->SetCooperativeLevel( hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
    if( ddrval != DD_OK )
    {
        lpDD->Release();
        return(false);
    }

   /*
    * Set the video mode to 640x480x8
    * This is allowed because we have set exclusive mode above
    */
    ddrval = lpDD->SetDisplayMode( 640, 480, 8);
    if( ddrval != DD_OK )
    {
        lpDD->Release();
        return(false);
    }

    return(true);
}

int main(int argc, char *argv[])
{    
    system("PAUSE");
    return EXIT_SUCCESS;
}

[Edited by - Akul on January 4, 2008 9:38:56 AM]

Share this post


Link to post
Share on other sites
Quote:
Original post by Akul
I tried putting my code in <code> tags, but when I previewed it, they were treated as text (the tags), How am I should I post code here?
Use [ source ] tags, or [ code ] for short snippets (<10 lines).

As for the actual problem, I didn't think Dev-C++ was supported by any recent DirectX SDK? Is there any reason you're not using the free version of Visual Studio 2008 (which is much better)?

I'm not a Dev-C++ person, but it looks like you don't have the main.cpp in your project, or you don't have the path to it in your project set up correctly.

Share this post


Link to post
Share on other sites
Quote:
Original post by Evil Steve
Is there any reason you're not using the free version of Visual Studio 2008 (which is much better)?




Microsoft Visual C++ 2008 Express Edition?

Share this post


Link to post
Share on other sites
The DirectX SDK you have is probably compiled for the Microsoft C++ compiler. Dev-C++ uses the GCC compiler/linker tools, and will probably complain.
If this is the case, you will either have to download DirectX SDK for GCC (MingW), or get Microsoft's Visual C++ and use it with the SDK you already have installed.

Quote:

#include "dxguid.lib"
#include "ddraw.lib"

You are not supposed to include lib files in your source code, only h files.
Most IDE's will have a list somewhere in the menus where you can add the lib files your program depends on. I'm using Visual C++ 2008 express myself, so I don't remember where in the Dev-C++ menus to do it.

Some info here How to link, even though I also recommend downloading the Visual C++ 2008 express if you have a decent bandwidth.

Share this post


Link to post
Share on other sites
Sounds good. The undefined reference linker errors is a classic and usually means that you forgot to add a cpp file to your project or that you forgot to add a lib file to the list of dependencies.

Feel free to ask once you got visual c++ up and running...

Share this post


Link to post
Share on other sites
Quote:
Original post by pulpfist
Feel free to ask once you got visual c++ up and running...


Lol... Yeah. Can you direct me to a decent tutorial in basic game development with the Microsoft Visual C++ 2008? Or should it be very similar?

Also, similar error from Microsoft Visual C++ 2008:

1>TestProject1.obj : error LNK2019: unresolved external symbol _DirectDrawCreate@12 referenced in function "bool __cdecl DirectDrawInit(struct HWND__ *)" (?DirectDrawInit@@YA_NPAUHWND__@@@Z)
1>H:\My Documents\Visual Studio 2008\Projects\TestProject1\Debug\TestProject1.exe : fatal error LNK1120: 1 unresolved externals
1>Build log was saved at "file://h:\My Documents\Visual Studio 2008\Projects\TestProject1\TestProject1\Debug\BuildLog.htm"

Share this post


Link to post
Share on other sites
Well that depends heavily on what kind of game you want to create and what level you are at of course.
If you want to do 3D graphics, you can use a graphic engine like Ogre or DarkGDK.
If you want to start out with some 2D stuff you should give LazyFoos tutorial a try.

However, if you are new to game development you might want to get used to the basics first doing some simple DirectX tutorials. Here is a decent tutorial. This one doesn't require any third party libraries except DirectX SDK.

The resources pages here on GD will give you more.

Share this post


Link to post
Share on other sites
Quote:
Original post by Akul
Quote:
Original post by pulpfist
Feel free to ask once you got visual c++ up and running...


Lol... Yeah. Can you direct me to a decent tutorial in basic game development with the Microsoft Visual C++ 2008? Or should it be very similar?

Also, similar error from Microsoft Visual C++ 2008:

1>TestProject1.obj : error LNK2019: unresolved external symbol _DirectDrawCreate@12 referenced in function "bool __cdecl DirectDrawInit(struct HWND__ *)" (?DirectDrawInit@@YA_NPAUHWND__@@@Z)
1>H:\My Documents\Visual Studio 2008\Projects\TestProject1\Debug\TestProject1.exe : fatal error LNK1120: 1 unresolved externals
1>Build log was saved at "file://h:\My Documents\Visual Studio 2008\Projects\TestProject1\TestProject1\Debug\BuildLog.htm"


Setting up Visual C++ to use DirectX SDK:

Go to: Tools -> Options -> Projects and solutions -> VC++ Directories.

Select Include files from the drop down list at the upper right corner and add the DirectX SDK include directory to the list.

Select Library files from the drop down list and add the DirectX SDK lib\x86 directory to the list.

The above is system wide configurations and need to be done only once.

For each project you must also add the DirectX lib files to your project properties.
Go to: Project -> properties -> configuration properties -> linker -> input, and add (in this case) ddraw.lib to the space separated list of additional dependencies.

See if that helps...

Share this post


Link to post
Share on other sites
You can do what pulpfist said or you may use pragma to add it, such as:


#pragma comment( lib, "ddraw" )
#pragma comment( lib, "dguid" )


Which will make the linker search for ddraw and dguid both in the project folder and in the main lib folders you have set up (which pulpfist showed you how to update).

Also, you don't actually try to use the directx init function from your main() function.
And besides that you are going to use the Windows SDK in order to actually use WinMain() to get several variables which are needed for DirectX.

Take a look at this code for more help on setting up directx/windows.


// include the basic windows header files and the Direct3D header file
#include <windows.h>
#include <windowsx.h>
#include <d3d9.h>

// include the Direct3D Library file
#pragma comment (lib, "d3d9.lib")

// global declarations
LPDIRECT3D9 d3d; // the pointer to our Direct3D interface
LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class

// function prototypes
void initD3D(HWND hWnd); // sets up and initializes Direct3D
void render_frame(void); // renders a single frame
void cleanD3D(void); // closes Direct3D and releases memory

// the WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);


// the entry point for any Windows program
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND hWnd;
WNDCLASSEX wc;

ZeroMemory(&wc, sizeof(WNDCLASSEX));

wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WindowProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.lpszClassName = L"WindowClass";

RegisterClassEx(&wc);

hWnd = CreateWindowEx(NULL,
L"WindowClass",
L"Our First Direct3D Program",
WS_OVERLAPPEDWINDOW,
300, 300,
640, 480,
NULL,
NULL,
hInstance,
NULL);

ShowWindow(hWnd, nCmdShow);

// set up and initialize Direct3D
initD3D(hWnd);

// enter the main loop:

MSG msg;

while(TRUE)
{
DWORD starting_point = GetTickCount();

if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;

TranslateMessage(&msg);
DispatchMessage(&msg);
}

render_frame();

while ((GetTickCount() - starting_point) < 25);
}

// clean up DirectX and COM
cleanD3D();

return msg.wParam;
}


// this is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
} break;
}

return DefWindowProc (hWnd, message, wParam, lParam);
}


// this function initializes and prepares Direct3D for use
void initD3D(HWND hWnd)
{
d3d = Direct3DCreate9(D3D_SDK_VERSION); // create the Direct3D interface

D3DPRESENT_PARAMETERS d3dpp; // create a struct to hold various device information

ZeroMemory(&d3dpp, sizeof(d3dpp)); // clear out the struct for use
d3dpp.Windowed = TRUE; // program windowed, not fullscreen
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // discard old frames
d3dpp.hDeviceWindow = hWnd; // set the window to be used by Direct3D


// create a device class using this information and the info from the d3dpp stuct
d3d->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&d3ddev);

return;
}


// this is the function used to render a single frame
void render_frame(void)
{
// clear the window to a deep blue
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0);

d3ddev->BeginScene(); // begins the 3D scene

// do 3D rendering on the back buffer here

d3ddev->EndScene(); // ends the 3D scene

d3ddev->Present(NULL, NULL, NULL, NULL); // displays the created frame on the screen

return;
}


// this is the function that cleans up Direct3D and COM
void cleanD3D(void)
{
d3ddev->Release(); // close and release the 3D device
d3d->Release(); // close and release Direct3D

return;
}



Code is from DirectXTutorial.com

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this