Eae galera, tô postando um pequeno tutorial que encontrei na net sobre como programar jogos em Delphi.
Programando Jogos com Delphi (LÓGICA, ANIMAÇÃO, CONTROLE)
Autor: Antônio Sérgio de Sousa Vieira
Email: [email protected]
Introdução
Este texto foi escrito para pessoas que se interessam pela arte da programação de jogos, uma das mais completas, pois utiliza a parte visual, sonora e interativa. Esse texto não tem como objeto de estudo a criação do enredo do jogo e sim a parte lógica da programação, utilizado-se das facilidades do Delphi. É de suma importância o leitor ter um bom nível técnico em programação e algum conhecimento de ciências exatas, pois serão vistos assuntos específicos que utilizam lógica, matemática e física.
No desenrolar da leitura serão abordadas questões relacionadas a manipulação de resoluções do vídeo, utilização de músicas e performance dos controles do jogo. Também será visto a parte lógica do comportamento do personagem principal e seus inimigos.
No primeiro exemplo, será criado um jogo de nave com personagem principal, inimigos, tiro, colisão etc. No segundo exemplo será explicado o desenvolvimento de um jogo estilo Mario Brothers, baseado em Blocos(tile based game).
1. Entendendo o Posicionamento do Personagem em Relação a Tela.
O cenário está divido da mesma forma de um plano cartesiano invertido. Por ele podemos localizar a posição do personagem. Veja abaixo:
0
0 Posição X
Posição Y
Para descobrir em qual posição está o personagem basta verificar as suas cordenadas X e Y.
0 x Left = Esquerda
0
y Top = Topo
Estas cordenadas também são responsáveis pela movimentação. Para movimentar basta incrementar ou decrementar do valor de x para movimentar na horizontal ou do valor y na vertical.
Exemplo:
Const
Velocidade = 1;
PosicaoX, PosicaoY: Integer;
Begin
PosicaoX:=0; PosicaoY:=0;
Inc(PosicaoX,Velocidade);// Movimento para a direita
Dec(PosicaoX,Velocidade);// Movimento para a esquerda
Inc(PosicaoY,Velocidade);// Movimento para baixo
Dec(PosicaoY,Velocidade);// Movimento para cima
End;
2. Entendendo o conceito de OffScreen ou BackBuffer.
É uma técnica utilizada para eliminiar o “flick” (tremor) da animação, deixando o jogo com uma aparência melhor. Consiste em criar uma tela virtual na memória e depois desenhar todo o cenário (fundo, personagens etc) nela. Ao final, envia o cenário completo para o vídeo.
Para criar o OffScreen basta definir uma variável global do tipo TBITMAP, depois de instânciá-la (coloque o código no ONCREATE do formulário principal) defina valores para sua largura e altura, nunca esquecendo de destruí-la ao final do programa.
Exemplo:
(...)
var OFFScreen: TBitmap;
(...)
procedure TForm1.FormCreate(Sender: TObject);
begin
OFFScreen:= TBitmap.create;
OFFScreen.Width:= 320;
OFFScreen.Height:= 240;
end;
3. Estrutura Principal do Jogo.
O código principal que será utilizado deverá estar dentro de um laço, para que seja possível controlar as animações e movimentação dos personagens. Veja abaixo um exemplo do código acima descrito:
Exemplo:
procedure TForm1.Button1oneclick(sender:TObject);
begin
while not Application.Terminated;
// Em quanto jogo não termina faça
begin
{CODIGO PRINCIPAL DO JOGO}
Application.ProcessMessages;
// utilizado para liberar processamento atual
end;
end;
Descrição do Código: o código será iniciado ao clicar em um botão. Um laço funcionará até que o aplicativo seja fechado. Dentro do laço deve-se colocar os comandos de manipulação do jogo e liberar o processamento através do comando Application.ProcessMessages;
4. Definindo Características do Jogo.
Para facilitar a programação, deve ser criado alguns tipos que auxiliarão no desenvolvimento. É criado um tipo para o PERSONAGEM e outro para os INIMIGOS. Para os personagens atribui-se: Posição X (controla o movimento na horizontal), Posição Y (controla o movimento na vertical), Vivo (tipo lógico, controla a existência dos personagens) e Sentido (cima,baixo,esquerda,direita e parado). Outros tipos podem ser criados conforme as características do jogo.
Exemplo:
Type
TSentido = (cima,baixo,esquerda,direita,parado);
Type
TNave = Record
PosX: Integer; //Posição horizontal
PosY: Integer; //Posição vertical
Sent: TSentido; //Sentido do movimento
Vivo: Boolean; //Controle de existência
End;
5. Movimentando o Personagem.
A movimentação deverá ser dividida em duas partes: a primeira busca capturar as teclas pressionadas e informar ao personagem em que sentido se movimentar, na segunda parte lêr o sentido armazenada na variável “SENT” e INCREMENTA-SE ou DECREMENTA-SE um Valor(Velocidade) da Posição X (horizontal) ou Y (vertical).
Exemplo:
(...)
Var Nave: TNave; //Definindo uma variável global do tipo TNAVE
(...)
procedure Ler_Teclado;
begin
if GetKeyState(vk_left)<0 then //se tecla “seta esquerda” pressionada
Nave.Sent:= Esquerda // Movimento para esquerda
else
if GetKeyState(vk_right)<0 then // se “seta direita” pressionada
Nave.Sent:= Direita // Movimenta para direita
else
Nave.Dir:= Parado; // caso contrário, personagem parado
If GetKeyState(vk_up)<0 then //Idem (cima)
Nave.Dir:= Cima //Idem
Else
If GetKeyState(vk_down)<0 then //Idem (baixo)
Nave.Dir:= Baixo; //Idem
end;
procedure Movimenta_Nave(Velocidade: Integer);
begin
with Nave do
begin
if Sent = Esquerda then // Se SENT é igual esquerda então
Dec(PosX,Velocidade)// POSX igual POSX - VELOCIDADE
Else
If Sent = Direita then // Se SENT é igual direita então
Inc(PosX,Velocidade)// POSX igual POSX + VELOCIDADE
if Sent = Cima then // Se SENT é igual cima então
Dec(PosY,Velocidade)// POSY igual POSY - VELOCIDADE
Else
If Sent = Baixo then // Se SENT é igual baixo então
Inc(PosY,Velocidade)// POSY igual POSY + VELOCIDADE
end;
end;
Observação: Não esqueça de colocar os dois procedimentos (ler_teclado, movimenta_nave) dentro do laço para que a movimentação ocorra corretamente.
6. Criando seu primeiro jogo no Delphi.
Após termos visto os conceitos iniciais podemos agora desenvolver um jogo de Nave. Note que ainda não existirá inimigos (será visto no próximo capítulo) e nem sprites. Nosso jogo será apenas um quadrado movimentando pela tela.
Sigua os passos descritos abaixo para criar seu primeiro jogo.
· Crie tipo para controlar o sentido da movimentação.
Tsentido = (cima,baixo,esquerda,direita,parado);
· Crie um tipo para controlar a Nave, veja abaixo:
TNave = Record
PosX: Integer; // Controla movimento horizontal
PosY: Integer; // Controle movimento vertical
Sentido: Tsentido;
Vivo: Boolean;
End;
· Defina algumas contantes:
Const
LARGURA = 320; // largura da tela
ALTURA = 240; // altura da tela
TAMANHO = 5; // Tamanho da Nave
· Defina uma variável global para o BackBuffer e uma do tipo TNAVE:
Var
BackBuffer: Tbitmap;
Nave: Tnave;
· No ONCREATE do formulário Crie o BackBuffer:
BackBuffer:= Tbitmap.Create;
BackBuffer.Width:= LARGURA;
BackBuffer.Height:= ALTURA;
· No ONDESTROY libere o BackBuffer:
BackBuffer.Destroy;
· Depois de definirmos todos os procedimentos iniciais vamos começar a programação da lógica do jogo. Primeiramente no ONDBLCLICK do formulário digite o laço principal do jogo:
while not Application.Terminated do
begin
Application.ProcessMessages;
end;
· Defina agora alguns procedimentos (OBS: Coloque os procedimentos antes do BEGIN do procedimento ONDBLCLICK. Veja abaixo).
procedure TForm1.FormDblClick(Sender: TObject);
{ AQUI }
begin
· procedimento para ler o teclado;
procedure Ler_Teclado;
begin
if GetKeyState(vk_left)<0 then
//se tecla “seta esquerda” pressionada
Nave.Sent:= Esquerda
// Movimento para esquerda
else
if GetKeyState(vk_right)<0 then
// se “seta direita” pressionada
Nave.Sent:= Direita
// Movimenta para direita
else
Nave.Sent:= Parado;
// caso contrário, personagem parado
If GetKeyState(vk_up)<0 then //Idem (cima)
Nave.Sent:= Cima //Idem
Else
If GetKeyState(vk_down)<0 then //Idem (baixo)
Nave.Sent:= Baixo; //Idem
end;
· procedimento para movimentação:
procedure Movimenta_Nave(Velocidade: Integer);
begin
with Nave do
begin
if Sent = Esquerda then
// Se SENT é igual esquerda então
Dec(PosX,Velocidade)
// POSX igual POSX - VELOCIDADE
Else
If Sent = Direita then
// Se SENT é igual direita então
Inc(PosX,Velocidade)
// POSX igual POSX + VELOCIDADE
if Sent = Cima then
// Se SENT é igual cima então
Dec(PosY,Velocidade)
// POSY igual POSY - VELOCIDADE
Else
If Sent = Baixo then
// Se SENT é igual baixo então
Inc(PosY,Velocidade)
// POSY igual POSY + VELOCIDADE
end;
end;
· procedimento para desenhar a nave:
procedure Desenha_Nave(x,y: Integer);
var i,ii: Integer;
// variáveis para controlar o desenho do quadrado
begin
BackBuffer.Canvas.FillRect(Rect(0,0,LARGURA,ALTURA));
// Limpando o BackBuffer
for i:= 0 to TAMANHO do
//desenhando os pixels da esquerda para a direita
for ii:= 0 to TAMANHO do
//desenhando os pixels de cima para baixo
BackBuffer.Canvas.Pixels:= clBlue;
// a posição horizontal do pixel será o valor de i + x
// a posição vertical do pixel será o valor de ii + y
end;
· Coloque os procedimento dentro do laço na ordem abaixo:
(...)
Ler_Teclado;
Movimenta_Nave(1);
Desenha_Nave(Nave.PosX,Nave.PosY);
{...)
· Envie agora a imagem gravada no BackBuffer para a Tela (Dentro do Laço):
Canvas.Draw(0,0,BackBuffer);
· Finalmente inicialize as variáveis POSX, POSY desta forma:
(...)
Initialization
Nave.PosX:= 0;
Nave.PosY:= 0;
End.
TCHARAMMMM!!! Seu primeiro jogo no Delphi. (quase)...
Thank you for your article. This article gives me a lot of advice it is very helpful for me!
Xo สล็อตออนไลน์ โปรสล็อต XO เกมออนไลน์ทำเงินยอดฮิตเกมสล็อต xopg.net คือเกมทำเงิน reeffutures2018 ผ่านทางออนไลน์อย่างหนึ่ง ที่เล่นง่าย และได้เงินไว แถมยังลงทุนด้วยเงินน้อย mavoixtavoie ทำเงินได้ตลอดเวลา ซึ่งหลายคนอาจได้เคยเห็นรีวิวเรื่องของ สล็อต xo สล็อตออนไลน์ ไว้มากมาย เทคนิคสล็อต ทั้งเรื่องการเล่นแล้วได้เงิน herbalpertpresents และเล่น สล็อต แล้วไม่ได้เงิน นั่นเองค่ะ ซึ่งการที่คุณจะเล่นได้เงินหรือไม่ได้เงินนั้น essentialsforasoul ส่วนหนึ่งก็เป็นในเรื่องของดวงเข้ามาเกี่ยวด้วย northbristol เพราะสล็อตเป็นเกมออนไลน์เสี่ยงโชค ทดลองเล่น xo เกมหนึ่งซึ่งจะมีสูตร หรือเทคนิคเข้ามาช่วย gclub เพื่อโกงดวงอยู่เสมอซึ่งในเว็บของเรา สมัคร xo ก็มีมาแนะนำไว้ให้เห็นกันมากมายหลายสูตร
For this web site, you will see our account, remember to go through this info. 안전놀이터
Hmm… I interpret blogs on a analogous issue, however i never visited your blog. I added it to populars also i’ll be your faithful primer. 안전놀이터
I came onto your blog while focusing just slightly submits. Nice strategy for next, I will be bookmarking at once seize your complete rises... 벳삼
I came onto your blog while focusing just slightly submits. Nice strategy for next, I will be bookmarking at once seize your complete rises... 꽁머니사이트
I invite you to the page where you can read with interesting information on similar topics. 링크모음
Good post. I be taught one thing more difficult on completely different blogs everyday. It can at all times be stimulating to learn content material from other writers and practice a bit one thing from their store. I prefer to make use of some with the content material on my blog whether or not you don’t mind. Natually I provide you with a link on your net blog. Thanks for sharing. 토토사이트
In this article understand the most important thing, the item will give you a keyword rich link a great useful website page: 토토사이트
On this page you can read my interests, write something special. seo backlinks
Impressive article - definitely recommending it to my friends! Make sure to visit Digital Marketing Near You Directory for local marketing agencies as well.
Aw, this was a very nice post. In thought I wish to put in writing like this additionally – taking time and precise effort to make an excellent article… but what can I say… I procrastinate alot and under no circumstances seem to get something done. mobox Binance
our bedding collections consists of beddings that come from new york and this are great bedding collections` 토토커뮤니티
Music started playing when I opened this internet site, so irritating! 꽁머니사이트
You got a very excellent website, Glad I noticed it through yahoo. 먹튀검증
Тісно пов'язаний із вірою, срібний православний хрестик завжди є не лише символом віри, але й вишуканим прикрасою. Якщо ви шукаєте особливий подарунок для себе чи близької особи, то купівля срібного хрестика може бути саме тим, що вам потрібно.
На сьогоднішній день важко знайти такий асортимент і якість, як у магазині prykrasy.com. Тут ви завжди зможете срібний хрестик купити з різних стилів та дизайнів, які допоможуть вам обрати той, який найкраще виражає вашу віру та стиль.
Однак, що робить цей магазин ще привабливішим, так це можливість купити православний хрестик з безкоштовною доставкою. Це означає, що ваша духовна прикраса прибуде до вас абсолютно безкоштовно, що робить процес покупки ще приємнішим.
Нехай срібний хрестик буде не лише символом віри, але й нагадуванням про красу духовної глибини. Оберіть свої унікальні срібні хрестики в магазині prykrasy.com і отримайте його з безкоштовною доставкою, щоб зробити ваш вибір ще приємнішим та зручнішим.