Super Thiagout (Breakout) - O Jogo
Publicado por Thiago Henrique Hüpner (última atualização em 10/11/2014)
[ Hits: 3.959 ]
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; }
Nenhum comentário foi encontrado.
Qual seu hardware e distribuição estão rodando na sua máquina? (1)
Melhorando o tempo de boot do Fedora e outras distribuições
Como instalar as extensões Dash To Dock e Hide Top Bar no Gnome 45/46
E a guerra contra bots continua
Tradução do artigo do filósofo Gottfried Wilhelm Leibniz sobre o sistema binário
Conheça o firewall OpenGFW, uma implementação do (Great Firewall of China).
Instalando o FreeOffice no LMDE 6
Anki: Remover Tags de Estilo HTML de Todas as Cartas
Colocando uma opção de redimensionamento de imagem no menu de contexto do KDE
Criar uma base de reconhecimento de HW no VOL (5)
Adaptador Bluetooth USB que funciona no Linux (42)
[Shell Script] Script para desinstalar pacotes desnecessários no OpenSuse
[Shell Script] Script para criar certificados de forma automatizada no OpenVpn
[Shell Script] Conversor de vídeo com opção de legenda
[C/C++] BRT - Bulk Renaming Tool
[Shell Script] Criação de Usuarios , Grupo e instalação do servidor de arquivos samba