Okay, I have been slowly learning some directX. After a few tutorials I try to make something myself with the knowledge I have gained. Now I was just trying to setup a checkersboard. So I try to make the squares by drawing single colored squares. This is the code I made:
dxgraphics.h
#ifndef _DXGRAPHICS_H
#define _DXGRAPHICS_H
int Init_Direct3D(HWND, int, int, int);
LPDIRECT3DSURFACE9 LoadSurface(char*, D3DCOLOR);
int drawPlainSurface(int, int, int, int, int, int, int, HWND);
extern LPDIRECT3D9 d3d;
extern LPDIRECT3DDEVICE9 d3ddev;
extern LPDIRECT3DSURFACE9 backbuffer;
extern LPDIRECT3DSURFACE9 surface;
#endif
dxgraphics.cpp
#include <d3d9.h>
#include <d3dx9.h>
#include "dxgraphics.h"
LPDIRECT3D9 d3d = NULL;
LPDIRECT3DDEVICE9 d3ddev = NULL;
LPDIRECT3DSURFACE9 backbuffer = NULL;
LPDIRECT3DSURFACE9 surface = NULL;
int Init_Direct3D(HWND hWnd, int width, int height, int fullscreen){
d3d = Direct3DCreate9(D3D_SDK_VERSION);
if(d3d == NULL){
MessageBox(hWnd, "Error initializing Direct3D", "Error", MB_OK);
return 0;
}
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = (!fullscreen);
d3dpp.SwapEffect = D3DSWAPEFFECT_COPY;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferWidth = width;
d3dpp.BackBufferHeight = height;
d3dpp.hDeviceWindow = hWnd;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
d3d->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&d3ddev);
if(d3ddev == NULL){
MessageBox(hWnd, "Error creating Direct3D device", "Error", MB_OK);
return 0;
}
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
d3ddev->GetBackBuffer(0,0, D3DBACKBUFFER_TYPE_MONO, &backbuffer);
HRESULT result;
/****
* THE NEXT PART GOES WRONG
*/
result = d3ddev->CreateOffscreenPlainSurface(
50,
50,
D3DFMT_X8R8G8B8,
D3DPOOL_DEFAULT,
&surface,
NULL);
if(!result){
MessageBox(hWnd, "Error creating plain surface", "error", MB_OK);
return 0;
}
return 1;
}
LPDIRECT3DSURFACE9 LoadSurface(char* filename, D3DCOLOR transcolor){
LPDIRECT3DSURFACE9 image = NULL;
D3DXIMAGE_INFO info;
HRESULT result;
result = D3DXGetImageInfoFromFile(filename, &info);
if(result != D3D_OK)
return NULL;
result = d3ddev->CreateOffscreenPlainSurface(
info.Width,
info.Height,
D3DFMT_X8R8G8B8,
D3DPOOL_DEFAULT,
&image,
NULL);
if(result != D3D_OK)
return NULL;
result = D3DXLoadSurfaceFromFile(
image,
NULL,
NULL,
filename,
NULL,
D3DX_DEFAULT,
transcolor,
NULL);
if(result != D3D_OK)
return NULL;
return image;
}
int drawPlainSurface(int x, int y, int width, int height, int r, int g, int b, HWND hWnd){
HRESULT result;
RECT rect;
MessageBox(hWnd, "Begin drawing plain surface", "error", MB_OK);
d3ddev->ColorFill(surface, NULL, D3DCOLOR_XRGB(r,g,b));
rect.left = x;
rect.top = y;
rect.right = x + width;
rect.bottom = y + height;
d3ddev->StretchRect(surface, NULL, backbuffer, &rect, D3DTEXF_NONE);
MessageBox(hWnd, "End drawing plain surface", "error", MB_OK);
return 1;
}
The LPDIRECT3DSURFACE9 surface never got instantiated. I don't know what goes wrong, because in the tutorial it goes right. I have looked on google what the problem might be. The only advice I got was that d3ddev was not initialized, but it doesn't fail on that check.
Oh yeah, I should add that I am running the program in windowed mode. Anyone some good advice, because this is giving me headaches.