Super Thiagout (Breakout) - O Jogo
Publicado por Thiago Henrique Hüpner (última atualização em 10/11/2014)
[ Hits: 4.274 ]
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; }
Validar CPF em C++ (esse funciona)
Divisores de um inteiro positivo em C++
Calcular dia da semana a partir de uma data sugerida
Gerando uma "number list" de 6 digitos
Nenhum coment�rio foi encontrado.
Aprenda a Gerenciar Permissões de Arquivos no Linux
Como transformar um áudio em vídeo com efeito de forma de onda (wave form)
Como aprovar Pull Requests em seu repositório Github via linha de comando
Quebra de linha na data e hora no Linux Mint
Organizando seus PDF com o Zotero
tentando instalar em um notebook antigo o Linux LegacyOS_2023... [RESO... (9)
Problema com Conexão Outlook via Firewall (OpenSUSE) com Internet Fibr... (5)