Sei sulla pagina 1di 10

//SDL Brakeout Game

//developer: Amar Tufo


//12.10.2013, Amar Tufo
//komanda za prevod: g++ -o test main.cpp -lSDLmain -lSDL -lGL -lSDL_image -lSDL
_mixer -lSDL_ttf
//********************* DODATCI ************************************************
****************
// sudo apt-get install libsdl-ttf2.0-dev <== SDL_FONT_RENDER@
// Napomena#1: Font nije deklarisan u cjelosti!
// Napomena#2: Nedostaje score i autoNextLevelFunction()!
//Posljednja izmjena napravljena 10 Novembra 2013,01:00;
//------------------------------------------------------------------------------
----------------
//Ukljui SDL biblioteku i pretprocesor
#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h> //ukljuen je SDL/opengl
#include "SDL/SDL_image.h" //ukljuen je image pretprocesor
#include <SDL/SDL_mixer.h> //ukljuen je sound/music manipulator
#include <SDL/SDL_ttf.h> //ukljuen je SDL_font
#include <iostream>
#include <sstream> //STRING_STREAM library
#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);


//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;

}
//RENDERING_ON_SCREEN + clearScreen
glClear(GL_COLOR_BUFFER_BIT);

//glPushMatrix() funkcija za iscrtavanje geometrijskih oblika!
glPushMatrix(); //start phase rendering

//postavi matrix
glOrtho(0,600,400,0,-1,1);

//postavi boju kvadrata
glColor4ub(255,255,255,255); //white color
//ukljui GL_IMAGE_RENDER
glEnable(GL_TEXTURE_2D);
//------------------------------ RENDER SECTION -------------------------
-//
//renderuj pozadinu
glBindTexture(GL_TEXTURE_2D, back_texture);
glBegin(GL_QUADS);
glTexCoord2d(0,0); glVertex2f(0,0);
glTexCoord2d(1,0); glVertex2f(600,0);
glTexCoord2d(1,1); glVertex2f(600,400);
glTexCoord2d(0,1); glVertex2f(0,400);
glEnd();
//renderuj pad
glBindTexture(GL_TEXTURE_2D, pad_texture);

//ovo e se morati premjestiti, MODA;
std:: stringstream PScore;
//SDL Surface
SDL_Surface *PlayerScoreSurface = TTF_RenderText_Solid(times,PScore.str()
.c_str(),Pink); //
//nacrtaj font i prikai ga
SDL_BlitSurface(PlayerScoreSurface, NULL, screen, &PlayerScoreRect);



PScore << PlayerScore;
SDL_FreeSurface(PlayerScoreSurface);
SDL_Flip(screen);
//crtaj kvadrat
glBegin(GL_QUADS);

//za render slikovne datoteke koristi komandu glTexCoord2d()
glTexCoord2d(0,0); glVertex2f(myX,myY);
glTexCoord2d(1,0); glVertex2f(myX+width,myY);
glTexCoord2d(1,1); glVertex2f(myX+width,myY+height);
glTexCoord2d(0,1); glVertex2f(myX,myY+height);

glEnd(); //kraj funkcije
//nacrtaj kvadrat i odredi 4 njegove take

//disable GL_TEXTURE_RENDER
// glDisable(GL_TEXTURE_2D);
//renderuj loptu
glBindTexture(GL_TEXTURE_2D, ball_texture);
//Boja lopte neka bude CRVENA
glColor4ub(255,255,255,255); //White color

//----------------------------
//Nacrtaj loptu

//odredi 4 take lopte
glBegin(GL_QUADS);
glTexCoord2d(0,0); glVertex2f(ballX,ballY);
glTexCoord2d(1,0); glVertex2f(ballX+ballWH,ballY);
glTexCoord2d(1,1); glVertex2f(ballX+ballWH,ballY+ballWH);
glTexCoord2d(0,1); glVertex2f(ballX,ballY+ballWH);
glEnd();
//----------------------------
//---------- CIGLE ----------------------------
glColor4ub(0,0,255,255); //Blue color of bricks

glBindTexture(GL_TEXTURE_2D, brick_texture);
//nacrtaj cigle
glBegin(GL_QUADS);
for ( int i = 0; i < BRICKS; i++ )
{
if (bricks[i].alive == true )
{
//svaka druga cigla je ljubiaste boje
if ( i%2 == 0) glColor4ub(122,0,255,255);
//inae je plava
else glColor4ub(0,0,255,255);
glTexCoord2d(0,0); glVertex2f(bricks[i].x, bricks[i].y);
glTexCoord2d(1,0); glVertex2f(bricks[i].x+bricks[i].width,bricks[i].y
);
glTexCoord2d(1,1); glVertex2f(bricks[i].x+bricks[i].width,bricks[i].y
+bricks[i].height);
glTexCoord2d(0,1); glVertex2f(bricks[i].x,bricks[i].y+bricks[i].heigh
t);
}
}
glDisable(GL_TEXTURE_2D);
glEnd();
//----------------------------------------------
glPopMatrix(); //end
SDL_GL_SwapBuffers();
}
//Free the SDL_MIxer, musix
Mix_FreeChunk(effect1);
// Mix_FreeChunk(effect2);
Mix_FreeChunk(effect3);
Mix_FreeChunk(effect4);
// Mix_FreeMusic(music);
Mix_CloseAudio();
//ZatvoriFont
TTF_CloseFont(times);
TTF_Quit();
//Prekini SDL
SDL_Quit();

//povratna vrijednost
return 0;
//kraj programa
}

Potrebbero piacerti anche