Tutorial OpenGL v2.0

Finalmente chegou! Após quase 1 ano depois de meu primeiro artigo sobre OpenGL, chegou a versão 2.0. Clique e fique mais Geek.

[ Hits: 13.161 ]

Por: Thiago Henrique Hüpner em 08/05/2015


A jornada é longa parte 2 - Colisão entre 2 Retângulos



Agora que já conseguimos criar "menus", vamos para a segunda parte.

O exemplo ficou meio "tosco", mas tem como ter uma ideia de como funciona.

Aquele rolo de salvar e compilar você já sabe, então, vou pular essa parte:

#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>
#include <time.h>

#define LARGURA 400
#define ALTURA 400

int colisao(SDL_Rect a,SDL_Rect b){
	if(a.x <= b.x+b.w && a.x+a.w >= b.x){
		if(a.y <= b.y+b.h && a.y+a.h >= b.y){
			return 1;
		}
	}
	// Se passou pelos if's e não retornou significa que não houve colisao
	return 0;
}

void inicializaOpenGL(){
	glClearColor(255,255,255,1);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0,LARGURA,ALTURA,0);
	glMatrixMode(GL_MODELVIEW);
	glClear(GL_COLOR_BUFFER_BIT);
}
// Simulando o SDL_FillRect
void GL_FillRect(SDL_Rect a,int r,int g,int b){

	glLoadIdentity();

	glColor3ub(r,g,b);
	glBegin(GL_QUADS);
	// Lado Superior Esquerdo
	glVertex2f(a.x,a.y);
	// Lado Superior Direito
	glVertex2f(a.x+a.w,a.y);
	// Lado Inferior Direito
	glVertex2f(a.x+a.w,a.y+a.h);
	// Lado Inferior Esquerdo
	glVertex2f(a.x,a.y+a.h);
	glEnd();
}
int main(int argc,char *argv[]){
	if(SDL_Init(SDL_INIT_VIDEO) < 0){
	// ... imprima a mensagem de erro e ...
	printf("Erro : %s
",SDL_GetError());
	return -1;
}

// Para sempre ter valores pseudo-aleatorios
srand((unsigned)time(NULL));

SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 );
SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8 );
SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 );
SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 8 );
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 2 );

SDL_Surface * tela = SDL_SetVideoMode(LARGURA,ALTURA,32,SDL_OPENGL);

if(tela == NULL){
	printf("Erro : %s
",SDL_GetError());
	SDL_Quit();
	return -1;
}

SDL_WM_SetCaption("Colisão nem é tão complexo assim",NULL);

SDL_Event evento;

int estaRodando = 1;

SDL_Rect retangulo,r2;

inicializaOpenGL();

int r = 255;
int g = 0;
int b = 0;

int posX = 100;
int posY = 100;

int aux1 = 10;
int aux2 = 10;

while(estaRodando){
	while(SDL_PollEvent(&evento)){
		switch(evento.type){
			case SDL_QUIT:
				estaRodando = 0;
				break;

			case SDL_MOUSEMOTION:
				posX = evento.motion.x;
				posY = evento.motion.y;
				if(colisao(retangulo,r2)){
					// Muda a cor R,G e B e consequentemente a cor do retangulo muda
					// NOTA : Tem que ser 256 e não 256 , pois a chance de ser 255 é muito pequena e usando o 256 , a chance aumenta
					// de ser 255
					r = rand() % 256;
					g = rand() % 256;
					b = rand() % 256;

					// Posicao aleatoria
					aux1 = rand() % (LARGURA - retangulo.w);
					aux2 = rand() % (ALTURA - retangulo.h);

				}

				break;

				default:
					break;
		}
	}

	retangulo.x = aux1;
	retangulo.y = aux2;
	retangulo.w = 50;
	retangulo.h = 50;

	r2.x = posX;
	r2.y = posY;
	r2.w = 50;
	r2.h = 50;

	// Desta vez limpo a tela aqui e não no GL_FillRect, pois pode haver conflito
	//de um retangulo aparecer e outro não

	glClear(GL_COLOR_BUFFER_BIT);

	GL_FillRect(retangulo,r,g,b);

	GL_FillRect(r2,255,255,0);

	SDL_Delay(30);

	SDL_GL_SwapBuffers();
}
SDL_Quit();

return 0;

}

Veja como ficou (após ter brincado um pouco...):
Linux: Tutorial OpenGL v2.0
O que isso faz?

Ele troca a cor do retângulo (retângulo) colide com o segundo retângulo(r2), e o primeiro retângulo vai para um outro lugar da tela.

Mas como funciona a colisão?

Bom, vamos por partes.

Ele verifica primeiro se colidiu o eixo x com 2 verificações:
  1. a.x <= b.x+b.w[ate aki] && a.x+a.w >= b.x, ou com outras palavras , "A posição X do Retangulo A é Menor ou Igual a Posição X incrementada da Largura do Retangulo B"?
  2. a.x <= b.x+b.w && [italico]a.x+a.w >= b.x, ou com outras palavras, "O Retangulo A incrementado da Largura dele é maior ou igual a posição X do Retangulo B"?

É o mesmo conceito para o eixo y, mas utilizando a altura em vez de largura. Deixo como desafio, tentar fazer um joguinho simples de pegar retângulos caindo (tipo o "pega-maçã").

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Inicializando o SDL
   3. OpenGL e SDL botando pra quebrar
   4. Simulando uma Gambiarra
   5. A jornada é longa parte 1 - Colisão Mouse e Retângulo
   6. A jornada é longa parte 2 - Colisão entre 2 Retângulos
   7. "Imagine" seu programa
   8. Agradecimentos, links úteis e fontes
