Super Thiagout (Breakout) - O Jogo

Publicado por Thiago Henrique Hüpner (última atualização em 10/11/2014)

[ Hits: 4.094 ]

Homepage:

Download Super Thiagout.cpp




Hey pessoas, hoje trago-lhes um joguinho que fiz em SDL, fui desafiado pelo Samuel L e consegui fazer o jogo, mas para evitar zoações (cara, o título já é ridículo e você não quer ser alvo de zoações!?), pedi para o Sam dar uma verificada e corrigir eventuais erros.

Se desejarem, posso fazer um artigo sobre esse joguinho e até mesmo fazer um artigo sobre esse joguinho usando OpenGL (se desejarem).

Ou ainda fazer esse joguinho com um menu.

Seta para direita ou esquerda move a raquete e inicia o jogo.

Bom divertimento.

Obs.: fui desafiado a colocar "aquele" nome.

[]'s

T+

  



Esconder código-fonte

#include <iostream>  // Entrada e Saida
#include <cstdlib>   // EXIT_SUCCESS e EXIT_FAILURE
#include <SDL/SDL.h> // SDL
#include <ctime>     // Rand()

#define LARGURA 390
#define ALTURA 300

#define pLARGURA 13
#define pALTURA 6

#define TAMANHO 10
#define VELOCIDADE 4 // tem que ser menor que metade do TAMANHO

using namespace std;

bool colisao(SDL_Rect a,SDL_Rect b);
bool colisao(int x, int y, SDL_Rect b);


struct Tijolo{

    Tijolo(){
        emJogo = true;
        retangulo.x = 0;
        retangulo.y = 0;
        retangulo.w = (3*TAMANHO);
        retangulo.h = TAMANHO * 1.5;
        cor = 0x00;
    }

    SDL_Rect retangulo;
    bool emJogo;
    Uint32 cor;
};

struct Parede{

    Parede(){
        construaParede();
    }

    void construaParede (  ){
        tijolosEmJogo = 0;

        int i,j;
        for(i=0;i<pALTURA;i++){
            for(j=0;j<pLARGURA;j++){
                tijolo[i][j].retangulo.x = (j*(tijolo[i][j].retangulo.w));
                tijolo[i][j].retangulo.y = (i*(tijolo[i][j].retangulo.h));
                    tijolosEmJogo++;
            }
        }
    }

    Tijolo tijolo[pALTURA][pLARGURA];
    int tijolosEmJogo;
};

struct Raquete{
    Raquete(){
        retangulo.x = (LARGURA-70)/2;
        retangulo.y = ALTURA-(2*TAMANHO);
        retangulo.w = 70;
        retangulo.h = TAMANHO;

        defineTamanhoBorda(2);
        atualizaPosicaoBorda();

        velX = 0;
        cor = 0x00;
    }

    void defineTamanhoBorda ( int t ){
        if (t <= 0)
            return;

        // borda de cima
        borda[0].w = retangulo.w;
        borda[0].h = t;
        // borda da direita
        borda[1].w = borda[0].h;
        borda[1].h = retangulo.h;
        // borda de baixo
        borda[2].w = borda[0].w;
        borda[2].h = borda[0].h;
        // borda da esquerda
        borda[3].w = borda[0].h;
        borda[3].h = retangulo.h;
    }

    void atualizaPosicaoBorda(){
        // borda de cima
        borda[0].x = retangulo.x, borda[0].y = retangulo.y;
        // borda da direita
        borda[1].x = borda[0].x + borda[0].w - borda[0].h;
        borda[1].y = borda[0].y;
        // borda de baixo
        borda[2].x = borda[0].x;
        borda[2].y = borda[0].y + retangulo.h - borda[0].h;
        // borda da esquerda
        borda[3].x = borda[0].x, borda[3].y = borda[0].y;
    }

    void reiniciaPosicao(){
        retangulo.x = (LARGURA-70)/2;
        retangulo.y = ALTURA-(2*TAMANHO);
        retangulo.w = 70;
        retangulo.h = TAMANHO;
        velX = 0;
    }

    void mover(){
        retangulo.x = retangulo.x + velX;
        if(retangulo.x >= LARGURA - retangulo.w){
            retangulo.x = LARGURA - retangulo.w;
        }else if(retangulo.x <= 0){
            retangulo.x = 0;
        }else{
            retangulo.x = retangulo.x;
        }

        atualizaPosicaoBorda();
    }

