-
Problem with game code.
I'm not sure if this is exactly the right forum for this, so I apologise if it isn't.
Im writing game code for a basic slot machine. To test fuctionality I've written a basic prototype. When ever a certain area of teh screen is clicked, the pictures on display are radomised and redisplayed. The three possible images can come from a group of 6.
The program compiles and links fine, however as soon as I open it it crashes, ive never come across a problem like this, however could it be caused by a memory managment mistake I'm not seeing?
The problem should be within this code, as the game engine and all other include files come as example with a book I'm learning from, and have caused no problems in past. The code of the main program is included below.
Thanks in advance for your help.
Code:
//-----------------------------------------------------------------
// Include Files
//-----------------------------------------------------------------
#include "slot.h"
//-----------------------------------------------------------------
// Game Engine Functions
//-----------------------------------------------------------------
BOOL GameInitialize(HINSTANCE hInstance)
{
// Create the game engine
g_pGame = new GameEngine(hInstance, TEXT("UFO"),
TEXT("UFO"), NULL, NULL, 600, 600);
if (g_pGame == NULL)
return FALSE;
// Set the frame rate
g_pGame->SetFrameRate(0);
// Store the instance handle
g_hInstance = hInstance;
return TRUE;
}
void GameStart(HWND hWindow)
{
// Create and load the background and saucer bitmaps
int randselect;
HDC hDC = GetDC(hWindow);
g_pBackground = new Bitmap(hDC, IDB_BACKGROUND, g_hInstance);
g_pTile[0] = new Bitmap(hDC, IDB_TILE1, g_hInstance);
g_pTile[1] = new Bitmap(hDC, IDB_TILE2, g_hInstance);
g_pTile[2] = new Bitmap(hDC, IDB_TILE3, g_hInstance);
g_pTile[3] = new Bitmap(hDC, IDB_TILE4, g_hInstance);
g_pTile[4] = new Bitmap(hDC, IDB_TILE5, g_hInstance);
g_pTile[5] = new Bitmap(hDC, IDB_TILE6, g_hInstance);
srand(GetTickCount());
// Set the initial saucer position and speed
randselect = rand() % 5;
g_pTile1 = g_pTile[randselect];
randselect = rand() % 5;
g_pTile2 = g_pTile[randselect];
randselect = rand() % 5;
g_pTile3 = g_pTile[randselect];
g_iTile1X = 50;
g_iTile1Y = 100;
g_iTile2X = 200;
g_iTile2Y = 100;
g_iTile3X = 400;
g_iTile3Y = 100;
}
void GameEnd()
{
// Cleanup the background and saucer bitmaps
delete g_pBackground;
delete g_pTile[6];
delete g_pTile1;
delete g_pTile2;
delete g_pTile3;
// Cleanup the game engine
delete g_pGame;
}
void GameActivate(HWND hWindow)
{
}
void GameDeactivate(HWND hWindow)
{
}
void GamePaint(HDC hDC)
{
// Draw the background and saucer bitmaps
g_pBackground->Draw(hDC, 0, 0);
g_pTile1->Draw(hDC, g_iTile1X, g_iTile1Y, TRUE);
g_pTile2->Draw(hDC, g_iTile2X, g_iTile2Y, TRUE);
g_pTile3->Draw(hDC, g_iTile3X, g_iTile3Y, TRUE);
}
void GameCycle()
{
}
void HandleKeys()
{
}
void MouseButtonDown(int x, int y, BOOL bLeft)
{
int randselect;
if (bLeft)
{
if ((x >= 200 && x <= 400) && (y >= 500 && y <= 600 ))
{
randselect = rand() % 5;
g_pTile1 = g_pTile[randselect];
randselect = rand() % 5;
g_pTile2 = g_pTile[randselect];
randselect = rand() % 5;
g_pTile3 = g_pTile[randselect];
InvalidateRect(g_pGame->GetWindow(), NULL, FALSE);
}
else
{
InvalidateRect(g_pGame->GetWindow(), NULL, FALSE);
}
}
else
{
InvalidateRect(g_pGame->GetWindow(), NULL, FALSE);
}
}
void MouseButtonUp(int x, int y, BOOL bLeft)
{
}
void MouseMove(int x, int y)
{
}
-
How is g_pTile declared? You should specifically delete each thing that you specifically create with new. You don't use new with g_pTile1, g_pTile2, or g_pTile3, so you shouldn't call delete on those. Instead, you should set them to 0 when you delete the values in the g_pTile array (which they are pointing to). To delete the items in the g_pTile array, just delete them the same way you created them with new: delete g_pTile[0], delete g_pTile[1], etc.
-
I've changed it as following however it is still crashing, I tried to follow logically what you were saying, but I still may have missed something:
Ive also included the header file incase the problem is there
Code:
void GameEnd()
{
// Cleanup the background and saucer bitmaps
delete g_pBackground;
delete g_pTile[0];
delete g_pTile[1];
delete g_pTile[2];
delete g_pTile[3];
delete g_pTile[4];
delete g_pTile[5];
g_pTile1 = 0;
g_pTile2 = 0;
g_pTile3 = 0;
// Cleanup the game engine
delete g_pGame;
}
Header file:
Code:
//-----------------------------------------------------------------
#ifndef UFO_H
#define UFO_H
//-----------------------------------------------------------------
// Include Files
//-----------------------------------------------------------------
#include <windows.h>
#include "resource.h"
#include "GameEngine.h"
#include "Bitmap.h"
//-----------------------------------------------------------------
// Global Variables
//-----------------------------------------------------------------
HINSTANCE g_hInstance;
GameEngine* g_pGame;
Bitmap* g_pBackground;
Bitmap* g_pTile[6];
Bitmap* g_pTile1;
Bitmap* g_pTile2;
Bitmap* g_pTile3;
int g_iTile1X;
int g_iTile1Y;
int g_iTile2X;
int g_iTile2Y;
int g_iTile3X;
int g_iTile3Y;
#endif
-
That deletion code looks better now.
I can't see any specific problem in the posted code. It is possible that since the application crashes as soon as you open it, the problem would be in the initialization. Maybe you are passing the wrong parameters to the GameEngine constructor.
If you have access to a debugger, you might be able to see exactly where it is crashing. You can also put cout statements to help you narrow down which code is causing the issue.
-
Edit:
Just noticed you are using new to allocate memory -,-. Nevermind.
-
Many thanks, You were infact right,
Code:
g_pGame = new GameEngine(hInstance, TEXT("UFO"),
TEXT("UFO"), NULL, NULL, 600, 600);
The two null values are meant to be identifiers to icon files, I had set them to null as I hadnt designed icons yet, and forgot to change them before compiling. Obviously the GameEngine constructer doesn't like null values for those parameters.
Thanks again.