Super Thiagout (Breakout) - O Jogo

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

[ Hits: 3.434 ]

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

Cálculo de divisores de um número.

Boletim Escolar Com Manipulação de Arquivo

Utilizando acentuação na linguagem C

Makro

Mega Sena


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts