#include <SDL/SDL.h> //SDL library #include <SDL/SDL_image.h> //+SDL_image library (I use it for loading .png files) #include "engine.h" // The simple engine class #include <sstream> // I use it to work with text streams int main ( int argc, char** argv ) //when you use a SDL c++ app you have to initialize main that way { Engine myengine; //Create a object from the type "Engine" myengine.SetVga(); //Start graphics mode myengine.LoadTileset(); //Load the image tileset to a SDLSurface std::stringstream text; //Variable used to display text Uint8 CellMap[50][50]; //The cell map, here qe store the cell state Uint8 x,y; //variables used to travel across the cell array int xmax, ymax; //Max size of tiles to display on screen Uint8 Counter; //Counter of the surrounding cells bool Paused; //Game paused? Paused=false;//Let's start with the game running xmax=myengine.ScreenX / myengine.TileSize; //calculate maximun number of cells (x-width) ymax=myengine.ScreenY / myengine.TileSize; //calculate maximun number of cells (y-height) for (x=0;x<50;x++){ for (y=0;y<50;y++){ CellMap[x][y]=0; //clean the cell map so everything is "0" };//end y for };//end x for //I put just 5 cells, into a "slider" configuration CellMap[1][3]=1; CellMap[2][3]=1; CellMap[3][3]=1; CellMap[3][2]=1; CellMap[2][1]=1; // program main loop bool done = false; while (!done) // will loop infinite times until we set done = true { // message processing loop SDL_Event event; while (SDL_PollEvent(&event)) { // check for messages switch (event.type) { // exit if the window is closed case SDL_QUIT: done = true; break; // check for keypresses case SDL_KEYDOWN: { // exit if ESCAPE is pressed if (event.key.keysym.sym == SDLK_ESCAPE) done = true; break; } } // end switch } // end of message processing myengine.Frames++;//increase frame counter myengine.FillColour(200,200,200);//Clear screen with grey color if (myengine.TimeElapsed()>=1000) // every second (1000ms) { myengine.UpdateTimer(); // reset time counter myengine.FPS = myengine.Frames; // update the frames per second counter myengine.Frames=0; // reset frame counter text.str(""); //clean variable "text" text << "FPS:" << myengine.FPS; //will set text = "FPS: number" SDL_WM_SetCaption( text.str().c_str(), NULL ); //set the title of the window to "text">>"FPS: number" if (Paused==false){ //If the game is not paused, process cell map (step 1) for (x=1;x<=(xmax-1);x++){ for (y=1;y<=(ymax-1);y++){ Counter=0;//now we count the number of surrounding cells if (CellMap[x-1][y-1]==1 or CellMap[x-1][y-1]==3)Counter++; if (CellMap[x-1][y]==1 or CellMap[x-1][y]==3)Counter++; if (CellMap[x-1][y+1]==1 or CellMap[x-1][y+1]==3)Counter++; if (CellMap[x][y-1]==1 or CellMap[x][y-1]==3)Counter++; if (CellMap[x][y+1]==1 or CellMap[x][y+1]==3)Counter++; if (CellMap[x+1][y-1]==1 or CellMap[x+1][y-1]==3)Counter++; if (CellMap[x+1][y]==1 or CellMap[x+1][y]==3)Counter++; if (CellMap[x+1][y+1]==1 or CellMap[x+1][y+1]==3)Counter++; if (CellMap[x][y]==0 and Counter==3)CellMap[x][y]=2; //Born if (CellMap[x][y]==1){ if (Counter<2 or Counter >3)CellMap[x][y]=3; //Die }; //myengine.BlitTileset(x,y,CellMap[x][y]); >>DISABLED }; //End for y }; //End for x //myengine.Flip(); >>DISABLED }//enf if pause }//end if time elapsed >= 1 second for (x=1;x<=(xmax-1);x++){//Process cell map (step 2) for (y=1;y<=(ymax-1);y++){ if (CellMap[x][y]==2)CellMap[x][y]=1; //Born if (CellMap[x][y]==3)CellMap[x][y]=0; //Die myengine.BlitTileset(x,y,CellMap[x][y]); //Display cell on screen }; }; myengine.UpdateMouse();//update x and y mouse position + mouse buttons pressed if(myengine.MouseButtons ==SDL_BUTTON(SDL_BUTTON_LEFT)){//Pressed left mouse button int sx,sy; /* That code shows how to do a simple mouse maping: we have the physicall position where mouse is (myengine.MouseX,myengine.Mousey) but we need to know which tile correspond to that physicall position so we make an integer division between mouse (x, y) and the tilesize, the resulting sx, and sy is the tile where we have our mouse cursor */ sx=myengine.MouseX/myengine.TileSize; sy=myengine.MouseY/myengine.TileSize; //swap cell state: dead>living living>dead if(CellMap[sx+1][sy+1]==0) //It the cell is dead { CellMap[sx+1][sy+1]=1;//Cell is living }else{ //else cell is living CellMap[sx+1][sy+1]=0;//kill the cell } text.str("");//clean variable "text" text << "Left mouse pressed at:X:" << sx << " Y: "<< sy;//will set text = "Left mouse pressed at:X: number Y: number" SDL_WM_SetCaption( text.str().c_str(), NULL );//set the title of the window to "text">>"Left mouse pressed at:X: number Y: number" };//end left mouse button if if(myengine.MouseButtons ==SDL_BUTTON(SDL_BUTTON_RIGHT) ){//Pressed right mouse button if (Paused ==true)//if the game is paused { Paused =false;//continue game }else{ Paused=true;//else the game is running , pause it }; if (Paused==true) SDL_WM_SetCaption( "PAUSED" , NULL );//if the game is paused, show it in the title bar };//end right mouse button if myengine.Flip();//Finally, update the screen from the back buffer :) myengine.Wait(1); //prevent application from freezing OS } // end main loop myengine.~Engine(); //Destroy object myengine >> that will free the SDSSurfaces and close SDL return 0; //Everything is ok }
Wednesday, December 29, 2010
Code::Blocks(5) C++ SDL and Life "life.cpp"
Here is the code for the main program file, just copy and paste into file life.cpp in the project, then save the project:
Labels:
Code::Blocks,
Life Game
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment