//12.10.2013, Amar Tufo //komanda za prevod: g++ -o test main.cpp -lSDLmain -lSDL -lGL -lSDL_image -lSDL _mixer //posljednje izmjene u izvornom kodu su nainjene 20 Oktobra, 2013 //****************************************************************************** ****** //Ukljui SDL biblioteku i pretprocesor #include <SDL/SDL.h> #include <SDL/SDL_opengl.h> #include "SDL/SDL_image.h" //ukljuen je image pretprocesor #include <SDL/SDL_mixer.h> #include <iostream> #include <string> //funkcija za uitavanje slikovnih datoteka u projekat GLuint loadTexture( const std::string &fileName ) { //funkcija za import slikovnih datoteka preko SDL-a SDL_Surface *image = IMG_Load(fileName.c_str() ); //format slikovnih datoteka SDL_DisplayFormatAlpha(image); unsigned object(0); //generijaj GL teksturu glGenTextures(1, &object); //pripoji teskturu 2D renderu glBindTexture(GL_TEXTURE_2D, object); //dodatne render funkcije za openGl teksturu glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image->w, image->h, 0, GL_RGBA, GL_UNS IGNED_BYTE, image->pixels); //free surface SDL_FreeSurface(image); return object; } //detekcija kolizije lopta + ploa bool checkCollision(float Ax, float Ay, float Aw, float Ah, float Bx, float By, float Bw, float Bh) { //kada lopta udari plou, detekcija kolizije i lopta nastavlja skakutati po proz oru if ( Ay+Ah < By) return false; else if (Ay > By+Bh) return false; else if (Ax + Aw < Bx) return false; else if (Ax > Bx+Bw) return false; return true; } //-------------------- STRUKTURE ------------------------------------ struct Brick //definiraj 4 varijable za CIGLE { float x; //x pozicija prikaza float y; //y pozicija prikaza float width; //duina cigli float height; //visina cigli bool alive; }; //poetak programa int main (int argc, char* args[]) { //Inicijalizuj sve funkcije SDL-a SDL_Init(SDL_INIT_EVERYTHING); // SDL_MIXER WAS CREATED USING THE HELP OF thecplusplusguy/youtube.com //Setting variables for SDL_Mixer Mix_Chunk* effect1; // Mix_Chunk* effect2; Mix_Chunk* effect3; Mix_Chunk* effect4; Mix_Music* music; Mix_OpenAudio(22050,MIX_DEFAULT_FORMAT,2,4096); //load the background music // music=Mix_LoadMUS("back.wav"); //naziv datoteke effect1 = Mix_LoadWAV("break.wav"); //brick effect // effect2 = Mix_LoadWAV("wall.wav"); //wall hit effect effect3 = Mix_LoadWAV("ball.wav"); //paddle hit effect //--------------------------------------------------------------> effect4 = Mix_LoadWAV("game_restart"); //game over sound effect | //--------------------------------------------------------------> //play the loaded music //Mix_PlayMusic(music, -1); //vrim dodjelu memorije za SDL_GL komponente SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 ); SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8 ); SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 ); SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 8 ); SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 ); SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); //postavi naziv prozora SDL_WM_SetCaption( "Ubuntu Brakeout: developer@ Amar Tufo", NULL ) ; //postavi veliinu i irinu prozora SDL_SetVideoMode(600,400,32, SDL_OPENGL ); //inicijalizuj boje glClearColor(1,1,1,1); //Crvena, Zelena, Plava, Alfa //aktiviraj prozor glViewport(0,0,600,400); //postavi Shade_model glShadeModel(GL_SMOOTH); //ukljui samo 2D funkciju ne 3D glMatrixMode(GL_PROJECTION); //loadIdentity glLoadIdentity(); //iskljui 3D mode glDisable(GL_DEPTH_TEST); //ukljui glBlender() glEnable(GL_BLEND); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //printaj poruku na zaslon std::cout<<" OpenGl is initialised ........................................... ..............................[OK]\n"; std::cout<<" Main loop is started ........................................... ............................. [OK]\n"; //provjera uslova bool isRunning = true; //for handling with event SDL_Event event; //postavljam X i Y poziciju na kojoj e se kvadrat prikazivati float myX = 300; float myY = 370; //postavljam veliinu i irinu kvadrata u pikselima float width = 80; float height = 20; //programiraj uslove kretanja kvadrata u lijevo i u desno bool left = false, right = false; //unosim deklaracije varijabli za loptu //-------------- the BALL ------------- float ballX = 50; float ballY = 350; float ballWH = 20; //brzina lopte float vellX = 3; float vellY = -3; //------------------- NIZOVI --------------------- //Brick elements const static int BRICKS = 45; //broj cigli je 45 Brick bricks[BRICKS]; //statika varijabla
//pristupam nizu Brick for petljom for ( int i = 0, x = 4, y = 10; i < BRICKS; i++, x+=66 ) { //if petlja if( x > 560 ) { x = 4; y += 25;//slobodni prostor meu ciglama } bricks[i].x = x; bricks[i].y = y; bricks[i].width = 60; //irina cigle je 60 piksela bricks[i].height = 20; //visina cigle je 20 piksela bricks[i].alive = true; //da li je cigla razbijena }
//uitaj sliku za pad unsigned int pad_texture = 0; //uitaj sliku za ball unsigned int ball_texture = 0; //uitaj sliku za brick unsigned int brick_texture = 0; //uitaj sliku za background unsigned int back_texture = 0; //izvri uitavanje lopte, cigle, i pozadine pad_texture = loadTexture("test.png"); //------------- [OK] ball_texture = loadTexture("ball.png"); brick_texture = loadTexture("brick.png"); back_texture = loadTexture("back.png"); //------------- [OK] //potvrda da je slikovna datoteka uitana std::cout << pad_texture <<std::endl; //main game loop while ( isRunning ) { //EVENTS while ( SDL_PollEvent(&event) ) { //ako je X taster pritisnut, onda zatvori prozor if ( event.type == SDL_QUIT ) { isRunning = false; } //inae ako je Escape taster pritisnut, onda zatvori prozor if ( event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_ESCAPE ) { isRunning = false; } //mala vjeba:: ako je r tipka pritisnuta if ( event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_r ) { //onda promjeni boju pozadine prozora u crvenu glClearColor(1,0,0,1); } //programiram kretanje ploice if ( event.type == SDL_KEYDOWN ) { //ako je lijeva tipka pritisnuta, onda pomjeraj plou ulijevo if (event.key.keysym.sym == SDLK_LEFT ) { left = true; } //inae, ako je desna tipka pritisnuta, onda pomjeraj plou u desno else if ( event.key.keysym.sym == SDLK_RIGHT ) { right = true; } } //provjeri da li su tipke otisnute else if ( event.type == SDL_KEYUP ) { //ako je lijeva tipka otisnuta, onda je iskljui if ( event.key.keysym.sym == SDLK_LEFT ) { left = false; } //inae, ako je desna tipka otisnuta, onda je iskljui else if ( event.key.keysym.sym == SDLK_RIGHT ) { right = false; } }
//logika koja se izvri kada se pritisne odreeni taster
} //LOGIC:: Pomjeraj ploicu u lijevo ili u desno //Ovde sam podesio dinamiki timer od 3 sekunde po FPS; if ( left == true ) { myX -= 3; } if ( right == true ) { myX += 3; } //sprijei plou da izae van aktivnog prozora if ( myX < 0) { myX = 0; } //ogranii kretanje ploe na desnu stranu kako ne bi napustila prozor if (myX + width > 600) { myX = 600 - width; } //------------------------- X osa -------------------------------- //automatski pomjeraj loptu ballX += vellX;
//provjeri svaku ciglu da li se je sudarila sa loptom for (int i=0; i < BRICKS; i++) { //ako je cigla aktivna onda if (bricks[i].alive == true ) { //provjeri koliziju lopte i cigli sa njihovim takama if ( checkCollision(ballX,ballY,ballWH,ballWH,bricks[i].x,bricks[i].y, bricks[i].width,bricks[i].height ) == true) { //trebao bi da bude efekat udarca lopte o ciglu
vellX = -vellX; //ako je lopta razbila ciglu onda Mix_PlayChannel(-1, effect1, 0); bricks[i].alive = false; break; } } } //----------------------- Y osa ------------------------- ballY += vellY; //move the ball on Y axis //provjeri svaku ciglu da li se je sudarila sa loptom for (int i=0; i < BRICKS; i++) { //ako je cigla aktivna onda if (bricks[i].alive == true ) { //provjeri koliziju lopte i cigli sa njihovim takama if ( checkCollision(ballX,ballY,ballWH,ballWH,bricks[i].x,bricks[i].y, bricks[i].width,bricks[i].height ) == true) { vellY = -vellY; //ako je lopta razbila ciglu onda //ako je lopta razbila ciglu onda Mix_PlayChannel(-1, effect1, 0); bricks[i].alive = false; break; } } } //sprijei loptu da izae van prozora ili da fuli plou //kreiraj koliziju //**************** limit po X osi ********************* if (ballX < 0) { // Mix_PlayChannel(-1, effect2, 0); vellX = - vellX; } else if ( ballX + ballWH > 600) { // Mix_PlayChannel(-1, effect2, 0); vellX = - vellX; } //**************** limit po Y osi ********************** if (ballY < 0) { // Mix_PlayChannel(-1, effect1, 0); vellY = - vellY; } //ako je lopta udarila donji dio ekrana, onda resetuj cjelu igru else if (ballY + ballWH > 400) { //ovde postavi audio efekat za reset Mix_PlayChannel(-1, effect4, 0); //postavljam X i Y poziciju na kojoj e se kvadrat prikazivati myX = 300; myY = 370; //postavljam veliinu i irinu kvadrata u pikselima width = 80; height = 20; //programiraj uslove kretanja kvadrata u lijevo i u desno left = false, right = false; //unosim deklaracije varijabli za loptu //-------------- the BALL ------------- ballX = 50; ballY = 350; ballWH = 20; vellX = 2; vellY = -2; //pristupam nizu Brick for petljom for ( int i = 0; i < BRICKS; i++) {
bricks[i].alive = true; //da li je cigla razbijena } } //detekcija kolizije: Da li je lopta udarila o plou, ako jeste onda je vrat i nazad //Ovde ubaci efekat udarca lopte o plou
if ( checkCollision(ballX,ballY,ballWH,ballWH,myX,myY,width,height) == tru e) { Mix_PlayChannel(-1, effect3, 0); vellY =- vellY;