A comunidade brasileira de desenvolvimento e programação de jogos.
Bem-vindo: Ter Nov 13, 2018 4:41 am

Todos os horários são GMT - 3 horas




Criar novo tópico Responder  [ 85 mensagens ]  Ir para página 1, 2, 3, 4, 5, 6  Próximo
Autor Mensagem
 Título: DelphiX - Parte 1
MensagemEnviado: Ter Nov 08, 2005 8:40 pm 
Offline
Site Admin
Avatar do usuário

Registrado em: Ter Nov 08, 2005 1:03 pm
Mensagens: 571
Localização: Santos-SP
Bom, finalmente estou de volta escrevendo um tutorial p/ DelphiX, já que o meu primeiro foi perdido completamente com um comando do DOS chamado Format.
Eu resolvi montar um tipo de tutorial que ensine de verdade, algo pratico que tenha faça o interessado realmente se interessar pelo assunto.
Vamos começar pelo básico, explicando oq é DelphiX. DelphiX é um componente que faz a interface entre o seu aplicativo e o DirectX da Microsoft, que originalmente oferece apenas interface para C e VB.
O DelphiX é composto pelo conjunto de componentes mostrados na imagem seguinte:

Imagem

Ao final desse tutorial, vc irá saber usar os principais componentes do grupo, montando assim o jogo que vc imaginar. É obvio que isso tb depende muito da sua vontade.

Faça o download do DelphiX aqui.

Primeiro inicie o delphi, logo adicione o DXDraw DirectDraw no form.

Imagem DXDraw Componente principal do DirectX, faz as imagens, objetos, camadas, etc, tudo que for visual aparecer na tela. Existem propriedades intuitivas, como width, height, Color, Display, etc...

Configure do jeito que você quiser, tamanho, cor de fundo, apenas no display, deixe do jeito que está para não ter problemas com cores agora no inicio.
Crie uma imagem, por exemplo uma bolinha de 20x20px no paint brush e salve com o formato ball.dib para ser nosso objeto principal, não esqueça de colocar um fundo com uma cor que vc não usa na imagem por exemplo aquele pink do paint para usar como cor de transparência, faça o download da imagem aqui se preferir.
Coloque agora em seu programa a biblioteca de imagens chamada DXImageList que funciona como o DXDib só que dá um auxilio melhor quando trabalhamos com muitas imagens.

Imagem DXImageList Componente basicamente definido como armário de imagens que irão ser utilizadas em seu programa, pode conter cores de transparência e animações (loop) de uma imagem só.

Devemos carregar a imagem nesse momento, para isso clique na imagem do componente e vá em Items na janela de Object Inspector, crie uma nova imagem e carregue-a intuitivamente em Picture e de um nome de Ball. Note que a transparência já foi incluída, verifique se está correto e feche a janelinha. Devemos linkar o objeto DXImageList para o DXDraw do nosso form, para isso, clique no objeto DXImageList e depois em Object Inspector e em DXDraw selecione o DXDraw do nosso form.
Após isso, coloque um objeto DXSpriteEngine no nosso form.

Imagem DXSpriteEngine Componente mais importante na criação de jogos, ele cria seus objetos interativos (Sprites) no DXDraw, todos aqueles que tem suas propriedades e métodos (chamados de class, leia mais sobre programação orientada a objetos se precisar de orientações). O interessante é que podemos interagir um objeto com outro.

Antes de começar a escrever, vamos linkar o DXSpriteEngine com nosso DXDraw para orientá-lo para onde desenhar, lembrando que o responsável por desenhar na tela nossos objetos interativos é o nosso DXSpriteEngine. Selecione o componente DXSpriteEngine, e na tela de Object Inspector em DXDraw selecione o nosso objeto DXDraw. Pronto!

Você deve estar se perguntando, oq será que controla o tempo do jogo né?
Bom, se você olhar a palheta tem um relógio chamado DXTimer, funciona da mesma maneira que o TTimer do Delphi só que é mais eficaz para tempos com intervalos mínimos... Vamos colocá-lo também em nosso form.

Imagem DXTimer Componente que controla a TimeLine de seu jogo, você pode modificar o intervalo de cada Clock (chamada de seu evento onTimer). Funciona em uma velocidade muito rápida se colocado interval = 0.

Clique no DXTimer e depois deixe false sua propriedade Enabled para evitar que ele tente desenhar os Sprites antes que o DXDraw seja criado.

Escrevendo a classe de nosso Sprite Ball:
Código:
Type
  TBall = class(TImageSprite)
  public
    mov_x,mov_y:integer;
  protected
    procedure DoMove(MoveCount: Integer); override;
  end;

procedure TBall.DoMove(MoveCount: Integer);
begin
  inherited DoMove(MoveCount);
end;


Explicações:

Criamos um Sprite do Tipo TImageSprite TBall, depois definimos duas variáveis que no nosso caso irão armazenar a velocidade e direção de nosso Sprite, depois definimos uma rotina reservada para mover o Sprite. Veremos como mais abaixo, por enquanto deixe a procedure vazia como mostra o código.
Feito isso, precisamos adicionar alguns eventos para que os Sprites sejam ativados.

Primeiro, adicionamos no onCreate do Form:
Código:
procedure TForm1.FormCreate(Sender: TObject);
var
  PlayerSprite: TSprite;
begin
  PlayerSprite := TBall.Create(Form1.DXSpriteEngine1.Engine);
  with TBall(PlayerSprite) do
  begin
    Image := DXImageList1.Items.Find('Ball');
    X := 0; Y := 0; Z := 2;
    mov_x:= 0; mov_y:= 0;
    Height:= 20; Width := 20;
  end;
  DXTimer1.Enabled:= true;
end;


Explicações:

Como os programadores já estão acostumados com o comando with, acho que não preciso falar muito sobre ele, mas é bom lembrar que oq segue depois desse comando são propriedades do objeto passado, no caso um objeto recém criado no DXSpriteEngine (TBall) com o nome de PlayerSprite. Definimos suas propriedades iniciais como posições no plano cartesiano, tamanho e variáveis por nós definidas. Depois disso, habilitamos o componente DXTimer para fazer o seu trabalho.

Vamos escrever o papel do DXTimer:
Código:
procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
  if not DXDraw1.CanDraw then exit;
  DXSpriteEngine1.Move(LagCount);
  DXSpriteEngine1.Dead;
  DXDraw1.Surface.Fill(0);
  DXSpriteEngine1.Draw;
  DXDraw1.Flip;
end;


Na primeira linha, temos uma verificação básica para evitar panes no programa, se o DXDraw não está pronto p/ desenhar ele sai da função.
Vou explicar oq vem abaixo:

Código:
DXSpriteEngine1.Move(LagCount);
' Essa linha serve para rodar todas as procedures DoMove de todos os Objetos Criados.

Código:
DXSpriteEngine1.Dead;
' Essa linha serve para apagar do engine todos os objetos mortos pelo comando Objeto.Dead.

Código:
DXDraw1.Surface.Fill(0);
' Preenche a surface com a cor preta.

Código:
DXSpriteEngine1.Draw;
' Manda o Engine desenhar seus objetos com posições, imagens, tamanhos atualizados no DXDraw.

Código:
DXDraw1.Flip;
' Comando de atualização do DXDraw, sem ele nada será aplicado na tela.


Agora compile e veja o resultado, você deve ver a sua imagem na posição 0x0 parada na tela do DXDraw.
Bom, mas e aí? não vai se mover?... Calma, vamos implementar isso.
Primeiro colocamos o componente DXInput no nosso form.

Imagem DXInput Componente que facilita o manuseio de joysticks e pads instalados no micro, isso facilita muito p/ quem quer desenvolver jogos que usem controles manches e etc..

Para o DXInput verificar o estado do controle (no nosso caso vamos usar o teclado) nós precisamos incluir uma linha no evento do DXTimer, antes de pedir p/ DXSpriteEngine mover os Sprites, coloque:
Código:
DXInput1.update;

Chegou a hora de implementar a função de movimento do sprite, implemente do jeito que quiser, mas se não souber mais ou menos como, siga o modelo:

Código:
procedure TBall.DoMove(MoveCount: Integer);
begin
  inherited DoMove(MoveCount);
  if (X + Width > Form1.DXDraw1.ClientWidth) or (X < 0) then
    mov_x:= mov_x * -1
  else if isLeft in Form1.DXInput1.States then
    mov_x:= -5
  else if isRight in Form1.DXInput1.States then
    mov_x:= 5;
  if (Y + Height > Form1.DXDraw1.ClientHeight) or (Y < 0) then
    mov_y:= mov_y * -1
  else if isDown in Form1.DXInput1.States then
    mov_y:= 5
  else if isUp in Form1.DXInput1.States then
    mov_y:= -5;
  if isButton1 in Form1.DXInput1.States then Dead;
  X := X + mov_x;
  Y := Y + mov_y;
end;


Explicações:

