Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi [nonVCL] Erstellen eines Namenaliases für ein Array... ? (https://www.delphipraxis.net/92010-%5Bnonvcl%5D-erstellen-eines-namenaliases-fuer-ein-array.html)

turboPASCAL 13. Mai 2007 12:18


[nonVCL] Erstellen eines Namenaliases für ein Array... ?
 
Hi,

ich komm heute nicht vorwärts... :gruebel:
Ich bin gerade dabei einen Texturemanager zusammenzubasteln, dabei möchte ich nicht die
Texturen mit einer Indexnummer aufrufen sondern mit einem Aliasnamen.

zB.:

Delphi-Quellcode:
//...
  TextureManager.AddTexture(TexturePath + 'Wasser.bmp', 'texWasser');
  //...
  // TextureManager.BindTexture(12); ist sehr unübersichtlich :-(
  TextureManager.BindTexture('texWasser');

Im Texturemanager müsste ich nun irgendwie dem Arrayindex einen Namen verpassen

Delphi-Quellcode:
procedure TTextureManager.AddTexture(FileName, TextureName: string; const LoadFromResource: Boolean = FALSE);
begin
  Setlength(Textures, length(Textures) + 1);
  LoadTexture(Filename, Textures[High(Textures)], LoadFromResource);
  AliasNamee.Add(TextureName); // <---<<< ? >>>
end;
TStringlist bzw eine THashedStringList steht mir ja nun nicht zur Verfügung.
Wie könnt ich es dennoch anstellen ?

DP-Maintenance 13. Mai 2007 12:26

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Ich verschiebe es mal in eine Delphi-Rubrik. ;)

Neutral General 13. Mai 2007 12:33

Re: [nonVCL] Erstellen eines Namenaliases für ein Array... ?
 
Hi,

Du willst bestimmt sowas wie

Delphi-Quellcode:
Textures.Find('Textur1').Ka...
Naja Find könnte eine function sein die im Texturen Array nach einer Textur sucht die den im Parameter angegebenen Namen trägt... ;)

Gruß
Neutral General

bigg 13. Mai 2007 13:02

Re: [nonVCL] Erstellen eines Namenaliases für ein Array... ?
 
moin,

leg dir dafür Konstanten an, mit deren Hilfe du auf den Index zurückgreifst. Deine Liste könntest du verketten und über einen Record verwalten. Speicherung der ersten und letzten Textur. Alle weiteren Texturen werden in den Elementen wiederfindbar adressiert.

turboPASCAL 13. Mai 2007 13:29

Re: [nonVCL] Erstellen eines Namenaliases für ein Array... ?
 
:gruebel: Äh, ne. (wenn ich es richtig verstanden habe)

Ich bräuche den Aliasnamen als "dynamischen" String um mich noch nach der 100 und x'ten Textur zu
recht zu finden.

bigg 13. Mai 2007 13:41

Re: [nonVCL] Erstellen eines Namenaliases für ein Array... ?
 
Den String kannst du genauso gut im Record unterbringen und über eine Funktion suchen lassen.

Struktur für deine Texturen:

Delphi-Quellcode:
type
  TMyTexture = ^TMyTextureStruct;
    TMyTextureStruct = Record
      Name: String;
      FileName: String;
      ResourceName: String;
      Prev: TMyTexture;
      Next: TMyTexture;
end;

Struktur für die Liste:

Delphi-Quellcode:
  TMyTextureField = Record
    Last: TMyTexture;
    First: TMyTexture;
  end;


edit: Wobei das Suchen über einen String recht langsam ist, daher nur die Konstante.

turboPASCAL 13. Mai 2007 14:30

Re: [nonVCL] Erstellen eines Namenaliases für ein Array... ?
 
Delphi-Quellcode:
unit TextureManager;

interface

uses
  uTextures;

type
  TTextures = Record
                Textur: Cardinal;
                Name: String[32];
              end;

  TTextureManager = class
    constructor Create;
    destructor Destroy; override;
  private
    Textures: array of TTextures;
  public
    function GetTextureIndex(Text: String): integer;
    procedure AddTexture(FileName, TextureName: string; const LoadFromResource: Boolean = FALSE);
    procedure BindTexture(TextureName: string);
  end;

implementation

const
  GL_TEXTURE_2D = $0DE1;

constructor TTextureManager.Create;
begin
  inherited Create;
  SetLength(Textures, 0);
end;

destructor TTextureManager.Destroy;
begin
  // to do
  inherited Destroy;
end;

procedure TTextureManager.AddTexture(FileName, TextureName: string; const LoadFromResource: Boolean = FALSE);
begin
  Setlength(Textures, length(Textures) + 1);
  LoadTexture(Filename, Textures[High(Textures)].Textur, LoadFromResource);
  Textures[High(Textures)].Name := TextureName;
end;

function TTextureManager.GetTextureIndex(Text: String): integer;
var idx: integer;
begin
  idx := 0;
  while (Textures[idx].Name <> Text) or (idx > High(Textures)) do
    inc(idx);

  Result := idx;
end;

procedure TTextureManager.BindTexture(TextureName: string);
begin
  glBindTexture(GL_TEXTURE_2D, Textures[GetTextureIndex(TextureName)].Textur);
end;

END. // End of Unit TextureManager
Zitat:

Zitat von bigg
edit: Wobei das Suchen über einen String recht langsam ist, daher nur die Konstante.

Ja, dem ist so. Deswegen wollte ich es eben nicht so wie oben machen. Nuch ich verstehe das mit den Konstanten nicht.
Wie kann ich es denn Anstellen ?

// Edit: ...da fehlte was ;)

bigg 13. Mai 2007 14:56

Re: [nonVCL] Erstellen eines Namenaliases für ein Array... ?
 
Jetzt verstehe ich dich nicht. :shock:
Wenn du eh die Unit "Classes" verwendest, kannst du dir das ganze sparen
und benutzt gleich eine TList oder leitest von dieser ab.

Bezüglich der Konstanten:
Die Konstanten müssen natürlich vorher definiert werden, eventuell in
einer extra Unit. Wenn du allerdings im Vorfeld weist, das der Mehraufwand
nicht lohnt, dann such über den Textur-Namen.

turboPASCAL 13. Mai 2007 15:02

Re: [nonVCL] Erstellen eines Namenaliases für ein Array... ?
 
Zitat:

Zitat von bigg
Jetzt verstehe ich dich nicht. :shock:
Wenn du eh die Unit "Classes" verwendest, ...

Ne, mach ich doch nicht. :gruebel:

Die Sache ist ja wenn ich Konstanten nehme ist die Anzahl der Texturen ja begrentz.
Ich weiss aber noch nicht ob ich 10 oder 1001 Texturen verwenden werde. Das wird von der
zu ladenen Scene abhängen.

bigg 13. Mai 2007 15:29

Re: [nonVCL] Erstellen eines Namenaliases für ein Array... ?
 
Zitat:

Zitat von turboPASCAL
Ne, mach ich doch nicht. :gruebel:

Stimmt, machst du nicht. :gruebel:
Ich ging davon aus, das TObject in der unit Classes deklariert wurde. Sie ist allerdings in der System.pas deklariert wurden.


Zitat:

Zitat von turboPASCAL
Die Sache ist ja wenn ich Konstanten nehme ist die Anzahl der Texturen ja begrentz.
Ich weiss aber noch nicht ob ich 10 oder 1001 Texturen verwenden werde. Das wird von der
zu ladenen Scene abhängen.

In wie fern begrenzt? Weil du im Vorfeld die Namen der Texturen nicht kennst und sie somit nicht deklarieren kannst (Konstanten)?
Dann hol dir die Textur über den Texturnamen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:58 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