John Keats Skrevet 8. mars 2012 Del Skrevet 8. mars 2012 (endret) 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: Endret 8. mars 2012 av Hello Kitty Lenke til kommentar
John Keats Skrevet 8. mars 2012 Forfatter Del Skrevet 8. mars 2012 Jeg har til nå prøvd å feilsøke litt på egenhånd. Ved å endre gameRunning til false før jeg kjører vil spillet lukke seg i stedet for å gi meg et hvitt vindu. Men utover dette er jeg ikke sikker på hva som foregår. Lenke til kommentar
Cemi Skrevet 8. mars 2012 Del Skrevet 8. mars 2012 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
MisterIT Skrevet 11. mars 2012 Del Skrevet 11. mars 2012 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå