![]() |
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. |
Re: [DelphiX] Sprites
Hm, möchtest du gute oder mittelmäßig - schlechte Grafiken einbauen ?
|
Re: [DelphiX] Sprites
backgroundsprite ist wirklich zum empfehlen da laedts du am anfang die komplette spielflaeche in den hintergrund :D
|
Re: [DelphiX] Sprites
er will targa benutzen.
|
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] |
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?
|
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:
So, hoffe geholfen zu haben, alle angaben wie immer ohne Gehwär...
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; igel457 |
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. |
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". |
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. |
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