Outros artigos deste autor

Tutorial OpenGL v3.0

Tutorial OpenGL

Visual Studio no Linux

Tutorial SFML

Ubuntu/Debian/Kali Linux e outros no Android

Leitura recomendada

Conio.h para Linux

Apreendendo a utilizar o GNU Debugger (parte 2)

C - Include e Makefile

Criando um sistema operacional com ASM e C++

Túnel do Tempo: a função itoa()

  
Comentários
[1] Comentário enviado por fabio em 08/05/2015 - 10:30h

Muito bom! Vou tentar criar um game simples pra minha filha ficar clicando no retângulo com a cor certa com base neste tutorial.

[2] Comentário enviado por Thihup em 08/05/2015 - 11:21h


[1] Comentário enviado por fabio em 08/05/2015 - 10:30h

Muito bom! Vou tentar criar um game simples pra minha filha ficar clicando no retângulo com a cor certa com base neste tutorial.


Fábio, mais uma vez, muito obrigado !

E boa sorte com o aplicativo, espero que sua filha goste.

Qualquer dúvida só pedir =D

[]'s

T+

[3] Comentário enviado por UmCaraAToa em 08/05/2015 - 11:25h

Bom artigo!
Favoritado e pega meu 10!

Até

[4] Comentário enviado por Thihup em 08/05/2015 - 11:30h


[3] Comentário enviado por UmCaraAToa em 08/05/2015 - 11:25h

Bom artigo!
Favoritado e pega meu 10!

Até


Valeu fera

T+

[5] Comentário enviado por xerxeslins em 08/05/2015 - 11:49h


Favoritado. Vou ler depois com calma. Mas só de dar uma olhada por rápida vi que é material interessante!
--
http://pastebin.com/aji5Qp05

[6] Comentário enviado por Thihup em 08/05/2015 - 11:55h


[5] Comentário enviado por xerxeslins em 08/05/2015 - 11:49h


Favoritado. Vou ler depois com calma. Mas só de dar uma olhada por rápida vi que é material interessante!
--
http://pastebin.com/aji5Qp05


Valeu fera, Obrigado!

[]'s

T+

[7] Comentário enviado por preroeb em 08/05/2015 - 19:02h

Parabéns pelo artigo escrito, é uns dos melhores (e únicos) artigos sobre OpenGL aqui no VOL.

[8] Comentário enviado por Thihup em 08/05/2015 - 19:04h


[7] Comentário enviado por preroeb em 08/05/2015 - 19:02h

Parabéns pelo artigo escrito, é uns dos melhores (e únicos) artigos sobre OpenGL aqui no VOL.


Valew pela força!

Dando duro pra trazer um artigo de qualidade pra vocês, meu povinho do "Volzinho"!

[]'s

T+

[9] Comentário enviado por Felipeigor em 08/05/2015 - 19:43h

Ae Parabéns brother excelente artigo , favoritado aqui tbm :)

Igor Felipe
Cadastrado desde: 25/09/2009

[b]If it moves , compile it.[/b]

[10] Comentário enviado por Thihup em 08/05/2015 - 19:44h


[9] Comentário enviado por Felipeigor em 08/05/2015 - 19:43h

Ae Parabéns brother excelente artigo , favoritado aqui tbm :)

Igor Felipe
Cadastrado desde: 25/09/2009

[b]If it moves , compile it.[/b]


Valew Tambem pelo apoio!

[]'s

T+

[11] Comentário enviado por SamL em 09/05/2015 - 12:50h

Legal cara, bem explicada a parte sobre colisão. Um bom artigo como um todo. Parabéns.

[12] Comentário enviado por Thihup em 09/05/2015 - 13:40h


[11] Comentário enviado por SamL em 09/05/2015 - 12:50h

Legal cara, bem explicada a parte sobre colisão. Um bom artigo como um todo. Parabéns.


Valew Sam! Sempre me apoiando!

[]'s

T+

[13] Comentário enviado por Ang em 09/05/2015 - 16:14h

Oi, Thiago!
Dei uma rápida lida no seu artigo.
Está muito bom!
Continue assim, com essas ótimas contribuições!

Ang,
Manaus, AM, Brasil.
Usuário de sistemas operacionais livres/abertos tipo Unix ou tipo DOS,
Distros Favoritas: FreeBSD, Free-DOS, , PC-DOS, Bodhi Linux, Ubuntu, Big Linux, Kurumim, OpenSUSE, Slackware e Slax.

[14] Comentário enviado por Thihup em 09/05/2015 - 16:18h


[13] Comentário enviado por Ang em 09/05/2015 - 16:14h

Oi, Thiago!
Dei uma rápida lida no seu artigo.
Está muito bom!
Continue assim, com essas ótimas contribuições!

Ang,
Manaus, AM, Brasil.
Usuário de sistemas operacionais livres/abertos tipo Unix ou tipo DOS,
Distros Favoritas: FreeBSD, Free-DOS, , PC-DOS, Bodhi Linux, Ubuntu, Big Linux, Kurumim, OpenSUSE, Slackware e Slax.


Valew !
Obrigado por ter lido!

[]'s

T+


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts