//Inicijalizuj sve funkcije SDL-a SDL_Init(SDL_INIT_EVERYTHING);
//Inicijalizuj Font render TTF_Init(); // 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); //potrebna je za SDL_BlitSurface funkciju ili za SDL_Surface* screen = SDL_Set VideoMode(640, 480, 32, SDL_HWSURFACE); SDL_Surface* screen; //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;
//PlayerScore int PlayerScore; //ako je lopta razbila ciglu, onda printaj score od 1 prema n //Uitaj font po imenu times_new_roman; TTF_Font *times; //uitaj font times = TTF_OpenFont("times.ttf", 32); //still processing the fonts and fonts rendering SDL_Rect PlayerScoreRect; //[OK]
//Boja prikaza fonta je Pink SDL_Color Pink = {255,0,255}; //Odredi poziciju X ose na kojoj e se prikazivati score PlayerScoreRect.x = 50; //pozicija prikaza po X osi //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 ) //default je 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) { //ako je lopta razbila ciglu po X osi, onda prikai score //trebao bi da bude efekat udarca lopte o ciglu PlayerScore += 1; //svaki put kada lopta razbije ciglu onda prikai score 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) { //ako je lopta razbila ciglu po Y osi, onda prikai score PlayerScore += 1; //svaki put kada lopta razbije ciglu onda prikai score 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;