    SDL_Rect retangulo;
    SDL_Rect borda[4];
    Uint32 cor;
    Uint32 cor_borda;
    int velX;
};
struct Bola{
    Bola(){
        retangulo.x = rand() % LARGURA;
        retangulo.y = ALTURA / 2 - (3*TAMANHO);
        retangulo.w = TAMANHO;
        retangulo.h = TAMANHO;
        velX = 0;
        velY = 0;
        estaParada = true;
        cor = 0x00;
        vida = 5;
    }

    void reiniciaPosicao(){
        retangulo.x = rand() % (LARGURA - TAMANHO);
        retangulo.y = ALTURA / 2 - (3*TAMANHO);
        retangulo.w = TAMANHO;
        retangulo.h = TAMANHO;
        velX = 0;
        velY = 0;
    }

    void mover(Parede &parede,Raquete &raquete,Bola &bola){
        if(!estaParada && vida > -1){

            retangulo.x += velX;
            if(retangulo.x >= LARGURA - retangulo.w){
                retangulo.x = LARGURA - retangulo.w;
                velX = -VELOCIDADE;
            }else if(retangulo.x <= 0){
                retangulo.x = 0;
                velX = VELOCIDADE;
            }

            retangulo.y += velY;
            if(retangulo.y >= ALTURA - retangulo.h){
                estaParada = true;
                reiniciaPosicao();
                raquete.reiniciaPosicao();
                (vida <= 0)?vida = -1:--vida;
                cout << "Vidas Restantes : " << vida << endl;
            }else if(retangulo.y <= 0){
                retangulo.y = 0;
                velY = VELOCIDADE;
            }
            if(colisao(retangulo,raquete.retangulo)){
                velY = -VELOCIDADE;
                // move a bola para fora da raquete
                retangulo.y = raquete.retangulo.y - retangulo.h;
            }

            if (colideComTijolo(parede) > -1){
                parede.tijolosEmJogo--;
                if (parede.tijolosEmJogo <= 0){
                    cout << "FIM DO JOGO\n";
                    reiniciaPosicao();
                    raquete.reiniciaPosicao();
                }
            }
        }
    }

    int colideComTijolo ( Parede & parede ){
        int i, j;
        int x, y;
        for(i = 0;i<pALTURA;i++){
            for(j = 0;j<pLARGURA;j++){
                if(parede.tijolo[i][j].emJogo){
                    // meio da lateral superior
                    x = retangulo.x + retangulo.w / 2;
                    y = retangulo.y;
                    if (colisao(x, y, parede.tijolo[i][j].retangulo)){
                        parede.tijolo[i][j].emJogo = false;
                        velY = VELOCIDADE;
                        retangulo.y = parede.tijolo[i][j].retangulo.y + parede.tijolo[i][j].retangulo.h;
                        return 0;
                    }

                    // meio da lateral direita
                    x = retangulo.x + retangulo.w;
                    y = retangulo.y + retangulo.h / 2;
                    if (colisao(x, y, parede.tijolo[i][j].retangulo)){
                        parede.tijolo[i][j].emJogo = false;
                        velX = -VELOCIDADE;
                        retangulo.x = parede.tijolo[i][j].retangulo.x - retangulo.w;
                        return 1;
                    }

                    // meio da lateral inferior
                    x = retangulo.x + retangulo.w / 2;
                    y = retangulo.y + retangulo.h;
                    if (colisao(x, y, parede.tijolo[i][j].retangulo)){
                        parede.tijolo[i][j].emJogo = false;
                        velY = -VELOCIDADE;
                        retangulo.y = parede.tijolo[i][j].retangulo.y - retangulo.h;
                        return 2;
                    }

                    // meio da lateral esquerda
                    x = retangulo.x;
                    y = retangulo.y + retangulo.h / 2;
                    if (colisao(x, y, parede.tijolo[i][j].retangulo)){
                        parede.tijolo[i][j].emJogo = false;
                        velX = VELOCIDADE;
                        retangulo.x = parede.tijolo[i][j].retangulo.x + parede.tijolo[i][j].retangulo.w;
                        return 3;
                    }
                }
            }
        }

        return -1;
    }

    SDL_Rect retangulo;
    Uint32 cor;
    int velX;
    int velY;
    int vida;
    bool estaParada;
};

bool colisao(SDL_Rect a,SDL_Rect b){
    if(a.y <= b.y+b.h && a.y+a.h >= b.y){
        if(a.x <= b.x+b.w && a.x+a.w >= b.x){
            return true;
        }
    }
    return false;
}

bool colisao(int x, int y, SDL_Rect b){
    if (y >= b.y && y <= b.y + b.h){
        if (x >= b.x && x <= b.x + b.w){
            return true;
        }
    }

    return false;
}

