Visual Studio 2005

Started by
4 comments, last by tmg32 14 years, 10 months ago
Well, hi there. I am new, and I am new to programming (only because I let my skills drop). I have just gotten Visual Studio 2005, and I am trying to get the tetris clone working in it. I originally programmed the game in an Introductory edition of Visual C++ 6.0 - it compiled fine, but I couldn't run it, as the introductory version doesn't allow exe files to be made...which is why I upgraded. Now I've tried opening the 6.0 version in 2005, and it asks me if I want to covert it to 2005 spec, so I do, and it compiles, but when I click on the exe files, it doesn't do anything. If I start the debug process in Visual C++, it returns with "exit code 0 (0x0)" I tried turning off/on the unicode option, but nothing is helping...hell with unicode on it won't even compile! can someone help me out? I really want to know what resources I have to be able to make games using VS-2005...
Advertisement
Maybe you should post your code, so we can have have a look... Because without any code, it's impossible to determine what you're doing.

Code that's in the BITMAPOBJECT.H file

// BITMAPOBJECT.H - Crazy Header File for the game TETTRY /////////////////////////////////////////// DEFINITIONS AND INCLUDES ///////////////////////////////////////////////////////////////////////#ifndef BITMAPOBJECT_H			// If not defined already...#define BITMAPOBJECT_H			// ,,,define it!#pragma once					// and make sure it doesn't do it again once it's been defined.#include <windows.h>			// again, more windows variables, so we need this header file.// BITMAP CLASSES /////////////////////////////////////////////////////////////////////////////////class BitMapObject{private:		HDC			hdcMemory;		// bitmap allocation to memory		HBITMAP		hbmNewBitmap;	// New Bitmap		HBITMAP		hbmOldBitmap;	// Old Bitmap				int iWidth;					// bitmap width		int iHeight;				// bitmap heightpublic:		BitMapObject();				// constructor for handling bitmaps		~BitMapObject();			// desstructor for killing bitmaps...lol.		void Load(HDC hdcCompatible, LPCTSTR lpszFileName);		// Load a bitmap from disk file		void Create(HDC hdcCompatible, int width, int height);	// create a black bitmap		void Destroy();											// delete current bitmap image				int GetWidth();				// Get bitmap width		int GetHeight();			// Get bitmap height		operator HDC();				// converts to HDC};#endif



now the code that's in the BITMAPOBJECT.CPP file

// BITMAPOBJECT.CPP ///////////////////////////////////////////////////////////////////////////////// DECLARATIONS and INCLUDES //////////////////////////////////////////////////////////////////////#include "bitmapobject.h"			// include our custom made header file using "" instead of <>// FUNCTIONS //////////////////////////////////////////////////////////////////////////////////////BitMapObject::BitMapObject()		// This is the creation structure for our bitmaps{	hdcMemory		= NULL;	hbmNewBitmap	= NULL;	hbmOldBitmap	= NULL;	iWidth			= 0;	iHeight			= 0;}BitMapObject::~BitMapObject()		// This is the destroy structure for our bitmaps{	if (hdcMemory)		Destroy();}// Now we've made those structures, we can use them to load a bitmap //////////////////////////////// into the playing field, so lets do that now. ///////////////////////////////////////////////////void BitMapObject::Load(HDC hdcCompatible, LPCTSTR lpszFileName){	if(hdcMemory)		Destroy();					// if the memory isn't NULL/Clear, then do that first	// create memory declaration	hdcMemory		= CreateCompatibleDC(hdcCompatible);			// next, load the bitmap...	hbmNewBitmap	= (HBITMAP)LoadImage(NULL, lpszFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);		// ...and load it into memory	hbmOldBitmap	= (HBITMAP)SelectObject(hdcMemory, hbmNewBitmap);	// get the images properties	BITMAP bmp;	GetObject(hbmNewBitmap, sizeof(BITMAP), (LPVOID)&bmp);	// get the images dimensions	iWidth			= bmp.bmWidth;	iHeight			= bmp.bmHeight;}// lets create the bitmap using the create functionvoid BitMapObject::Create(HDC hdcCompatible, int width, int height){	// if the memory isn't clear, then clear it!	if(hdcMemory)		Destroy();	// create the memory dc	hdcMemory = CreateCompatibleDC(hdcCompatible);	// create the bitmap	hbmNewBitmap = CreateCompatibleBitmap(hdcCompatible, width, height);	// put the bitmap into memory	hbmOldBitmap = (HBITMAP)SelectObject(hdcMemory,hbmNewBitmap);	// change the width and height	iWidth		= width;	iHeight		= height;}// So we managed to load it, but now we have to destroy it, so we'll use our destroy function /////void BitMapObject::Destroy(){	// restore the old bitmap	SelectObject(hdcMemory, hbmOldBitmap);	// delete New Bitmap	DeleteObject(hbmNewBitmap);	// delete the device context	DeleteDC(hdcMemory);	// set numbers to NULL/0	hdcMemory		= NULL;	hbmOldBitmap	= NULL;	hbmNewBitmap	= NULL;	iWidth			= 0;	iHeight			= 0;}// OK, the last function to finish this .cpp file off /////////////////////////////////////////////BitMapObject::operator HDC(){	// return hdcMemory/	return (hdcMemory);}int BitMapObject::GetWidth(){	// return width	return(iWidth);}int BitMapObject::GetHeight(){	// return height	return(iHeight);}


