Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [DelphiX] Sprites (https://www.delphipraxis.net/72662-%5Bdelphix%5D-sprites.html)

3_of_8 5. Jul 2006 18:41

Re: [DelphiX] Sprites
 
Hmm...
Er ist halt abhängig von der Position des Spielers, wird also gedreht und ab und zu wird auch ein komplett neuer geladen.

Nils_13 5. Jul 2006 18:42

Re: [DelphiX] Sprites
 
Hm, möchtest du gute oder mittelmäßig - schlechte Grafiken einbauen ?

pacman1986 5. Jul 2006 19:08

Re: [DelphiX] Sprites
 
backgroundsprite ist wirklich zum empfehlen da laedts du am anfang die komplette spielflaeche in den hintergrund :D

inherited 5. Jul 2006 19:09

Re: [DelphiX] Sprites
 
er will targa benutzen.

Nils_13 5. Jul 2006 19:22

Re: [DelphiX] Sprites
 
Targa ?

Merk dir diesen Satz mal für die Zukunft (wirst du bei DelphiX noch brauchen, wenn es plötzlich ruckelt):
Je besser die Grafiken, desto schlechter DelphiX.

[Deshalb die Frage, wie hoch die Qualität deiner Grafiken sind]

3_of_8 5. Jul 2006 19:27

Re: [DelphiX] Sprites
 
Targa, genau. Ich habe mehrere Targas in einer Datei, lade sie, dekomprimiere sie und speichere sie als Bitmaps in eine TDXImageList. Und dann?

igel457 5. Jul 2006 19:44

Re: [DelphiX] Sprites
 
Ich glaube, du musst uns jetzt mal gaaanz genau erklären, was du überhaput machen möchtest.

Wenn ich das richtig verstanden habe, dann möchtest du eine Karte darstellen.

Frage 1: Wie ist dies Karte aufgebaut? Immer wieder abwechselnde Grafiken oder komplett gekachelt mit einer Grafik?

Frage 2: Was wolltest du mit den Sprites genau erreichen?

Wenn du einen komplett, mit einer Grafik, gekachelten Hintergrund hast, dann musst du TBackgroundSprite verwenden.

Wenn du immer abwechselnde Tiles hast, dann leite dir eine Klasse von TImageSprite ab, erstelle so viele Kacheln wie du brauchst um den Bildschirm zu füllen. Ich empfehle dir allerding wärmstens größere Tiles als 30x30 oder 50x50 zu verwenden.

Gehen wir mal von fall 2 aus, dann machst du einfach folgendes:

Delphi-Quellcode:
procedure LoadImagesIntoList;
var i:integer;
begin
  for i := 0 to tgas.count-1 do
  begin
    with TPictureCollectionItem(DXImagelist1.Items.Add) do
    begin
      picture.bitmap.width := tgas[i].width;
      picture.bitmap.height := tgas[i].height;
      picture.bitmap.canvas.draw(0,0,tgas[i]);
      transparent := false;
      restore;    
    end;
  end;
end;

procedure CreateTiles; //aufrufen in OnCreate
var ax,ay:integer;
begin
  for ax := 0 to 100 do
    for ay := 0 to 100 do
    begin
      with TImageSprite.Create(DXSpriteEngine1.Engine) do
      begin
        image := DXImageList1.Items[random(DXImagelist1.Count)];
        width := image.width;
        height := image.height
        x := ax*width;
        y := ay*height;
      end;
    end;
end;

procedure DXTimer1Timer(sender:TObject;lagcount:integer);
begin
  DXDraw1.Surface.Fill(0);
  DXSpriteEngine1.Move(1);
  DXSpriteEngine1.Draw;
  DXSpriteEngine1.Dead;
  DXDraw1.Flip;
end;
So, hoffe geholfen zu haben, alle angaben wie immer ohne Gehwär...

igel457

3_of_8 5. Jul 2006 19:48

Re: [DelphiX] Sprites
 
Also: Ich habe einen Hintergrund der aus mehreren verschiedenen Tiles bestehen kann.

Mit Sprites wollte ich gar nichts erreichen - inherited besteht darauf.

Mein Code zum Laden der Sprites sieht so aus:

Delphi-Quellcode:
unit Tiles;

interface

uses SysUtils, Classes, Targa, DXDraws, Graphics, Dialogs;

type
  TTiles=class
  protected
    imglst: TDXImageList;
    FTileWidth, FTileHeight: Cardinal;
    function GetTile(Index: Cardinal): TPictureCollectionItem;
    function GetCount: Integer;
  public
    constructor Create;
    destructor Destroy; override;
    procedure LoadFromFile(FileName: string);
    property TileWidth: Cardinal read FTileWidth;
    property TileHeight: Cardinal read FTileHeight;
    property Tiles[Index: Cardinal]: TPictureCollectionItem
    read GetTile; default;
    property Count: Integer read GetCount;
  end;

implementation

function TTiles.GetTile(Index: Cardinal): TPictureCOllectionItem;
begin
  Result:=imglst.Items.Items[Index];
end;

constructor TTiles.Create;
begin
  inherited Create;
  FTileWidth:=32;
  FTileHeight:=32;
  imglst:=TDXImageList.Create(nil);
end;

destructor TTiles.Destroy;
begin
  imglst.free;
  inherited Destroy;
end;

function TTiles.GetCount: Integer;
begin
  result:=imglst.items.Count;
end;

procedure TTiles.LoadFromFile(FileName: string);
var fs: TFileStream;
  memstr: TMemoryStream;
  size: Cardinal;
  buf: array of Byte;
  tgaimg: TTarga;
begin
  imglst.Items.Clear;
  fs:=TFileStream.Create(FileName, fmOpenRead);
  memstr:=TMemoryStream.Create;
  tgaimg:=TTarga.Create;
  fs.Read(FTileWidth, sizeof(Cardinal));
  fs.Read(FTileHeight, sizeof(Cardinal));
  while true do
  begin
    if fs.Read(size, sizeof(Cardinal))<sizeof(Cardinal) then break;
    setlength(buf, size);
    if Cardinal(fs.Read(buf[0], size))<size then break;
    memstr.Write(buf[0], size);
    memstr.position:=0;
    tgaimg.LoadFromStream(memstr);
    with imglst.Items.Items[imglst.Items.Add.Index] do
    begin
       Picture.Bitmap:=TBitmap.Create;
       Picture.Bitmap.Assign(tgaimg.Bitmap);
      Picture.Bitmap.Canvas.Pen.Style:=psDash; ;
        Picture.Bitmap.Canvas.Pen.Color:=clWhite;
      Picture.Bitmap.Canvas.Brush.Style:=bsClear;
      Picture.Bitmap.Canvas.Rectangle(0, 0, Picture.Bitmap.Width-1,
            Picture.Bitmap.Height-1);
      PatternWidth:=Picture.Bitmap.Width;
      PatternHeight:=Picture.Bitmap.Height;
    end;
    memstr.Clear;
  end;
  setlength(buf, 0);
  fs.free;
  memstr.free;
  tgaimg.free;
end;

end.

igel457 5. Jul 2006 19:56

Re: [DelphiX] Sprites
 
Du musst die imglist mit dem DXDraw verknüpfen...
(ImgList.DXDraw := ADXDraw)
Außerdem musst du noch "Restore" aufrufen, nachdem du ein Bild in der ImageList verändert hast.
Und mein weg mit dem With ist ein wenig "eleganter".

3_of_8 5. Jul 2006 20:07

Re: [DelphiX] Sprites
 
Geht trotzdem ned...

Delphi-Quellcode:
unit Tiles;

interface

uses SysUtils, Classes, Targa, DXDraws, Graphics, Dialogs;

type
  TTiles=class
  protected
    imglst: TDXImageList;
    FTileWidth, FTileHeight: Cardinal;
    function GetTile(Index: Cardinal): TPictureCollectionItem;
    function GetCount: Integer;
  public
    constructor Create(DXDraw: TDXDraw);
    destructor Destroy; override;
    procedure LoadFromFile(FileName: string);
    property TileWidth: Cardinal read FTileWidth;
    property TileHeight: Cardinal read FTileHeight;
    property Tiles[Index: Cardinal]: TPictureCollectionItem
          read GetTile; default;
    property Count: Integer read GetCount;
  end;

implementation

function TTiles.GetTile(Index: Cardinal): TPictureCOllectionItem;
begin
  Result:=imglst.Items.Items[Index];
end;

constructor TTiles.Create(DXDraw: TDXDraw);
begin
  inherited Create;
  FTileWidth:=32;
  FTileHeight:=32;
  imglst:=TDXImageList.Create(DXDraw);
end;

destructor TTiles.Destroy;
begin
  imglst.free;
  inherited Destroy;
end;

function TTiles.GetCount: Integer;
begin
  result:=imglst.items.Count;
end;

procedure TTiles.LoadFromFile(FileName: string);
var fs: TFileStream;
  memstr: TMemoryStream;
  size: Cardinal;
  buf: array of Byte;
  tgaimg: TTarga;
begin
  imglst.Items.Clear;
  fs:=TFileStream.Create(FileName, fmOpenRead);
  memstr:=TMemoryStream.Create;
  tgaimg:=TTarga.Create;
  fs.Read(FTileWidth, sizeof(Cardinal));
  fs.Read(FTileHeight, sizeof(Cardinal));
  while true do
  begin
    if fs.Read(size, sizeof(Cardinal))<sizeof(Cardinal) then break;
    setlength(buf, size);
    if Cardinal(fs.Read(buf[0], size))<size then break;
    memstr.Write(buf[0], size);
    memstr.position:=0;
    tgaimg.LoadFromStream(memstr);
    with imglst.Items.Items[imglst.Items.Add.Index] do
    begin
       Picture.Bitmap:=TBitmap.Create;
       Picture.Bitmap.Assign(tgaimg.Bitmap);
      Picture.Bitmap.Canvas.Pen.Style:=psDash; ;
        Picture.Bitmap.Canvas.Pen.Color:=clWhite;
      Picture.Bitmap.Canvas.Brush.Style:=bsClear;
      Picture.Bitmap.Canvas.Rectangle(0, 0, Picture.Bitmap.Width-1,
            Picture.Bitmap.Height-1);
    end;
    memstr.Clear;
  end;
  imglst.Items.Restore;
  setlength(buf, 0);
  fs.free;
  memstr.free;
  tgaimg.free;
end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:20 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz