Serious Error please help!

Started by
4 comments, last by Bad_Maniac 21 years, 5 months ago
Some of you might have seen my post on my VERY strange lookup table error a while back. and I was asked to post my init function, where everything happens, and now when I have started to add some more code to it, it gives me more headache, so please see if you can figure out what''s wrong, because I cannot see any problem.
  
//This function initializes the game and DirectX----------------------------------------------

void GameInit(int screen_width, int screen_height)
{
	// Initialize Direct Draw

	DDSURFACEDESC2	surfaceDesc;		//Surface description

	DDSCAPS2		surfaceCaps;		//Surface capabilities


	// Create Direct Draw object and set it''s cooperation level with windows 

	DirectDrawCreateEx(NULL, (VOID** )&directDraw, IID_IDirectDraw7, NULL);
	directDraw->SetCooperativeLevel(main_window_handle, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT);
	
	// Set the display to the screen width and height specified, and 16-bit color

	directDraw->SetDisplayMode(screen_width, screen_height, 16, 0, 0);
	
	// clean out the surface description struct and set it''s size

	DDRAW_INIT_STRUCT(surfaceDesc)
	
	// Set all primary surfaces capabilities and prepare it for a backbuffer

	surfaceDesc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
	surfaceDesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
	surfaceDesc.dwBackBufferCount = 1;
	
	// Create the primary surface

	directDraw->CreateSurface(&surfaceDesc, &primary_surface, NULL);

	// clean out the surface capabilites struct

	ZeroMemory(&surfaceCaps, sizeof(surfaceCaps));

	// Set primary surface''s capabilites to accept an attached surface

	surfaceCaps.dwCaps = DDSCAPS_BACKBUFFER;

	// Attach the backbuffer (back_buffer) to the primary surface

	primary_surface->GetAttachedSurface(&surfaceCaps, &back_buffer);

	//Create a clipper, and atach it to the back_buffer

	directDraw->CreateClipper(0,&clipper,NULL);
	clipper->SetHWnd(0, main_window_handle);
	back_buffer->SetClipper(clipper);
    clipper->Release();
				
	//Set up an offscreen plain system memory scratch buffer surface

	DDSURFACEDESC2   temp_desc;
	DDRAW_INIT_STRUCT(temp_desc)

	temp_desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
   	temp_desc.dwWidth = 640;
	temp_desc.dwHeight = 480;
	temp_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;	
	if(FAILED(directDraw->CreateSurface(&temp_desc, &scratch_buffer, NULL)));
		return;	

	//Calculate the lookuptable for y values, for Plot_Pixel

	//Lock the back buffer

	DDRAW_INIT_STRUCT(ddsurface) //Clear ddsurface and set size, never assume it''s clean	

	if (FAILED(back_buffer->Lock(NULL, &ddsurface, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL)))
		return;
	lpitch16 = (ddsurface.lPitch >> 1);
	for (int counter = 0; counter <= 480; counter++)
	{
		ylookup[counter] = lpitch16 * counter;
	}
	//Unlock the Back buffer

	if (FAILED(back_buffer->Unlock(NULL)))
	return;

	// Load the bitmaps to their surfaces here

	Load_Bmp(background,1, "background.bmp", backrect);
	Load_Bmp(particles, 1, "particles2.bmp", partrect);
	Load_Bmp(gnome, 0, "gnome.bmp", gnomerect);
	Load_Bmp(alpha_bmp, 0, "alpha1.bmp", alpharect);

	// Set the position for the bitmap to draw at

	bitmapX = 320;
	bitmapY = 240;

	//Calculate rects for the Particles, each one is 8*8 pixels in size.

	for (int i = 0; i < 8; i++)
	{
		particle_rect[i].left = i * 8;
		particle_rect[i].right = i * 8 + 8;
		particle_rect[i].top = 0;
		particle_rect[i].bottom = 8;
	}
	Init_Particles();
	Init_Starfield();
	
	//Calculates lookup tables for sin and cos functions

	for (int angle = 0; angle <= 360; angle++)
	{
		double rad_angle = angle * (3.141592654/180);
		sin_look[angle] = sin(rad_angle);
		cos_look[angle] = cos(rad_angle);
	}
	
	ShowCursor(FALSE); //Hide the mouse cursor

}
  
Don't we all still remember and miss the day we plotted our first pixel?
Advertisement
no need for a clipper in fullscreen!
Have you perhaps defined sin_look and cos_look as double sin_look [360], cos_look [360]; ? If you have, then the <= 360 in your for clause causes you to write outside the array bounds...

Kippesoep
Possibly the same type of problem with the loading of the ylookup array.
double sin_look[361];

that way I can have 0 - 360 inclusive.

and, what? no need for clipper in full screen? what about writing out of the surface?
Don't we all still remember and miss the day we plotted our first pixel?
As Darrell L said, you might still have a bounds problem with your ylookup array. It would be helpful if you posted a bit more info about the actual problem (I haven''t seen your original post about this) and the code where the problem manifests itself.

You could always use a simple for-loop to display the contents of the lookup table and see if anything is incorrect. If the values are incorrect, move the check elsewhere until you pin down the section of your code that causes it to be wrong.

Kippesoep

This topic is closed to new replies.

Advertisement