bool controlaFPS ( Uint32 tempo_agora ){
    static Uint32 fps = 1000/60;

    tempo_agora = SDL_GetTicks() - tempo_agora;
    if (tempo_agora < fps){
        SDL_Delay(fps - tempo_agora);
        return true;
    }

    return false;
}


void desenhaNaTela(Parede &parede,Bola &bola,Raquete &raquete,SDL_Surface * tela){
    int i,j;
    SDL_FillRect(tela,NULL,SDL_MapRGB(tela->format,255,255,255));
    SDL_FillRect(tela,&bola.retangulo,SDL_MapRGB(tela->format,255,0,0));
    SDL_FillRect(tela,&raquete.retangulo,SDL_MapRGB(tela->format,255,255,0));
    for (i = 0; i < 4; i++)
        SDL_FillRect(tela, &raquete.borda[i], raquete.cor_borda);

    for(i = 0;i<pALTURA;i++){
        for(j = 0;j<pLARGURA;j++){
            if(parede.tijolo[i][j].emJogo)
                SDL_FillRect(tela,&parede.tijolo[i][j].retangulo,parede.tijolo[i][j].cor);
        }
    }
}

int main(){

    srand((unsigned)time(NULL));

    if(SDL_Init(SDL_INIT_EVERYTHING) != 0){
        cout << "Erro : " << SDL_GetError() << endl;
        SDL_Quit();
        return EXIT_FAILURE;
    }

    SDL_Event evento;
    SDL_Surface * tela = SDL_SetVideoMode(LARGURA,ALTURA,0,SDL_SWSURFACE | SDL_DOUBLEBUF | SDL_ANYFORMAT);

    if(tela == NULL){
        cout << "Erro : " << SDL_GetError() << endl;
        SDL_Quit();
        return EXIT_FAILURE;
    }

    SDL_WM_SetCaption("Super Thiagout - by Thihup.", NULL);

    Parede parede;
    Raquete raquete;
    Bola bola;

    bool estaRodando = true;

    int i,j;

    for(i = 0;i<pALTURA;i++){
        for(j = 0;j<pLARGURA;j++){
            parede.tijolo[i][j].cor = (SDL_MapRGB(tela->format,rand() % 256,rand() % 256,rand() % 256));
        }
    }

    bola.cor = (SDL_MapRGB(tela->format,255,0,0));
    raquete.cor = (SDL_MapRGB(tela->format,255,255,0));
    raquete.cor_borda = (SDL_MapRGB(tela->format,0,0,0));
    int teclaEsq = 0, teclaDir = 0;

    Uint32 tempo_agora;
    while(estaRodando){
        tempo_agora = SDL_GetTicks();
        while(SDL_PollEvent(&evento)){
            switch(evento.type){
                case SDL_QUIT:
                    estaRodando = false;
                break;
                case SDL_KEYUP:
                    switch(evento.key.keysym.sym){

                        case SDLK_LEFT:
                            teclaEsq = 0;
                        break;
                        case SDLK_RIGHT:
                            teclaDir = 0;
                        break;

                        default:
                        break;
                    }
                break;

                case SDL_KEYDOWN:
                    switch(evento.key.keysym.sym){

                        case SDLK_ESCAPE:
                            estaRodando = false;
                        break;

                        case SDLK_RIGHT:
                            if(bola.vida != -1)
                            {
                                teclaDir = 1;

                                if(bola.estaParada){
                                    bola.estaParada = false;
                                    bola.velX = VELOCIDADE;
                                    bola.velY = VELOCIDADE;
                                }
                            }
                            else
                                teclaDir = 0;
                        break;
                        case SDLK_LEFT:
                            if(bola.vida != -1)
                            {
                                teclaEsq = 1;

                                if(bola.estaParada){
                                    bola.estaParada = false;
                                    bola.velX = VELOCIDADE;
                                    bola.velY = VELOCIDADE;
                                }
                            }
                            else
                                teclaEsq = 0;
                        break;

                        default:
                        break;
                    }
                break;

                default:
                break;
            }
        }

        // se aperta tecla esquerda
        if (teclaEsq)
            raquete.velX = -VELOCIDADE;
        else if (teclaDir)// se aperta tecla direita
            raquete.velX = VELOCIDADE;
        else
            raquete.velX = 0;


        if (controlaFPS(tempo_agora)){
            if(!bola.estaParada){
                bola.mover(parede,raquete,bola);
                raquete.mover();
            }

            desenhaNaTela(parede,bola,raquete,tela);
            SDL_Flip(tela);
        }
    }

    SDL_Quit();
    return EXIT_SUCCESS;
}

Scripts recomendados

parse_args

Validador de CPF

Calc Compact

Imprime a soma dos numeros positivos e negativos

Linhas Numeradas


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts