Super Thiagout (Breakout) - O Jogo
Publicado por Thiago Henrique Hüpner (última atualização em 10/11/2014)
[ Hits: 4.324 ]
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; }
Teste de desempenho com números primos em C (corrigido)
Balanceamento de parênteses utilizando Pilha
Nenhum coment�rio foi encontrado.
Conciliando o uso da ZRAM e SWAP em disco na sua máquina
Servidor de Backup com Ubuntu Server 24.04 LTS, RAID e Duplicati (Dell PowerEdge T420)
Visualizar câmeras IP ONVIF no Linux sem necessidade de instalar aplicativos
Realizar overclock no Miyoo Mini (plus ou normal)
Otimização de memória para máquinas modestas
Unbuntu não atualiza o firmware [RESOLVIDO] (2)
linux mint reconhece microfone de lapela como fone de ouvido sem micro... (0)
Dúvidas sobre a originalidade de conteúdos online (10)
Erro de interface de Rede no Virt Manager dentro Debian 13 KDE [RESOLV... (12)