Gå til innhold

Spillprogrammering, spill kjører ikke


Anbefalte innlegg

Holder på å lære meg C++, og satte meg ned for å skrive et plattformspill. Alt kjørte fint, men så satt jeg oppe i natt å flyttet mye av koden for Init og Events(input) over til en class.

 

Vet ikke om dette er riktig bruk av classes, men nå virker altså ikke spillet lenger. Etter en del problemer med at spillet ikke ville kompilere har jeg luket ut feilene, og spillet kompilerer helt fin.

 

Problemet nå er at når jeg starter så åpnes spillet som vanlig, vinduet setter seg til riktig størrelse, og jeg får en vindustittel. Problemet er at det virker som at alt jeg putter i hovedloopen min ikke kjøres. Grunnen til at jeg spør om hjelp er at så lenge jeg ikke har feil når jeg prøver å kompilere så klarer jeg ikke finne ut hvorfor det ikke virker som det skal. Jeg har liksom ikke noe å gå etter.

 

Så da hadde jeg satt kjempepris på om noen kunne ta en kort titt og se om de skjønner noe av problemet :)

 

 

Poster alt i spoiler tags

 

 

 

 

MAIN.CPP

#include "SDL.h"
#include "SDL_image.h"


#include "ourDeclarations.h"
#include "ourGameEvents.h"
#include "ourTimer.h"

#include "ourBlock.h"
#include "ourPlatform.h"

#include <string>
#include <iostream>
#include <fstream>



//Block type, xPosition, yPosition, xVelocity, yVelocity
Block ourBlock(DIRT, 0.0, (SCREEN_HEIGHT - BLOCK_HEIGHT ), 0.0, 0.0);
Block bounceBlock(BOUNCE, (SCREEN_WIDTH - BLOCK_WIDTH ), 0.0, -100.0, 0.0);

//Platform xOff, yOff, xVel, yVel, isBreakable, isSticky
Platform testPlatform( 200.0, 400.0, 100.0, 0.0, false, false );

//Our GameEvents class
GameEvents mainGame;

//Our timer class
Timer gameClock;


SDL_Surface *load_image( std::string filename )
{
//The image that's loaded
SDL_Surface* loadedImage = NULL;

//The optimized surface that will be used
SDL_Surface* optimizedImage = NULL;

//Load the image
loadedImage = IMG_Load( filename.c_str() );

//If the image loaded
if( loadedImage != NULL )
{
	//Create an optimized surface
	optimizedImage = SDL_DisplayFormat( loadedImage );

	//Free the old surface
	SDL_FreeSurface( loadedImage );

	//If the surface was optimized
	if( optimizedImage != NULL )
	{
		//Color key surface
		SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, SDL_MapRGB( optimizedImage->format, 0, 0xFF, 0xFF ) );
	}
}

//Return the optimized surface
return optimizedImage;
}








void load_files()
{
//Load the sprites
dirtblock = load_image( "Data/Img/dirtblock.png" );
stoneblock = load_image( "Data/Img/stoneblock.png" );
goldblock = load_image( "Data/Img/goldblock.png" );
arrowblock = load_image( "Data/Img/arrowblock.png" );
hotkey = load_image( "Data/Img/hotkey.png" );
platform = load_image( "Data/Img/platform.png" );
}









void collisionDetection()
{
//Check collision from above and below
if ( ( ( bounceBlock.xOffset + BLOCK_WIDTH ) > testPlatform.xOffset ) && ( bounceBlock.xOffset < ( testPlatform.xOffset + testPlatform.WIDTH ) ) )
{
	//Check above
	if ( ( ( bounceBlock.yOffset + BLOCK_HEIGHT ) > testPlatform.yOffset ) && ( bounceBlock.yOffset < ( testPlatform.yOffset + testPlatform.HEIGHT ) ) )
	{
		bounceBlock.yOffset -= bounceBlock.yVelocity * bounceBlock.timeSinceLast;
		bounceBlock.yVelocity = -bounceBlock.yVelocity * 0.70;
	}
	//Check below
	if ( ( bounceBlock.yOffset < ( testPlatform.yOffset + testPlatform.HEIGHT ) ) && ( ( bounceBlock.yOffset + BLOCK_HEIGHT ) > testPlatform.yOffset ) )
	{
		bounceBlock.yOffset += bounceBlock.yVelocity * bounceBlock.timeSinceLast;
		bounceBlock.yVelocity = -bounceBlock.yVelocity * 0.70;
	}
}

//Check collision from left and right
if ( ( ( bounceBlock.yOffset + BLOCK_HEIGHT ) > testPlatform.yOffset ) && ( bounceBlock.yOffset < ( testPlatform.yOffset + testPlatform.HEIGHT ) ) )
{
	//Check left
	if ( ( ( bounceBlock.xOffset + BLOCK_WIDTH ) > testPlatform.xOffset ) && ( bounceBlock.xOffset < ( testPlatform.xOffset + testPlatform.WIDTH ) ) )
	{
		if ( bounceBlock.xOffset < BLOCK_WIDTH )
		{
			bounceBlock.yOffset = testPlatform.yOffset - BLOCK_HEIGHT ;
		}
		bounceBlock.xOffset -= ( bounceBlock.xVelocity * bounceBlock.timeSinceLast ) + ( testPlatform.xVelocity * testPlatform.timeSinceLast);
		bounceBlock.xVelocity = -bounceBlock.xVelocity;
	}
	//Check right
	if ( ( bounceBlock.xOffset < ( testPlatform.xOffset + testPlatform.WIDTH ) ) && ( ( bounceBlock.xOffset + BLOCK_WIDTH ) > testPlatform.xOffset ) )
	{
		if ( bounceBlock.xOffset > ( SCREEN_WIDTH - BLOCK_WIDTH ) )
		{
			bounceBlock.yOffset = testPlatform.yOffset - BLOCK_HEIGHT;
		}
		bounceBlock.xOffset += ( bounceBlock.xVelocity * bounceBlock.timeSinceLast ) + ( testPlatform.xVelocity * testPlatform.timeSinceLast);
		bounceBlock.xVelocity = -bounceBlock.xVelocity;
	}
}
}







void GameEvents::gameClean()
{
SDL_FreeSurface( dirtblock );
SDL_FreeSurface( stoneblock );
SDL_FreeSurface( goldblock );
SDL_FreeSurface( arrowblock );
SDL_FreeSurface( platform );

SDL_Quit();
}








int main( int argc, char* args[] )
{
/*
//Keep in case we need to debug later

//We create a text file
std::ofstream positions;
positions.open ("positions.txt");
int positionCount = 1;
*/

//ourGame.gameLoad();

       load_files();

mainGame.gameInit();


   //Fill the screen white
   //SDL_FillRect( screen, &screen->clip_rect, SDL_MapRGB( screen->format, 0xFF, 0xFF, 0xFF ) );

   //While the user hasn't quit
   while( mainGame.gameRunning == true )
   {
	gameClock.start();



	//Events
		ourBlock.blockEvents();
		testPlatform.platformUpdate();




	//Update
		ourBlock.blockUpdate();
		bounceBlock.blockUpdate();
		testPlatform.platformUpdate();

		collisionDetection();


	//Draw

		SDL_FillRect( screen, &screen->clip_rect, SDL_MapRGB( screen->format, 0xFF, 0xFF, 0xFF ) );

		apply_surface( 100, 100, hotkey ,screen );


		ourBlock.blockDraw();
		bounceBlock.blockDraw();
		testPlatform.platformDraw();



	if( SDL_Flip( screen ) == -1 )
	{
		return 1;
	}

	/*
	//We write to the textfile
	positions << "\nPosUpdate " << positionCount << ": " << ourBlock.yOffset << "\nTimeSinceLast: " << ourBlock.timeSinceLast << std::endl;
	positionCount++;
	*/
   }

/*
//We close the text file
positions.close();
*/

   //Clean up
mainGame.gameClean();

   return 0;
}

 

 

OURGAMEEVENTS.H

#if !defined (OUR_GAME_EVENTS_H)
#define OUR_GAME_EVENTS_H

#include "ourDeclarations.h"
#include "SDL.h"
#include <string>

class GameEvents
{
private:

public:

bool gameRunning;
void gameLoad();
void gameInit();
void gameInput();
void gameUpdate();
void gameClean();
void gravityShift();

GameEvents()
{
     gameRunning = true;	
}

~GameEvents()
{

}

};

void GameEvents::gameLoad()
{

}

void GameEvents::gameInit()
{
gameRunning = true;

//Initialize all SDL subsystems
   SDL_Init( SDL_INIT_EVERYTHING );

   //Set up the screen
   screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );

   //Set the window caption
   SDL_WM_SetCaption( "Gravity Shifting", NULL );
}

void GameEvents::gameInput()
{
//While there's events to handle
while( SDL_PollEvent( &event ) )
   {
	if( event.type == SDL_KEYDOWN )
	{
		switch( event.key.keysym.sym )
		{
			case SDLK_ESCAPE: gameRunning = false; break;
			case SDLK_t: gravityShift(); break;
		}
	}
	//If the user has Xed out the window
	if( event.type == SDL_QUIT )
	{
		//Quit game
		gameRunning = false;
	}
}
}

void GameEvents::gameUpdate()
{
}

void GameEvents::gravityShift()
{
if( gravityStatus == UP)
{
	gravityStatus = DOWN;
	gravityConstant = 1;
}
else if( gravityStatus == DOWN)
{
	gravityStatus = UP;
	gravityConstant = -1;
}
}

/*void GameEvents::gameClean()
{
   //Quit SDL
   SDL_Quit();
}*/

#endif

 

Har ikke inkludert ourBlock.h, ourPlatform.h eller ourTimer.h, siden jeg ikke har forandret noe på disse siden alt fungerte som det skulle. Poster de om ønsket.

 

 

 

 

 

Her er et bilde av hvordan det ser ut når jeg kjører:

 

whitewindow.png

Endret av Hello Kitty
Lenke til kommentar
Videoannonse
Annonse

Vel, er ganske vanskelig å lese direkte hva det er som er galt. Ser ingenting som ser ingen grunn til at det ikke skulle tegnes korrekt?

 

Jeg antar at draw kallene kjøres og at du har sjekket at alle variabler er korrekte der? I så fall, så må det jo være enten at du tegner noe hvitt over dem igjen? :)

Lenke til kommentar

hmm, er ukjent med SDL men ser at du benytter objektet "screen" i main

 SDL_FillRect( screen, &screen->clip_rect, SDL_MapRGB( screen->format, 0xFF, 0xFF, 0xFF ) );

 

 

men den blir opprettet i en funksjon i gameevent.h

screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );

 

prøv å deklarere

SDL_Surface *screen

i gameevent.h

 

og bytt ut den forrige sdl_fillrct i main med

 

 SDL_FillRect( mainGame.screen, &mainGame.screen->clip_rect, SDL_MapRGB( mainGame.screen->format, 0xFF, 0xFF, 0xFF ) );

 

 

Om SDL tilatter deg å gjøre det slik som du har gjort kan du bare se bort fra dette tipset, har ingen erfaring med denne klassen men syns denne biten av koden såg merkelig ut.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...