Carregando um mundo 3D Quake 2 Map com Irrlicht em Turbo Delphi .NET

Pra compilar o programa abaixo é necessário baixar o Irrlicht e o Turbo Delphi for .NET Explorer. Veja em Ferramentas onde baixar.
Aqui o Irrlicht foi colocado no diretório C:\Arquivos de programas, mas poderia ser qualquer outro.
Em caso de erro na execução do EXE do programa abaixo, deve-se colocar o EXE no subdiretório bin\Win32-VisualStudio do Irrlicht (ou então copiar as DLLs Irrlicht.dll e Irrlicht.NET.dll pro diretório do executável).

Apesar de todos os exemplos aqui usarem a versão .NET, eles não dão mais suporte a ela.
A implementação disponível não se comporta bem com o Turbo Delphi, tanto na parte gráfica quanto nas classes. Até o momento não é possível herdar o ISceneNode, por exemplo.
Sem isso não se progride muito.
No entanto, serve como introdução à programação de jogos 3D pela vantagem da clareza da linguagem Pascal.

O arquivo PK3 (map-20kdm2.pk3) é apenas um arquivo ZIP.
A geometria do mundo foi modelada segundo o formato BSP, usado pelo Quake 2.
Um Mapa (Map) também é chamado de Nível (Level).
Nesse exemplo o mapa está armazenado em 20kdm2.bsp, que vem no Irrlicht.

Há muitos mapas de boa qualidade disponíveis gratuitamente na Internet.
É necessário apenas descobrir em que ponto 3D eles foram modelados, já que nem todos são modelados na origem.
Nesse aí a origem está deslocada pra (-1300; -144; -1249).


Configurar → abre a sessão com o Direct3D.

CarregarMundo → usa o GetMesh pra carregar um modelo (mesh) pra memória.

Rodar → repetição principal do programa.



Mundo.dpr
program Mundo;

{%DelphiDotNetAssemblyCompiler 'C:\Arquivos de programas\Irrlicht-1.3.1\bin\Win32-VisualStudio\Irrlicht.NET.dll'}

uses Borland.Vcl.SysUtils, Irrlicht, Irrlicht.Video, Irrlicht.Core, Irrlicht.Scene;

type
  TIJogo= class
    protected
      procedure CarregarMundo; overload; virtual;
      procedure Configurar;    overload; virtual;
    public
      procedure Rodar; overload; virtual;
    protected
      Mundo          : Irrlicht.Scene.IAnimatedMesh;
      Dispositivo_ID : IrrlichtDevice;
      Dispositivo_ISM: ISceneManager;
      Nodulo         : ISceneNode;
      Dispositivo_IVD: IVideoDriver;
  end;
procedure TIJogo.CarregarMundo;

begin
  Dispositivo_ID.FileSystem.AddZipFileArchive ('map-20kdm2.pk3');
  Mundo := Dispositivo_ISM.GetMesh ('20kdm2.bsp');
  Nodulo:= nil;
  if Mundo <> nil then begin
    Nodulo:= Dispositivo_ISM.AddOctTreeSceneNode (Mundo.GetMesh (0), nil, 0);
    if Nodulo <> nil then
      Nodulo.Position:= Vector3D.Create (-1300, -144, -1249);
  end;
end;
procedure TIJogo.Configurar;

begin
  SetCurrentDir ('C:\Arquivos de programas\Irrlicht-1.3.1\media');
  Dispositivo_ID                      := IrrlichtDevice.Create (DriverType.Direct3D9);
  Dispositivo_ID.ResizeAble           := True;
  Dispositivo_ID.WindowCaption        := 'Mundo [ '+ Dispositivo_ID.VideoDriver.Name + ' ]';
  Dispositivo_IVD                     := Dispositivo_ID.VideoDriver;
  Dispositivo_ISM                     := Dispositivo_ID.SceneManager;
  Dispositivo_ID.CursorControl.Visible:= False;
  Dispositivo_ISM.AddCameraSceneNodeFPS;
end;
procedure TIJogo.Rodar;

begin
  while Dispositivo_ID.Run and Dispositivo_ID.WindowActive do begin
    Dispositivo_IVD.BeginScene (True, True, Color.Create (0, 200, 200, 200));
    Dispositivo_ISM.DrawAll;
    Dispositivo_IVD.EndScene;
  end;
end;
var
  IJogo: TIJogo;

begin
  IJogo:= TIJogo.Create;
  try
    with IJogo do begin
      Configurar;
      CarregarMundo;
      Rodar;
    end;
  finally
    IJogo.Free;
  end;
end.



Clique aqui pra baixar o código (2 Ko)



Chaves
Quake 2 maps
Irrlicht .NET CP
IrrPascal





http://transeberiano.brinkster.net