and the code thats in the MAIN.CPP file

// TETTRY!!! My Tetris clone //////////////////////////////////////////////////////////////////////// MAIN.CPP ///////////////////////////////////////////////////////////////////////////////////////#define WIN32_LEAN_AND_MEAN		// discard uneeded header files// now the "include" files#include <windows.h>			// it's windows, so we need it#include <stdlib.h>				// for the srand and rand functions#include "bitmapobject.h"		// for our bitmap object properties// Let's give our game, a name! ///////////////////////////////////////////////////////////////////#define WINDOWCLASS				"TETTRY"#define WINDOWTITLE				"TETTRY - A Tetris Clone"// Now we need to define the playing field, and block dimensions //////////////////////////////////// Tile Size first. We're using square blocks, so we only need to// define one size setting for this.const int TILESIZE				= 16;// Now the map demensions - For where the blocks will fall is hereconst int MAPWIDTH				= 10;const int MAPHEIGHT				= 30;const int GREY					= 8;// NOW! We need to define the tile types, so the game works properly// and doesn't end up turning into crap with no definitions.const int TILENODRAW			= -1;const int TILEBLACK				= 0;const int TILEGREY				= 1;const int TILEBLUE				= 2;const int TILERED				= 3;const int TILEGREEN				= 4;const int TILEYELLOW			= 5;const int TILEWHITE				= 6;const int TILESTEEL				= 7;const int TILEPURPLE			= 8;// Now for the Game Type Definitions //////////////////////////////////////////////////////////////bool GameInit();						// Start the Game!!!void GameLoop();						// Uh, the Game Loop?void GameDone();						// What...we want to exit???void DrawTile(int x, int y, int tile);	// Drawing tiles yourself sucks.void DrawMap();							// Draw the whole map, render function reallyvoid NewBlock();						// Spit another one out will ya!void RotateBlock();						// Let's put a Spin on things!void Move(int x, int y);				// Got to be able to move now.int CollisionTest(int nx, int ny);		// CRASH!!!void RemoveRow(int row);				// If any row is complete, remove it from the fieldvoid NewGame();							// AND Start all over again!// GLOBALS - for windows stuff ////////////////////////////////////////////////////////////////////HINSTANCE hInstMain = NULL;		// The applcatins handle.HWND hWndMain		= NULL;		// The main window handle,,,Interesting huh...// And if we want to be able to see the playing field, and use it, we need to delare it.int Map[MAPWIDTH][MAPHEIGHT+1];	// The Game Area, for where the blocks will fall is here.// Now we'll create a structure - or 'struct' - so we can declare a tile in the game// whatever that tiles function may be.struct Piece {	int size [4][4];	int x;	int y;};Piece sPrePiece;				// The piece coming after the current one, the preview piecePiece sPiece;					// The "s" stands for "struct" in this case of definition.// Now timing is everything in the case of computer games, so we need to declare something so// we don't end up out of sync. So lets make a DWORD timing variable.DWORD start_time;				// used in timingbool GameStarted = false;		// We don't want to start the game yet! This is used by "NewBlock()"BitMapObject bmoMap;			// map for the programBitMapObject bmoBlocks;			// block images// Now we'll build a simple message handler so we can process the events and draw the window //////LRESULT CALLBACK TheWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){	// What was the message?	switch(uMsg)	{	case WM_KEYDOWN:		{			// check for the pressing of the escape key			if (wParam==VK_ESCAPE)			{				DestroyWindow(hWndMain);	// kill the application and revert back to windows				return(0);					// handled message			}			// did the player press the down arrow?			else if (wParam==VK_DOWN)			{				Move(0,1);					// move down one row each click of the timer											// when the down arrow is depressed				return(0);					// handled message			}			// did the player press the up arrow?			else if (wParam==VK_UP)			{				RotateBlock();				// rotate the current block				return(0);					// handled message			}			// did the player press the left arrow?			else if (wParam==VK_LEFT)			{				Move(-1,0);					// Move the block peice to the left one for every click											// until it reaches the edge of the playing field				return(0);					// handled message			}			// did the player press the right arrow?			else if (wParam==VK_RIGHT)			{				Move(1,0);					// Move the block peice to the right one unit space for											// every click of the timer until it touches the right											// side of the window				return(0);					// handled message			}				}break;	case WM_DESTROY:		{			// let the application know that we are quitting...we've had enough torture - lol.			PostQuitMessage(0);			// phew, we handled that OK, so return 0			return(0);		}	case WM_PAINT:		{			PAINTSTRUCT ps;						// structure we use to paint the window			HDC hdc = BeginPaint(hwnd, &ps);	// start painting!			// redraw the map			BitBlt(hdc, 0, 0, TILESIZE*MAPWIDTH+TILESIZE*GREY, TILESIZE*MAPHEIGHT, bmoMap, 0, 0, SRCCOPY);						// end painting			EndPaint(hwnd, &ps);			// we handled it, so return NULL/0			return(0);		} break;	}	// pass along any other message to the message handler	return(DefWindowProc(hwnd, uMsg, wParam, lParam));}// Now with the variable declarations done, it's onto the good stuff //////////////////////////////// MAIN ///////////////////////////////////////////////////////////////////////////////////////////int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){	// define instance to globale variable	hInstMain = hInstance;	// create window class	WNDCLASSEX wcx;	// set the size of the structure	wcx.cbSize		= sizeof(WNDCLASSEX);	// class style	wcx.style		= CS_OWNDC | CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;	// windowprocedure	wcx.lpfnWndProc	= TheWindowProc;	// class extra?	wcx.cbWndExtra	= 0;	// application handle	wcx.hInstance	= hInstMain;	// icon	wcx.hIcon		= LoadIcon(NULL, IDI_APPLICATION);	// Cursor	wcx.hCursor		= LoadCursor(NULL, IDC_ARROW);	// background colour	wcx.hbrBackground	= (HBRUSH)GetStockObject(BLACK_BRUSH);	// menu?	wcx.lpszMenuName	= NULL;	// class name	wcx.lpszClassName	= WINDOWCLASS;	// small icon	wcx.hIconSm			= NULL;	// register the window class and if not successful, return 0	if(!RegisterClassEx(&wcx)) return(0);	// create the main window	hWndMain=CreateWindowEx(0, WINDOWCLASS, WINDOWTITLE, WS_BORDER | WS_SYSMENU | WS_CAPTION | WS_VISIBLE, 0, 0, 320, 240, NULL, NULL, hInstMain, NULL);	// check to see if window was created	if(!hWndMain) return(0);	//if program initialization failed, return 0 and exit	if(!GameInit()) return(0);	// message structure	MSG msg;	// message pump	for( ; ; )	{		// look for a message		if (PeekMessage(&msg, NULL, 0, 0,PM_REMOVE))		{			// there is a message			// check that we aren't quitting			if(msg.message==WM_QUIT) break;			// translate message			TranslateMessage(&msg);			// dispatch the message			DispatchMessage(&msg);		}		// run game loop		GameLoop();	}	// clean up the data	GameDone();	// return the wparam from the WM_QUIT message	return(msg.wParam);}// NOW THE GAME LOOP! /////////////////////////////////////////////////////////////////////////////bool GameInit(){	// see the client area	RECT rcTemp;	SetRect(&rcTemp, 0, 0, MAPWIDTH*TILESIZE+TILESIZE*GREY, MAPHEIGHT*TILESIZE); //	160x480 client area	// adjust the window size based on the desired client area	AdjustWindowRect(&rcTemp, WS_BORDER | WS_SYSMENU | WS_CAPTION | WS_VISIBLE, FALSE);	// setup the window width and height	SetWindowPos(hWndMain, NULL, 0, 0, rcTemp.right-rcTemp.left, rcTemp.bottom-rcTemp.top, SWP_NOMOVE);		//create the map image	HDC hdc = GetDC(hWndMain);	bmoMap.Create(hdc, MAPWIDTH*TILESIZE+TILESIZE*GREY, MAPHEIGHT+TILESIZE);	FillRect(bmoMap, &rcTemp, (HBRUSH)GetStockObject(BLACK_BRUSH));	ReleaseDC(hWndMain, hdc);	bmoBlocks.Load(NULL, "blocks.bmp");	NewGame();	return(true);	//return success}void GameDone(){	// whatever you want to put here to help}void GameLoop(){	if((GetTickCount() - start_time) > 1000)	{		Move(0,1);		start_time = GetTickCount();	}}void NewGame(){	start_time = GetTickCount();	GameStarted = false;	// start out the map	for (int x = 0; x < MAPWIDTH; x++)			// if the maximum width hasn't been reached	{											// then keep adding columns to the width		for (int y = 0; y < MAPHEIGHT; y++)		// if the maximum height hasn't been reached		{										// then keep adding rows to the height			if(y==MAPHEIGHT)					// if the height equals that specified				Map[x][y] = TILEGREY;			// put a grey tile in			else				Map[x][y] = TILEBLACK;			// otherwise keep drawing the playing field		}	}		NewBlock();									// add some more new blocks	DrawMap();									// now draw them}void DrawTile(int x, int y, int tile){	// make the mask first	BitBlt(bmoMap, x*TILESIZE, y*TILESIZE, TILESIZE, TILESIZE, bmoBlocks, tile*TILESIZE, TILESIZE, SRCAND);	// next, the image	BitBlt(bmoMap, x*TILESIZE, y*TILESIZE, TILESIZE, TILESIZE, bmoBlocks, tile*TILESIZE, 0, SRCPAINT);}void DrawMap(){	int xmy, ymx;	// now place the toolbar	for(xmy = MAPWIDTH; xmy < MAPWIDTH+GREY; xmy++)		for (ymx = MAPHEIGHT; ymx < MAPHEIGHT; ymx++)			 DrawTile(xmy, ymx, TILEGREY);	// draw the preview block - the one that comes next!	for(xmy = 0; xmy < 4; xmy++)		for (ymx = 0; ymx < 4; ymx++)			 if(sPrePiece.size[xmy][ymx] != TILENODRAW)				DrawTile(sPrePiece.x+xmy, sPrePiece.y+ymx, sPrePiece.size[xmy][ymx]);	// draw the map now, loop through the positions	for (xmy = 0; xmy < MAPWIDTH; xmy++)		 for (ymx = 0; ymx < MAPHEIGHT; ymx++)			  DrawTile(xmy, ymx, Map[xmy][ymx]);	// draw a moving block	for (xmy = 0; xmy < 4; xmy++)		 for (ymx = 0; ymx < 4; ymx++)			  if (sPiece.size[xmy][ymx] != TILENODRAW)				  DrawTile(sPiece.x+xmy, sPiece.y+ymx, sPiece.size[xmy][ymx]);	// now invalidate the window rectangle	InvalidateRect(hWndMain, NULL, NULL);}void NewBlock(){	int newblock;	int i, j;	// 0   1   2   3   4   5   6	// #							These	// #   ##   #  ##   ## ##  ##	are	// #   ##  ###  ## ##   #  #    block	// #                    #  #    types	// now start the game! make a block for the real play area and also make one in preview	srand(GetTickCount());	// initialize the piece to all blank	for(i = 0; i < 4; i++)		for(j = 0; j < 4; j++)			sPiece.size[j] = TILENODRAW;	sPiece.x = MAPWIDTH/2-2;	sPiece.y = -1;	// see if the game has started or not yet	if(GameStarted == false)	{		// if not, generate a piece		GameStarted = true;		// create a random block from our extensive block library		newblock = rand()%7;		// now for the block definition		switch(newblock)		{		case 0:	// TOWER!!!			{				sPiece.size[1][0] = TILERED;				sPiece.size[1][1] = TILERED;				sPiece.size[1][2] = TILERED;				sPiece.size[1][3] = TILERED;				sPiece.y		  = 0;						} break;		case 1:	// SQUARE!!!			{				sPiece.size[1][1] = TILEBLUE;				sPiece.size[1][2] = TILEBLUE;				sPiece.size[2][1] = TILEBLUE;				sPiece.size[2][2] = TILEBLUE;						} break;		case 2: // PYRAMID!!!			{				sPiece.size[1][1] = TILESTEEL;				sPiece.size[0][2] = TILESTEEL;				sPiece.size[1][2] = TILESTEEL;				sPiece.size[2][2] = TILESTEEL;			} break;		case 3:	// LEFT LEANER!!!			{				sPiece.size[0][1] = TILEYELLOW;				sPiece.size[1][1] = TILEYELLOW;				sPiece.size[1][2] = TILEYELLOW;				sPiece.size[2][2] = TILEYELLOW;			} break;		case 4: // RIGHT LEANER!!!			{				sPiece.size[2][1] = TILEGREEN;				sPiece.size[1][1] = TILEGREEN;				sPiece.size[1][2] = TILEGREEN;				sPiece.size[0][2] = TILEGREEN;			} break;		case 5: // LEFT KNIGHT!!!			{				sPiece.size[1][1] = TILEWHITE;				sPiece.size[2][1] = TILEWHITE;				sPiece.size[2][2] = TILEWHITE;				sPiece.size[2][3] = TILEWHITE;			} break;		case 6:	// RIGHT KNIGHT!!!			{				sPiece.size[2][1] = TILEPURPLE;				sPiece.size[1][1] = TILEPURPLE;				sPiece.size[1][2] = TILEPURPLE;				sPiece.size[1][3] = TILEPURPLE;			} break;		}	}	else	{		for(i = 0; i < 4; i++)			for(j = 0; j < 4; j++)				sPrePiece.size[j] = sPrePiece.size[j];	}	newblock = rand()%7;	for(i = 0; i < 4; i++)		for( j = 0; j < 4; j++)			sPiece.size[j] = TILENODRAW;	sPrePiece.x = MAPWIDTH+GREY/4;	sPrePiece.y = GREY/4;	switch(newblock)	{		case 0:	// TOWER!!!			{				sPiece.size[1][0] = TILERED;				sPiece.size[1][1] = TILERED;				sPiece.size[1][2] = TILERED;				sPiece.size[1][3] = TILERED;				sPiece.y		  = 0;						} break;		case 1:	// SQUARE!!!			{				sPiece.size[1][1] = TILEBLUE;				sPiece.size[1][2] = TILEBLUE;				sPiece.size[2][1] = TILEBLUE;				sPiece.size[2][2] = TILEBLUE;						} break;		case 2: // PYRAMID!!!			{				sPiece.size[1][1] = TILESTEEL;				sPiece.size[0][2] = TILESTEEL;				sPiece.size[1][2] = TILESTEEL;				sPiece.size[2][2] = TILESTEEL;			} break;		case 3:	// LEFT LEANER!!!			{				sPiece.size[0][1] = TILEYELLOW;				sPiece.size[1][1] = TILEYELLOW;				sPiece.size[1][2] = TILEYELLOW;				sPiece.size[2][2] = TILEYELLOW;			} break;		case 4: // RIGHT LEANER!!!			{				sPiece.size[2][1] = TILEGREEN;				sPiece.size[1][1] = TILEGREEN;				sPiece.size[1][2] = TILEGREEN;				sPiece.size[0][2] = TILEGREEN;			} break;		case 5: // LEFT KNIGHT!!!			{				sPiece.size[1][1] = TILEWHITE;				sPiece.size[2][1] = TILEWHITE;				sPiece.size[2][2] = TILEWHITE;				sPiece.size[2][3] = TILEWHITE;			} break;		case 6:	// RIGHT KNIGHT!!!			{				sPiece.size[2][1] = TILEPURPLE;				sPiece.size[1][1] = TILEPURPLE;				sPiece.size[1][2] = TILEPURPLE;				sPiece.size[1][3] = TILEPURPLE;			} break;	}	DrawMap();}// Now for the rotation code - here we will expand the "RotateBlock" declarion// that we made earlier. Here we rotate the piece, test for collisions and // then continue on until the block had landed on the others.void RotateBlock(){	int i, j, temp[4][4];	// copy the rotated block into the temp array we just created	for(i = 0; i < 4; i++)		for(j = 0; j < 4; j++)			temp[3-j] = sPiece.size[j];	// next check to see if the block in the temp array has	// collided with any of the borders	for(i = 0; i < 4; i++)		for(j = 0; j < 4; j++)			if(temp[j] != TILENODRAW)			   if(sPiece.x + i < 0 || sPiece.x - i > MAPWIDTH - 1 || sPiece.y + j < 0 || sPiece.y - j > MAPHEIGHT - 1)				  return;		// check to see if the current block has collided with other blocks too	for(int x = 0; x < MAPWIDTH; x++)		for(int y = 0; y < MAPHEIGHT; y++)			if(x >= sPiece.x && x < sPiece.x + 4)			   if(y >= sPiece.y && y < sPiece.y + 4)				  if(Map[x][y] != TILEBLACK)					 if(temp[x - sPiece.x][y - sPiece.y] != TILENODRAW)						return;	// end collision detection	// successful? Great! Now copy the rotated piece in the temp array to the currently active block	for(i = 0; i < 4; i++)		for(j = 0; j < 4; j++)			sPiece.size[j] = temp[j];	// now draw the result of the collision detection on the playing area so we can see that it has worked	DrawMap();		// and then return	return;}// Now for the move function. Here we test for more collisions - GREAT!!! lol. Also we test to see // if it is indeed moving and if the current block is touching another blockvoid Move(int x, int y){	if(CollisionTest(x, y))	{		if(y == 1)		{			if(sPiece.y < 1)						// if the block ends up starting above the playing field			{				NewGame();							// start a new game because the field is chockers!			}			else			{				bool killblock = false;				// otherwise keep going and don't reset								int i, j;				for(i = 0; i < 4; i++)				// add a new block to the list					for(j = 0; j < 4; j++)						if(sPiece.size[j] != TILENODRAW)						   Map[sPiece.x + i][sPiece.y + j] = sPiece.size[j];				// next, check for a cleared row				for(j = 0; j < MAPHEIGHT; j++)				{					bool filled = true;				// if the row is full					for(i = 0; i < MAPWIDTH; i++)						if(Map[j] == TILEBLACK)	// then clear the row						   filled = false;			// and draw black tiles					if(filled)					{						RemoveRow(j);				// but also remove the row of blocks						killblock = true;			// and delte those blocks from the game					}				}				// if killblock = true then don't draw anything and process this				if(killblock)				{					for(i = 0; i < 4; i++)						for(j = 0; j < 4; j++)							sPiece.size[j] = TILENODRAW;				}				NewBlock();							// give the player a new block			}		}	}	else	{		sPiece.x += x;		sPiece.y += y;	}	DrawMap();}// Now the CollisionTest() algorithmint CollisionTest(int nx, int ny){	int newx = sPiece.x + nx;	int newy = sPiece.y + ny;	int i, j, x, y;	for(i=0; i< 4; i++)		for(j=0; j< 4; j++)			if(sPiece.size[j] != TILENODRAW)<br>				<span class="cpp-keyword">if</span>(newx + i &lt; <span class="cpp-number">0</span> || newx + i &gt; MAPWIDTH - <span class="cpp-number">1</span> || newy + j &lt; <span class="cpp-number">0</span> || newy + j &gt; MAPHEIGHT - <span class="cpp-number">1</span>)<br>					<span class="cpp-keyword">return</span> <span class="cpp-number">1</span>;<br><br><br>	<span class="cpp-keyword">for</span>(x = <span class="cpp-number">0</span>; x &lt; MAPWIDTH; x++)<br>		<span class="cpp-keyword">for</span>(y = <span class="cpp-number">0</span>; y &lt; MAPHEIGHT; y++)<br>			<span class="cpp-keyword">if</span>(x &gt;= newx &amp;&amp; x &lt; newx + <span class="cpp-number">4</span>)<br>			   <span class="cpp-keyword">if</span>(y &gt;= newy &amp;&amp; y &lt; newy + <span class="cpp-number">4</span>)<br>				  <span class="cpp-keyword">if</span>(Map[x][y] != TILEBLACK)<br>					 <span class="cpp-keyword">if</span>(sPiece.size[x - newx][y - newy] != TILENODRAW)<br><br>					 <span class="cpp-keyword">return</span> <span class="cpp-number">1</span>;<br><br>		<span class="cpp-keyword">return</span> <span class="cpp-number">0</span>;<br><br>}<br><br><span class="cpp-comment">// And finally the RemoveBlock() function</span><br><br><span class="cpp-keyword">void</span> RemoveRow(<span class="cpp-keyword">int</span> row)<br>{<br>	<span class="cpp-keyword">int</span> x, y;<br><br>	<span class="cpp-keyword">int</span> counter = <span class="cpp-number">0</span>;<br><br>	<span class="cpp-keyword">for</span>(x = <span class="cpp-number">0</span>; x &lt; MAPWIDTH; x++)<br>		<span class="cpp-keyword">for</span>(y = row; y &gt; <span class="cpp-number">0</span>; y–)<br>			Map[x][y] = Map[x][y-<span class="cpp-number">1</span>];<br>}<br><br><br><br></pre></div><!–ENDSCRIPT–><br><br>hope that wasn't too much.<br><br><small><b>EDIT:</b> Changed your post to use Source tags rather than Code.  You can read about them <a href="http://www.gamedev.net/community/forums/faq.asp">in the faq</a>. -jba</small><br><br><small><b>EDIT 2:</b> Changing tags from code to source tends to leave escape codes for angle brackets inside the source boxes. This can be fixed by simply re-editing the post and not making any changes. -Zahlman</small><br><br><!–EDIT–><span class=editedby><!–/EDIT–>[Edited by - Zahlman on June 10, 2009 3:53:53 PM]<!–EDIT–></span><!–/EDIT–>
OK, try debugging again, but this time step through your code to see what's going on. You can do this by pressing F10 and F11 depending on whether you want to step into a function or step over a function. Keep an eye on the 'locals' window while in WinMain. Learning to use the debugger is essential for any serious developer.

In any case I think I can help you narrow the problem down. You have 4 return statements in WinMain. Because your code is exiting 'normally' (in the window you were looking at "exit code 'x'" is whatever you returned from WinMain with, in this case you used '0' for everything) we know that one of those 4 returns is the problem. The first 3 occur at initialization only so start with those. Either RegisterClassEx failed, CreateWindowEx, or GameInit failed. GameInit always returns true so that's probably not the problem.

C++: A Dialog | C++0x Features: Part1 (lambdas, auto, static_assert) , Part 2 (rvalue references) , Part 3 (decltype) | Write Games | Fix Your Timestep!

In your code, RegisterClassEx() returns 0 because you do not set the cbClsExtra member of the WNDCLASSEX structure, and thus it contains garbage.
I suggest using a declaration like this to automatically zero out the entire structure, and then initialize only the fields you need:

WNDCLASSEX wcx = {0};

OK. so I tried that last tip out, and cancelled the WNDCLASSEX structure by making it zero, but now when I play it the blocks are there, but then they dissapear by themselves...maybe my dimensions are wrong or something.

I am trying to scout through the code to see where these four initialization parameters are...I'll get back to you.

This topic is closed to new replies.

Advertisement