Super Thiagout (Breakout) - O Jogo
Publicado por Thiago Henrique Hüpner (última atualização em 10/11/2014)
[ Hits: 4.409 ]
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;
}
Shadow Mapping usando OpenGL e Cg
Agenda eletronica com banco de dados em arquivo texto
Funções de soma e subtração de matrizes alocadas dinamicamente
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
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?
VOL já não é mais como antes? (4)
É normal não gostar de KDE? (12)
E aí? O Warsaw já está funcionando no Debian 13? [RESOLVIDO] (15)
Secure boot, artigo interessante, nada técnico. (4)
copiar library para diretorio /usr/share/..... su com Falha na a... (1)









