Ir para conteúdo
Faça parte da equipe! (2024) ×
Conheça nossa Beta Zone! Novas áreas a caminho! ×
  • Quem está por aqui   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.

[Delphi] Criando um Jogo - Parte 4 - Colisão


xxXGaleginXxx
 Compartilhar

Posts Recomendados

Oks, finalmente a parte 4 ;/ tuto de colisãosin, nem keria fazer, mas o foi bem facil de fazer este tutorial....

14c9zc4.png

 

1. HitTest.

2 e 3. Função.

4. Limites.

5. Limites Personalizados

❶. HitTest

 

 

ActionScript 2,3 tem a função Hittest livre, então eu mesmo fiz uma fnção copia dela, como não dava pra ver o código da função, foi um sako -.- mas eu fiz, então vamos continuar por que precisamos fazer uma coisa interresante no meu nosso jogo.

 

❷ e ❸. Função

 

 

Abra o projeto anterior e declare esta função:

 

 

function CheckColision(Obj1,Obj2:TShape): Boolean;

begin

if Obj1.Top >= Obj2.Top-Obj1.Height then

begin

if Obj1.Left >= Obj2.Left-Obj1.Width then

begin

if Obj1.Left+Obj1.Width <= Obj2.Left+Obj2.Width+Obj1.Width then

begin

if Obj1.Top+Obj1.Height <= Obj2.Top+Obj2.Height+Obj1.Height then

begin

result := true;

end else begin

result := false;

end;

end else begin

result := false;

end;

end else begin

result := false;

end;

end else begin

result := false;

end;

end;

 

 

Agora, declare esta outra função para verificar vários objetos.

 

 

function FullCheck(Obj:TShape;Start:String):Boolean;

var

lp:Integer;

t:Boolean;

begin

t := false;

for lp := 0 to Form1.ComponentCount-1 do

begin

if Form1.Components[lp] is TShape then

begin

if (Copy((Form1.Components[lp] as TShape).Name,1,Length(Start)) = Start) then

begin

if CheckColision(Obj,(Form1.Components[lp] as TShape)) then

begin

t := true;

break;

end;

end;

end;

end;

result := t;

end;

 

Agora, no tmr_keys, no evento OnTimer, Substitua o código entre Begin e End e coloque isto:

 

 

if GetAsyncKeyState(37) < 0 then

begin

shp_char.Left := shp_char.Left-2;

if FullCheck(shp_char,'shp_block') then

begin

shp_char.Left := shp_char.Left+2;

end;

end;

if GetAsyncKeyState(39) < 0 then

begin

shp_char.Left := shp_char.Left+2;

if FullCheck(shp_char,'shp_block') then

begin

shp_char.Left := shp_char.Left-2;

end;

end;

img_effect.Top := shp_char.Top;

img_effect.Left := shp_char.Left;

 

No evento OnTimer do Timer tmr_physic, delete tudo entre begin e end, e entre begin e end, coloque isto:

 

 

shp_char.Top := shp_char.Top+gravf;

if FullCheck(shp_char,'shp_block') then

begin

shp_char.Top := shp_char.Top-gravf;

gravf := 1;

end

else

begin

gravf := gravf+1;

end;

img_effect.Top := shp_char.Top;

img_effect.Left := shp_char.Left;

 

no evento ontimer do tmr_jet, delete tudo e, entre begin e end coloque:

 

 

shp_char.Width := 22;

if GetAsyncKeyState(38) < 0 then

begin

tmr_physic.Enabled := false;

gravf := -3;

if imgs = 1 then

begin

shp_char.Top := shp_char.Top-3;

img_effect.Picture.Graphic := img_effect2.Picture.Graphic;

imgs := 2;

if FullCheck(shp_char,'shp_block') then

begin

shp_char.Top := shp_char.Top+3;

end;

end else if imgs = 2 then begin

shp_char.Top := shp_char.Top-4;

img_effect.Picture := img_effect3.Picture;

imgs := 3;

if FullCheck(shp_char,'shp_block') then

begin

shp_char.Top := shp_char.Top+4;

end;

end else if imgs = 3 then begin

shp_char.Top := shp_char.Top-5;

img_effect.Picture.Graphic := img_effect4.Picture.Graphic;

imgs := 4;

if FullCheck(shp_char,'shp_block') then

begin

shp_char.Top := shp_char.Top+5;

end;

end else if imgs = 4 then begin

shp_char.Top := shp_char.Top-5;

img_effect.Picture.Graphic := img_effect5.Picture.Graphic;

