Archived

This topic is now archived and is closed to further replies.

Help a n00b with DirectDraw D;

This topic is 4982 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi there! I was reading Game Programming Genesis tutorial and started to make my own code. I've tried EVERYTHING Including copying / pasting / changing major stuff, using different methods and even going line by line on the code. Nothing helps. I wanna get an output of my image to the Front Buffer. Sounds diffcult? sure not. BUT ofcourse when you're trying to do some cool thing it fails. Basically, the program is supposed to use Front/Back buffer with flip method and I got an Offscreen buffer which I am trying to Blt onto the Back buffer but something goes wrong unfortunatly. If you will PLEASE check the code and you may find any error / mistake / other way / a miracle, please tell me. I've been trying to figure this out for 4 days now. Thanks! The code I've written is:
//Main Include files

#include <windows.h>
#include <ddraw.h>

//Macros

#define INIT_DXSTRUCT(dxs) {ZeroMemory(&dxs, sizeof(dxs)); dxs.dwSize = sizeof(dxs);}

//Global common variables

LPDIRECTDRAW7 g_dd7 = NULL;
DDSURFACEDESC2 g_sd;
LPDIRECTDRAWSURFACE7 g_sPrimary = NULL;  
LPDIRECTDRAWSURFACE7 g_sBack = NULL;  
LPDIRECTDRAWSURFACE7 g_sBitmap1 = NULL;  

long bx,by = 0;

//Function Prototypes

int Init_DDraw(HWND); 
int Create_Surfaces();
int Show_Bitmap();
int Show_Text();
void ReleaseALL();
bool p_Active = true;

void ReleaseALL()
{
	g_sPrimary->Release();
	g_sPrimary = NULL;
	g_dd7->Release(); 
    g_dd7 = NULL; 
	ShowCursor(true);
	KillTimer(NULL,1);
	exit(1);
}

int Init_DDraw(HWND t_hwnd)
{
	if (FAILED(DirectDrawCreateEx(NULL, (LPVOID*)&g_dd7, IID_IDirectDraw7, NULL)))
		return (false);

	if (FAILED(g_dd7->SetCooperativeLevel(t_hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN)))
		return (false);

	if (FAILED(g_dd7->SetDisplayMode(1024,768,32,0,0)))
		return (false);

	return (true);
}

int Create_Surfaces()
{
	//Primary Buffer

	INIT_DXSTRUCT(g_sd);                              
	g_sd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;  
	g_sd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;   
	g_sd.dwBackBufferCount = 1; 
        
	if (FAILED(g_dd7->CreateSurface(&g_sd, &g_sPrimary, NULL)))
		return (false);

	//Back Buffer

	INIT_DXSTRUCT(g_sd);
	g_sd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
	if (FAILED(g_sPrimary->GetAttachedSurface(&g_sd.ddsCaps, &g_sBack)))
		return (false);		

	//Bitmap 1

	INIT_DXSTRUCT(g_sd);
	g_sd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; 
	g_sd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; 
	g_sd.dwHeight = 480; 
	g_sd.dwWidth = 640; 
	g_sd.ddckCKSrcBlt.dwColorSpaceLowValue  = RGB(0,0,0);
	g_sd.ddckCKSrcBlt.dwColorSpaceHighValue = RGB(0,0,0);
	if (FAILED(g_dd7->CreateSurface(&g_sd, &g_sBitmap1, NULL)))
		return (false);

	return (true);
}

