ProPixel

Participe do fórum, é rápido e fácil

ProPixel
ProPixel
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Ir para baixo
avatar
Remix.Ban
Membro IV
<b>Idade</b> Idade : 31
<b>Posts</b> Posts : 477
<b>Créditos</b> Créditos : 0
<b>Respeito</b> Respeito : 16
Habboz !
Criando jogos em Delphi - Parte I


- Introdução -
Este é o primeiro de muitos tutoriais sobre desenvolvimento de jogos
que eu pretendo postar neste forum. Aqui vamos tratar de desenvolvimento
de jogos em Delphi sem usar nenhuma biblioteca externa (como o DirectX
ou SDL), apenas a GDI do Windows.
Já que o assunto central desse tutorial é usar os conhecimentos em
Delphi para criar jogos, é bom que você tenha um conhecimento prévio na
linguagem.
- Um jogo simples -
Vamos criar um joguinho bem simples. Nesse joguinho haverá apenas uma bolinha percorrendo todo o cenário.
Abra o Delphi e crie um novo projeto. Altere o tamanho do form,
coloque 640 de ClientWidth e 480 de ClientHeight. Mude a BorderStyle
para bsSingle (assim o usuário não poderá redimensionar o form). E
finalmente em BorderIcons deixe apenas biSystemMenu (o botão de fechar)
e biMinimize (o botão de minimizar).
Vamos algumas variáveis para armazenar a posição e a direção da
nossa bolinha. Eu escolhi o tipo single por que ele pode armazenar
algumas casas decimais.
var
Form1: TForm1;
ball_x, ball_y, ball_vx, ball_vy: Single;

No OnCreate (assim que o form for criado) do form nós vamos inicializar as variáveis de velocidade.
procedure TForm1.FormCreate(Sender: TObject);
begin
//movimento horizontal (1/2 pixel para a direita)
ball_vx:= 2.5;
//movimento vertical (1/2 pixel para baixo)
ball_vy:= 2.5;
//Coloca a bolinha no centro da tela…
ball_x:= (ClientWidth - 20) / 2;
ball_y:= (ClientHeight - 20) / 2;
end;

Agora adicione o objeto TTimer no form. Mude a propriedade interval
do TTimer para 1. No evento OnTimer deste objeto nós vamos colocar todo
o laço principal do jogo (analisar as informações e apresentá-las ao
jogador).
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//verifica se a bolinha colidiu com algum canto da tela…
//nossa bolinha vai ter 20 x 20 pixels

if (ball_x < 0) or (ball_x + 20 > ClientWidth) then
ball_vx:= -ball_vx;
if (ball_y < 0) or (ball_y + 20 > ClientHeight) then
ball_vy:= -ball_vy;

//move a bolinha…
ball_x:= ball_x + ball_vx;
ball_y:= ball_y + ball_vy;

//limpa a tela anterior…
Canvas.Brush.Color:= clBlack;
Canvas.FillRect(Rect(0,0,ClientWidth,ClientHeight));
//Desenha a bolinha
//Aqui foi preciso o round porque os pixels são números inteiros
//(não existe o pixel 20.5, 10.2 ne?

Canvas.Brush.Color:= clWhite;
Canvas.Ellipse(Round(ball_x), Round(ball_y), Round(ball_x + 20), Round(ball_y + 20));
end;

Wow! Funciona! Tem uma bolinha batendo na tela, mas… que falhas são essas??? Fiz alguma coisa errada??
Na verdade não, acontece que estamos desenhando diretamente na tela,
então todas as etapas do desenho são mostradas para o jogador, por isso
essas falhas. Mas se acalmem, existe um modo de contornar isso. Vamos
desenhar em outra tela.
Esse recurso se chama BackBuffer (ou OffScreen) e
consiste em desenhar todos os elementos do jogo em uma tela virtual na
memória (aqui nós vamos usar um bitmap) e depois que tiver desenhado
tudo enviar para o vídeo (desenhar no form).
Vamos criar mais uma variável, chamada BackBuffer, que será do tipo TBitmap.
var
Form1: TForm1;
ball_x, ball_y, ball_vx, ball_vy: Single;
backbuffer: TBitmap;

Antes de iniciar o jogo precisamos criar nosso bitmap (do contrário
vamos receber um erro ao tentar desenhar nele). No evento OnCreate do
form adicione o seguinte código:
//cria e inicializa o backbuffer…
backbuffer:= TBitmap.Create;
backbuffer.width:= ClientWidth;
backbuffer.height:= ClientHeight;

Quando o jogo terminar nós temos que liberar esse bitmap da memória.
Então no evento OnDestroy do form adicione o seguinte código:
procedure TForm1.FormDestroy(Sender: TObject);
begin
//libera o backbuffer da memória…
backbuffer.Free;
end;

Como não estamos mais desenhando diretamente no Canvas do form,
nossa rotina de limpar a tela e desenhar nossa bolinha vai mudar um
pouquinho. Abaixo segue o novo código do evento OnTimer.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//verifica se a bolinha colidiu com algum canto da tela…
//nossa bolinha vai ter 20 x 20 pixels

if (ball_x < 0) or (ball_x + 20 > ClientWidth) then
ball_vx:= -ball_vx;
if (ball_y < 0) or (ball_y + 20 > ClientHeight) then
ball_vy:= -ball_vy;

//move a bolinha…
ball_x:= ball_x + ball_vx;
ball_y:= ball_y + ball_vy;

//Os eventos que seguem se referem ao canvas do backbuffer
//aqui vamos desenhar todos os elementos visíveis para depois passá-los
//para a tela

with backbuffer.Canvas do
begin
//muda a cor do pincel para preto
brush.Color:= clBlack;
//preenche toda a tela com o pincel atual
FillRect(Rect(0,0,ClientWidth,ClientHeight));
//muda a cor do pincel para branco
brush.Color:= clWhite;
//desenha a bolinha
Ellipse(Round(ball_x), Round(ball_y), Round(ball_x + 20), Round(ball_y + 20));
end;

//depois de desenhar tudo no backbuffer, envia o backbuffer para a tela
Canvas.Draw(0,0,backbuffer);
end;

Download do código fonte deste tutorial
Nosso primeiro “joguinho” está pronto. A tela continua com algumas
falhas porque a rotina de desenho da GDI do Windows não é muito boa,
mas vamos usar imagens a partir do próximo tutorial e eliminar um pouco
isso.
Na próxima parte vamos criar um pequeno clone do “pong”, aquele
joguinho de ping pong da Atari, com gráficos e sons. Algo bem
oldschool, mas espero que gostem.
See ya!
Créditos : http://undercode.wordpress.com | Remix.Ban Pelo Post
Ir para o topo
Permissões neste sub-fórum
Não podes responder a tópicos