imgs := 5;

if FullCheck(shp_char,'shp_block') then

begin

shp_char.Top := shp_char.Top+5;

end;

end else if imgs = 5 then begin

shp_char.Top := shp_char.Top-5;

img_effect.Picture.Graphic := img_effect4.Picture.Graphic;

imgs := 4;

if FullCheck(shp_char,'shp_block') then

begin

shp_char.Top := shp_char.Top+5;

end;

end;

end else begin

img_effect.Picture := img_effect1.Picture;

tmr_physic.Enabled := true;

end;

img_effect.Top := shp_char.Top;

img_effect.Left := shp_char.Left;

 

 

Não aperte F9 AINDA!!!!

 

Seja ninja, seje forte, foi você que criou este jogo e agora, aperte F9 e veja o se joguin!

Ficou um jogo de Gênio né? não conseguiria fazer um jogo assim em outra linguagen? fiko legal =p

 

Agora, os limites!

 

❹. Limites

 

 

Vou colocar limites neste tutorial por que estou afim xp

 

Na aba Win32, adicione o componente TProgressBar, modifique suas propriedades:

 

Height = 15

Name = 'psb_gasoline'

Position = 100

Width := 300

Agora coloque em cima do BTN_START (botão de começar o jogo)

 

Agora, no timer tmr_jet, delete tudo incluindo begin e end, então coloque isto aqui:

 

 

begin

shp_char.Width := 22;

if GetAsyncKeyState(38) < 0 then

begin

if psb_gasoline.Position > 4 then

begin

tmr_physic.Enabled := false;

gravf := -2;

psb_gasoline.Position := psb_gasoline.Position-2;

end else begin

tmr_physic.Enabled := true;

end;

if psb_gasoline.Position > 3 then

begin

if imgs = 1 then

begin

psb_gasoline.Position := psb_gasoline.Position-2;

img_effect.Picture.Graphic := img_effect2.Picture.Graphic;

shp_char.Top := shp_char.Top-2;

imgs := 2;

if FullCheck(shp_char,'shp_block') then

begin

shp_char.Top := shp_char.Top+2;

end;

end else if imgs = 2 then begin

psb_gasoline.Position := psb_gasoline.Position-3;

img_effect.Picture.Graphic := img_effect3.Picture.Graphic;

shp_char.Top := shp_char.Top-3;

imgs := 3;

if FullCheck(shp_char,'shp_block') then

begin

shp_char.Top := shp_char.Top+3;

end;

end else if imgs = 3 then begin

psb_gasoline.Position := psb_gasoline.Position-3;

img_effect.Picture.Graphic := img_effect3.Picture.Graphic;

shp_char.Top := shp_char.Top-4;

imgs := 4;

if FullCheck(shp_char,'shp_block') then

begin

shp_char.Top := shp_char.Top+4;

end;

end else if imgs = 4 then begin

psb_gasoline.Position := psb_gasoline.Position-3;

img_effect.Picture.Graphic := img_effect3.Picture.Graphic;

shp_char.Top := shp_char.Top-4;

imgs := 5;

if FullCheck(shp_char,'shp_block') then

begin

shp_char.Top := shp_char.Top+4;

end;

end else if imgs = 5 then begin

psb_gasoline.Position := psb_gasoline.Position-3;

img_effect.Picture.Graphic := img_effect3.Picture.Graphic;

shp_char.Top := shp_char.Top-4;

imgs := 3;

if FullCheck(shp_char,'shp_block') then

begin

shp_char.Top := shp_char.Top+4;

end;

end else begin

showmessage(inttostr(imgs));

end;

end else begin

img_effect.Picture.Graphic := img_effect1.Picture.Graphic;

tmr_physic.Enabled := true;

imgs := 1;

end;

end else begin

img_effect.Picture := img_effect1.Picture;

tmr_physic.Enabled := true;

imgs := 1;

end;

img_effect.Top := shp_char.Top;

img_effect.Left := shp_char.Left;

end;

 

Aperte F9 e teste, como você ve, não recarrega, afinal, gasolina não dá em arvore, na parte 5 vamos criar um "posto de gasolina" ^^

 

❺. Limites Personalizados.

 

 

Agora, se quiser modificar o limite de gasolina, só mudar a propriedade Max do psb_gasoline.

 

Vamos criar o nosso posto de gasolina =D

 

Sabe a função CriarMapa? delete TODA ELA 100% e retire ela e então coloque isto:

 

 

f

unction CriarMapa(am:TStringList):Boolean;

var