Nessa função utilizamos recursos do DXInput como isLeft, isRight, isDown, isUp e isButton1, esses flags são de acordo com o joystick que o usuário estiver utilizando, no caso do teclado são as setas e a barra de espaço.
Dá p/ configurar coisas bastante úteis no DXInput, é só fuçar um pouco no Object Inspector dele. Limitamos também a área de movimento do Sprite com as condições de ClientWidth e ClientHeight do DXDraw e com a barra de espaço destruímos o objeto da memória. Veja um pouco e entenda a matemática da procedure.

Está um pouco sem graça né? Vamos colocar um sonzinhu! Pegue dois sons legais aí no seu pc (wav pequeno) no formato sound1.wav e sound2.wav, e coloque no diretório do jogo, ou faça o download do sound1 e do sound2 aqui.
Agora coloque no seu programa o DXSound e o DXWaveList, linke o DXWaveList para o DXSound, carregue os waves sound1 e sound2 da mesma maneira que fez com a imagem e não se esqueça de dar o nome dos sons.

Imagem DXSound Componente que possibilita o programa de emitir sons pelo DirectSound, é muito bom utilizar o DXSound pois como todos os outros componentes do DirectX possibilita o melhor desempenho do hardware e sem precisar configurar muita coisa.

Imagem DXWaveList Componente basicamente definido como armário de sons que irão ser utilizadas em seu programa, utilizando em conjunto com o DXSound você pode dar controlar o som pelo próprio componente. É o mesmo que DXWave só que facilita o manuseio com vários sons.

Agora coloque esses comandos para tocar os sons:
Código:
Form1.DXWaveList1.Items.Find('Sound1').Play(False);
Form1.DXWaveList1.Items.Find('Sound2').Play(False);


Explicações:

Com esse comando chamamos o Play com o name do nosso Sound, fora o play, temos muitos outros controles, como o stop, e etc... (Ps: no caso do play, aquele false é o flag de loop, não queremos um loop) No caso do exemplo, coloque a primeira linha (onde toca o sound1) dentro da condição onde o PlayerSprite bate na parede, e a segunda linha (onde toca o sound1) onde a button1 é chamado.

Bom, agora nosso pequeno joguinho já está pronto!, Só precisamos aprender mais uma coisa antes de terminar essa parte: Escrever na tela sem o DXSpriteEngine.
Ohhh, não é dificil, mas é chato, mais chato que escrever em DOS pois precisamos dar X e Y e não linhas e colunas. Não sei se já ouviu falar em Canvas, mas será isso que vamos utilizar.
Exemplo, iremos escrever o FPS (Frames per second, isso depende do computador) e quantos sprites contém no seu jogo. No evento do DXTimer, OnTimer, colocaremos o código abaixo antes da linha que contém o DXDraw.flip (atualizar o DXDraw).

Incluir o seguinte código:
Código:
with DXDraw1.Surface.Canvas do
begin
  Brush.Style := bsClear;
  Font.Color := clwhite;
  Font.Size := 12;
  Textout(0, 0, 'FPS: '+inttostr(DXTimer1.FrameRate));
  Textout(0, 24,'SPT: '+inttostr(DXSpriteEngine1.Engine.AllCount));
  Release;
end;


Explicações:

Antes de atualizar o DXDraw, marcamos alguns pixels na sua surface, no caso utilizamos o canvas para escrever com TextOut(x,y,string), mas outras utilidades tem o canvas, por exemplo de marcar pixel a pixel, desenhar retas, curvas, círculos, elipses, quadrados, retângulos e outras coisas mais, sem esquecer do Release para soltar o canvas. Se você entende de matemática o canvas lhe será muito útil para desenhar gráficos com equações e etc...

Bom, antes de eu me despedir queria deixar p/ download o zip contendo o programa fonte:

Download do Fonte Exemplo1

Obrigado pela paciência e abraços a todos os programadores de jogos no Brasil.
Caso tenha alguma dúvida, correção ou informação adicional, por favor, responda esse tópico.
Espero que eu tenha ajudado alguma coisa e boa sorte...
Até o próximo texto...

_________________
Luiz Pestana
facebook | blog

Imagem


Editado pela última vez por Luiz Pestana em Qua Ago 23, 2006 2:24 pm, em um total de 3 vezes.

Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Qua Nov 09, 2005 2:47 pm 
Offline
Membro novo

Registrado em: Qua Nov 09, 2005 2:37 pm
Mensagens: 4
Muito bom o tutorial, parabéns.........
Eu pretendo começar a programr jogos em delphi, pois me parece mais simples do q usando C++(linguagem q estou estudando).


flw........................


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Dom Jan 01, 2006 12:24 pm 
Offline
Membro júnior

Registrado em: Dom Jan 01, 2006 10:21 am
Mensagens: 21
Localização: Guarulhos SP
ok, eu me perdi na hora dos DXs que voçê se referiu. Mas pelo pouco que eu entendi, deveria haver uma guia "DelphiX" junto aos "Standard, Additional , Win32, System, DataAccess, DataControls, dbExpress, DataSnap, BDE, ADO, InterBase, WebServices, (isso não acaba!!!)..." mas não há nenhuma guia DelphiX ali.
Eu tentei Project > Add to Project... e selecionar o DXDraws.pas mas ele só adicionou a unit ali do lado... :(
E o DXImageList é um dos itens ali da guia DelphiX, né?

_________________
De volta à procura por estágios...


Editado pela última vez por aDaGa em Seg Jan 02, 2006 10:50 am, em um total de 1 vez.

Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Dom Jan 01, 2006 3:25 pm 
Offline
Site Admin
Avatar do usuário

Registrado em: Ter Nov 08, 2005 1:03 pm
Mensagens: 571
Localização: Santos-SP
Vamos lah, vc não instalou corretamente o componente.

Primeiramente baixe o pacote do delphix e descompacte em uma nova pasta na pasta do delphi, por exemplo:
c:\arquivos de programas\borland\delphi 7\delphix\*
Depois abra o arquivo dentro da pasta \delphix\source\ chamado DelphiX_for7.dpk e clique em install.
Pronto, feche e salve, agora vá no delphi e vah em Tools > Environment Options > Library > Library Path, e digite: $(DELPHI)\delphix\Source e clique em Add.

Pronto, configurado!
Qualquer dúvida poste aqui!

Abraços!

_________________
Luiz Pestana
facebook | blog

Imagem


Voltar ao topo
 Perfil  
 
 Título: tem delphix para delphi 6???????????
MensagemEnviado: Dom Jan 01, 2006 6:26 pm 
Offline
Membro novo
Avatar do usuário

Registrado em: Sáb Dez 31, 2005 12:30 am
Mensagens: 8
tem delphix para delphi 6???????????
to precisando saber..... pq até hoje eu não axei!!!!

_________________
'Tiagoooo....


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Dom Jan 01, 2006 11:50 pm 
Offline
Site Admin
Avatar do usuário

Registrado em: Ter Nov 08, 2005 1:03 pm
Mensagens: 571
Localização: Santos-SP
o delphiX tinha até o delphi5, esse q disponibilizei aqui tem algumas modificações para o delphi7, as mesmas do delphi6, tenta instalar esse, se não der, dá uma procurada no google.

Abraços!

_________________
Luiz Pestana
facebook | blog

Imagem


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Seg Jan 02, 2006 11:23 am 
Offline
Membro júnior

Registrado em: Dom Jan 01, 2006 10:21 am
Mensagens: 21
Localização: Guarulhos SP
ok, deu um problema aqui.
Citação:
TBall = class(TImageSprite)
public
mov_x,mov_y:integer;
protected
procedure DoMove(MoveCount: Integer); override;
end;

eu coloquei ali no type, junto do
Citação:
TForm1 = class(TForm)
e aí começaram a aparecer janelinhas de erro. Ele não aceitou o
Citação:
TBall = class(TImageSprite)

Queria ":" no lugar do "=". E depois quando tentei compilar ele não aceitou o tipo "class"

_________________
De volta à procura por estágios...


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Seg Jan 02, 2006 11:28 am 
Offline
Site Admin
Avatar do usuário

Registrado em: Ter Nov 08, 2005 1:03 pm
Mensagens: 571
Localização: Santos-SP
vc colocou as units? devem ter faltado alguma, tenta adicionar essas uses:
DXSprite, DXCLass, DXDraws, DirectX

Abraços!

_________________
Luiz Pestana
facebook | blog

Imagem


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Seg Jan 02, 2006 12:11 pm 
Offline
Membro júnior

Registrado em: Dom Jan 01, 2006 10:21 am
Mensagens: 21
Localização: Guarulhos SP
Adicionar as uses das units que voçê falou, mas não funcionou.
Outro class que tem é o TForm1 = class(TForm), mas o problema é que ali no type ele parece não aceitar o TBall =class(TImageSprite). Pede ":" no lugar do "=", aí quando mando compilar ele diz:
Citação:
Expected an identifier but CLASS found.

Tem que ser class mesmo?

_________________
De volta à procura por estágios...


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Seg Jan 02, 2006 12:18 pm 
Offline
Site Admin
Avatar do usuário

Registrado em: Ter Nov 08, 2005 1:03 pm
Mensagens: 571
Localização: Santos-SP
cara, a ordem eh:

type
TForm1 = class(TForm)
published
public
privated
end;

TBall = class(TDXImageSprite)
published
public
privated
end;

sendo q variaveis não podem ser declaradas depois de procedures e funcions.
veja o exemplo do site, ou poste maior conteudo do seu codigo.

abracos.

_________________
Luiz Pestana
facebook | blog

Imagem


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Seg Jan 02, 2006 8:48 pm 
Offline
Membro júnior

Registrado em: Dom Jan 01, 2006 10:21 am
Mensagens: 21
Localização: Guarulhos SP
Bom voçê deve estar cansado de me ver postar aqui. Então agradeço sua ajuda e paciência.
O problema agora são as .dcus dos DXClass, DXSprite, DXDraws.
As .dcus estão lá na pasta do DelphiX. Eu coloquei na pasta do projeto. Mas como faço para o projeto reconheçer as .dcus deles?

_________________
De volta à procura por estágios...


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Seg Jan 02, 2006 9:33 pm 
Offline
Site Admin
Avatar do usuário

Registrado em: Ter Nov 08, 2005 1:03 pm
Mensagens: 571
Localização: Santos-SP
vc fez o procedimento de adicionar a pasta Source do DelphiX na library path do delphi? descrevi o procedimento algumas mensagens acima!

Abraços. :idea:

_________________
Luiz Pestana
facebook | blog

Imagem


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Seg Jan 02, 2006 9:56 pm 
Offline
Membro júnior

Registrado em: Dom Jan 01, 2006 10:21 am
Mensagens: 21
Localização: Guarulhos SP
ok, o problema da livraria foi resolvido.
Agora o problema é que ele não reconhece o arquivo 'Ball.dib'
Eu fiz o desenho no paint e na hora de salvar tem 3 opções com ".dib", eu escolhi a d 24. Mas quando vou no projeto e mando compilar ele não reconhece o arquivo 'Ball.dib'
Qual pode ser o problema dessa vez?

_________________
De volta à procura por estágios...


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Seg Jan 02, 2006 9:59 pm 
Offline
Site Admin
Avatar do usuário

Registrado em: Ter Nov 08, 2005 1:03 pm
Mensagens: 571
Localização: Santos-SP
Acho q a palleta de cores desse exemplo está baixa, salve em .dib com um numero baixo de cores ou então procure nas propriedades do componente de imagem para adicionar cores a palleta de cores.

Abraços!

_________________
Luiz Pestana
facebook | blog

Imagem


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Ter Jan 03, 2006 8:54 pm 
Offline
Membro júnior

Registrado em: Dom Jan 01, 2006 10:21 am
Mensagens: 21
Localização: Guarulhos SP
De novo eu estou eu aqui...

Essa imagem .dib deve ser salva como:
monocromático?
16 cores?
256 cores?
24 bits?
Eu salvei monocromático e deixei tudo preto e branco.Mas não adiantou.
E o Delphi também não está ajudando muito. Quando mando compilar aparece a mensagem :
Citação:
Debugger Exception Notification
Project Project1.exe raised exception class EPictureCollectionError with message 'Image 'ball' not found'. Process stopped. Use Step or Run to continue.

eu continuo clicando ali no play e aparece o form com o DXDraw preto.
Lá no código eu coloquei
Citação:
procedure TForm1.FormCreate(Sender: TObject);
var
PlayerSprite: TSprite;
begin
PlayerSprite := TBall.Create(Form1.DXSpriteEngine1.Engine);
with TBall(PlayerSprite) do
begin
Image := DXImageList1.Items.Find('ball');
X := 0; Y := 0; Z := 2;
mov_x:= 0; mov_y:= 0;
Height:= 20; Width := 20;
end;
DXTimer1.Enabled:= true;
end;

e o nome do arquivo ficou ball.
Se o nome do arquivo é o mesmo que o programa deve procurar,
porque ele dá problema?

_________________
De volta à procura por estágios...


Voltar ao topo
 Perfil  
 
Exibir mensagens anteriores:  Ordenar por  
Criar novo tópico Responder  [ 85 mensagens ]  Ir para página 1, 2, 3, 4, 5, 6  Próximo

Todos os horários são GMT - 3 horas


Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitantes


Enviar mensagens: Proibido
Responder mensagens: Proibido
Editar mensagens: Proibido
Excluir mensagens: Proibido
Enviar anexos: Proibido

Ir para:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traduzido por: Suporte phpBB