int Show_Bitmap(LPDIRECTDRAWSURFACE7 g_sBitRes, LPDIRECTDRAWSURFACE7 g_sB, LPDIRECTDRAWSURFACE7 g_sP, int xDest, int yDest, LPCTSTR bFile)
{
	HDC hSrcDC;         
	HDC hDestDC;       
	HBITMAP hbitmap;    
	BITMAP bmp;      
	int nHeight, nWidth; 
/*	DDBLTFX fx;
	
	INIT_DXSTRUCT(fx);
	fx.dwFillColor = 0; 
	g_sBack->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &fx);*/

	if ((hbitmap = (HBITMAP)LoadImage(NULL, bFile, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE)) == NULL)
		return (false);


	if ((hSrcDC = CreateCompatibleDC(NULL)) == NULL)
		return (false);

 
	if (SelectObject(hSrcDC, hbitmap) == NULL)
	{
		DeleteDC(hSrcDC);
		return (false);
	}


	if (GetObject(hbitmap, sizeof(BITMAP), &bmp) == 0)
	{
		DeleteDC(hSrcDC);
		return (false);
	}

	nWidth = bmp.bmWidth;
	nHeight = bmp.bmHeight;

	if (FAILED(g_sBitRes->GetDC(&hDestDC)))
	{
		DeleteDC(hSrcDC);
		return (false);
	}

	if (BitBlt(hDestDC, xDest, yDest, nWidth, nHeight, hSrcDC, 0, 0, SRCCOPY) == NULL)
	{
		g_sBitRes->ReleaseDC(hDestDC);
		DeleteDC(hSrcDC);
		return (false);
	}

	g_sB->BltFast(0, 0, g_sBitRes, NULL, DDBLTFAST_SRCCOLORKEY);
	g_sP->Flip(g_sB,0);

	g_sBitRes->ReleaseDC(hDestDC);
	DeleteDC(hSrcDC);

  return (true);
}

int Show_Text(LPCTSTR uMessage, LPDIRECTDRAWSURFACE7 lpdds, COLORREF BackColor, COLORREF txtColor, int xPos, int yPos)
{      
	HDC hDestDC;       

	if (FAILED(lpdds->GetDC(&hDestDC)))
		return (false);

	SetBkColor(hDestDC, BackColor); 
    SetTextColor(hDestDC, txtColor); 
    TextOut(hDestDC, xPos, yPos, uMessage, lstrlen(uMessage)); 
    
	lpdds->ReleaseDC(hDestDC); 

  return (true);
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	
    WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;

    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "DirectDraw First";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    if(!RegisterClassEx(&wc))
    {
        MessageBox(NULL, "Window Registration Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    hwnd = CreateWindowEx(
        0,
        "DirectDraw First",
        "DirectDraw First",
        WS_POPUP| WS_VISIBLE,
        512 / 2, 384 / 2, 640, 480,
        NULL, NULL, hInstance, NULL);

    if(hwnd == NULL)
    {
        MessageBox(NULL, "Window Creation Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

	if (NULL == Init_DDraw(hwnd))
	{
		MessageBox(hwnd, "Intializing DirectDraw Failed!", "Failed!", MB_OK);
		ReleaseALL();
	}

	ShowCursor(false);

	if (NULL == Create_Surfaces())
	{
		MessageBox(hwnd, "Creating surfaces Failed!", "Failed!", MB_OK);
		ReleaseALL();
	}	
	
	MessageBox (hwnd, "All the process has gone well", "Done", MB_OK);

	while (p_Active)
	{
		if (GetMessage(&Msg, NULL, 0, 0) > 0)
		{
			if (Msg.wParam == VK_ESCAPE)
				p_Active = false;
			TranslateMessage(&Msg);
			DispatchMessage(&Msg);
		}

		if (NULL == (Show_Bitmap(g_sBitmap1,g_sBack,g_sPrimary,0 ,0,"Energy.bmp")))
		{
			MessageBox(hwnd, "Showing bitmap Failed!", "Failed!", MB_OK);
			ReleaseALL();
		}

		/*if (NULL == Show_Text("Hello, DirectDraw World!",g_sBack,RGB(0,0,255),RGB(0,255,255),0,25))
		{
			MessageBox(hwnd, "Showing text Failed!", "Failed!", MB_OK);
			ReleaseALL();
		}*/
	}
	ReleaseALL();
    return Msg.wParam;
}

I am getting an output of starnge lines on a black background, as if some mobile phone was dialing and disturbing the screen. [edited by - yochai_vb9 on April 22, 2004 1:42:01 PM]

Share this post


Link to post
Share on other sites
Guest Anonymous Poster
Actually, noob is a very commom way to spell newbie if you''ve ever played any online games. You may want to check your grammar as well. You asked a question and put a period at the end. Your sentence "Learn to spell then come ask for help." is grammatically incorrect also. What''s the point of pointing this out I wonder? NOTHING. Now for a serious post...

It''s been a while since I''ve seen DirectDraw, and it was an older version than this, so I loaded the images from file manually and copied byte by byte to the buffers. Have you thought about moving to Direct3D and using the D3DXSPRITE class?

Share this post


Link to post
Share on other sites
quote:
Original post by Anonymous Poster
Actually, noob is a very commom way to spell newbie if you''ve ever played any online games. You may want to check your grammar as well. You asked a question and put a period at the end. Your sentence "Learn to spell then come ask for help." is grammatically incorrect also. What''s the point of pointing this out I wonder? NOTHING. Now for a serious post...


By the way, if anyone''s wondering what this is about, there was a flame post that I deleted while this was being written. Apologies for any confusion.

Share this post


Link to post
Share on other sites
quote:
Original post by superpig
quote:
Original post by Anonymous Poster
Actually, noob is a very commom way to spell newbie if you''ve ever played any online games. You may want to check your grammar as well. You asked a question and put a period at the end. Your sentence "Learn to spell then come ask for help." is grammatically incorrect also. What''s the point of pointing this out I wonder? NOTHING. Now for a serious post...


By the way, if anyone''s wondering what this is about, there was a flame post that I deleted while this was being written. Apologies for any confusion.


O_o Huh?

Share this post


Link to post
Share on other sites
I haven''t used DirectDraw in a while, but if I used to get dodgy lines etc when the surface I was trying to blit wasn''t initialised properly. Make sure you are correctly initialising structures before loading the bitmap surface. Also a good idea might be to load a ddraw surface with the bitmap, and then blit the surface every frame. I see you load and blit the bitmap every frame, that has to be inefficient and COULD be the cause of your problem

Share this post


Link to post
Share on other sites
Guest Anonymous Poster
u learning rasterizers for its own sake or for the sake of mobile games ?? I reckon use a dx9 or 9 textured quad filling the screen and use the calls texture->Lock(...) and use the pointer to pixels that way.

I''m waiting for the radeon phone ... its gonna be real hot ... maybe it will even start up a new cancer scare???

Share this post


Link to post
Share on other sites
I''m sorry, but what exactly do you want me to do with Direct3D9? Isn''t it better to first learn the basics like direct draw and make a tile game instead of jumping straight to direct draw? Or am I just mistaken?

Even though, I want to solve this.

Share this post


Link to post
Share on other sites
The other poster was suggesting you use Direct3D because you can do 2D with Direct3D plus you get all the benefits of using the 3D hardware and it saves you learning something which is deprecated.

Check out the tutorials at 32bits.co.uk or elsewhere on the net for more help.

Jx

Share this post


Link to post
Share on other sites
There''s really no reason to learn DirectDraw if you intend to eventually move on to Direct3D; short of some basic graphics concepts, the two have nearly no overlap in what you learn from them. Furthermore, DDraw is deprecated on new hardware, one of the reasons it was finally merged with D3D in DirectX version 8.

If you want to 2D engines or things, I''d advise you to look into using the ID3DXSprite interface of Direct3D 9, or look up orthogonal projection mode to prevent the effects of perspective.

Share this post


Link to post
Share on other sites
Do all the surfaces have the same color depth? DirectDraw does not automatically convert between formats.

Using DirectDraw can be very learnful. Even more hard-core is to just lock the backbuffer, and write to it directly. On modern processors it''s really not slow.

Share this post


Link to post
Share on other sites