Super Thiagout (Breakout) - O Jogo
Publicado por Thiago Henrique Hüpner (última atualização em 10/11/2014)
[ Hits: 4.406 ]
Homepage:
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+
#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;
}
Contagem de elementos de um array
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
copiar library para diretorio /usr/share/..... su com Falha na a... (1)
Problema em SSD ao dar boot LinuxMint LMDE FAYE 64 (3)
Instalação dualboot Windows 11 e Debian 13 (29)