l1,l2:Integer; tot:Boolean;

begin

tot := false;

for l1 := 0 to am.Count-1 do

begin

try for l2 := 0 to Length(am[l1]) do

begin

//l1 = Linha - l2 = Coluna.

if am[l1][l2] = '1' then

begin

with TShape.Create(Form1) do

begin

Name := 'shp_block'+inttostr(l1)+'_'+inttostr(l2);

Parent := Form1;

Height := 25;

Width := 25;

Top := l1*25;

Left := l2*25;

Show;

Brush.Color := clBlack;

end;

end else if am[l1][l2] = '2' then begin

with TShape.Create(Form1) do

begin

Name := 'shp_blkill'+inttostr(l1)+'_'+inttostr(l2);

Parent := Form1;

Height := 25;

Width := 25;

Top := l1*25;

Left := l2*25;

Show;

Brush.Color := clRed;

end;

end else if am[l1][l2] = '3' then begin

with TShape.Create(Form1) do

begin

Name := 'shp_blgas'+inttostr(l1)+'_'+inttostr(l2);

Parent := Form1;

Height := 25;

Width := 25;

Top := l1*25;

Left := l2*25;

Show;

Brush.Color := clYellow;

end;

end;

end;

tot := true;

except

tot := false

end;

end;

result := tot;

end;

 

Agora, na aba System, adicione outro timer e modifique suas propriedades:

 

Enabled = false

Interval = 20

Name = 'tmr_check'

 

Agora, no evento onclick do btn_start (Botão Começar), delete tudo entre begin e end e coloque isto:

 

 

begin

if sgame then

begin

shp_char.Visible := true;

tmr_keys.Enabled := true;

tmr_physic.Enabled := true;

tmr_jet.Enabled := true;

tmr_check.Enabled := true;

btn_start.Caption := 'Pausar o Jogo';

sgame := false;

img_effect.Visible := true;

end else if sgame = false then begin

if btn_start.Caption = 'Continuar o Jogo' then begin

btn_start.Caption := 'Pausar o Jogo';

shp_char.Visible := true;

img_effect.Visible := true;

tmr_keys.Enabled := true;

tmr_physic.Enabled := true;

tmr_jet.Enabled := true;

tmr_check.Enabled := true;

end else begin

shp_char.Visible := true;

img_effect.Visible := true;

btn_start.Caption := 'Continuar o Jogo';

tmr_keys.Enabled := false;

tmr_physic.Enabled := false;

tmr_jet.Enabled := false;

tmr_check.Enabled := false;

end;

end;

 

então, no OnTimer do novo timer (tmr_check), e entre begin e end:

 

 

if FullCheck(shp_char,'shp_blgas') then

begin

psb_gasoline.Position := psb_gasoline.Position+2;

end;

if FullCheck(shp_char,'shp_blkill') then

begin

psb_gasoline.Position := 0;

shp_char.Top := 26;

shp_char.Left := 51;

end;

 

 

e então, vamos modificar o se mapa, delete tudo que estiver entre begin e end no evento onCreate do Form1, e coloque isto entre begin e end:

 

 

map := TStringList.Create;

map.Add('11111111111111');

map.Add('1X100000000001'); // onde ta X é onde o seu personagen vai aparecer.

map.Add('10100131010001'); //obs: o X é igual a um Zero, será ignorado.

map.Add('10100131010001');

map.Add('10101131110001');

map.Add('10103121230001');

map.Add('10111111110001');

map.Add('10000000000311');

map.Add('11111111111111');

CriarMapa(map);

shp_char.BringToFront;

img_effect.BringToFront;

shp_char.Top := 26;

shp_char.Left := 51;

psb_gasoline.Position := 0;

imgs := 1;

gravf := 1;

sgame := true;

psb_gasoline.Max := 300;

 

onde está em negrito e sublinhado, você pode mudar para o tamanho do seu "armazenamento de gasolina"

 

Fiz estes tutoriais para quem quiser fazer alguns jogos, agora eu vou fazer meu jogos, então, sem mais tutoriais, quem quiser baixar o código fonte atual, aqui está o link:

 

É necessário se cadastrar para acessar o conteúdo.

 

Créditos:

100% Feito por Gravyerd, nenhum tutorial ou ajuda utilizada.

Link para o comentário
Compartilhar em outros sites

Este tópico está impedido de receber novos posts.
 Compartilhar

×
×
  • Criar Novo...

Informação Importante

Nós fazemos uso de cookies no seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies , caso contrário, vamos supor que você está bem para continuar.