3

マテリアル テクスチャとして使用される jpg の名前を取得しようとしています。しかし、それを文字列として戻す方法がわかりません。

私はこれを持っています 注: CreateCube[1] は配列内の TCube コンポーネントです

CreateCube[1].Material.Texture.CreateFromFile(gamedir+'\pics\'+blocktype);

ブロックタイプがどこにあるのか

grass.jpg
dirt.jpg
snow.jpg
stone.jpg

ect ..しかし、割り当てられたタイプを取得する方法は? 現在texture、レコードに文字列がありますcube

cube.texture := createCube[i].Material.Texture.?????

文字列として名前を付けるプロパティは何ですか?

4

2 に答える 2

7

コメントでの議論に続いて、これを行う方法の一例を次に示します。新しいコンポーネントを作成してプロジェクトに追加します。ここで私はそれを呼び出しましたTextureCube(パッケージを右クリック - >インストール。変更するには、右クリック - >アンインストールを実行し、変更を加えてから、右クリック - >再度インストールします):

ここに画像の説明を入力

unit TextureCube;

interface

uses
  System.SysUtils, System.Classes, FMX.Types, FMX.Types3D, FMX.Objects3D,
  Generics.Collections;

type
  TCubeTexture = (ctGrass, ctDirt, ctSnow, ctStone);

  TTextureSource = Class(TComponent)
    private
      FSelectedTexture : TCubeTexture;
      FTextures : TDictionary<TCubeTexture, TBitmap>;
      function GetTexture : TBitmap;
      procedure SetTexture(setTex : TBitmap);
    public
      constructor Create(AOwner : TComponent); override;
      destructor Destroy; override;
      property Textures : TDictionary<TCubeTexture, TBitmap> read FTextures;
    published
      property SelectedTexture : TCubeTexture read FSelectedTexture write FSelectedTexture;
      property Texture : TBitmap read GetTexture write SetTexture;

  End;

  TTextureCube = class(TCube)
  private
    FType : TCubeTexture;
    FTextureSource : TTextureSource;
    procedure SetCubeTexture(cubeTex : TCubeTexture);
    procedure SetTextureSource(texSource : TTextureSource);
  published
    property CubeType : TCubeTexture read FType write SetCubeTexture;
    property TextureSource : TTextureSource read FTextureSource write SetTextureSource;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TTextureCube]);
  RegisterComponents('Samples', [TTextureSource]);
end;

constructor TTextureSource.Create(AOwner : TComponent);
begin
  inherited;
  FTextures := TDictionary<TCubeTexture, TBitmap>.Create();
end;

destructor TTextureSource.Destroy;
begin
  FTextures.Free;
  inherited;
end;

function TTextureSource.GetTexture : TBitmap;
var tex : TBitmap;
begin
  if FTextures.TryGetValue(FSelectedTexture, tex) then
    result := tex
  else begin
    tex := TBitmap.Create(1,1);
    FTextures.AddOrSetValue(FSelectedTexture, tex);
    result := tex;
  end;
end;

procedure TTextureSource.SetTexture(setTex : TBitmap);
begin
  FTextures.AddOrSetValue(FSelectedTexture, setTex);
end;

procedure TTextureCube.SetCubeTexture(cubeTex: TCubeTexture);
var tex : TBitmap;    
begin
  FType := cubeTex;

  if Assigned(FTextureSource) and
     (FTextureSource.Textures.TryGetValue(cubeTex, tex)) then
    self.Material.Texture := tex
  else
    self.Material.Texture.Clear(0);
end;

procedure TTextureCube.SetTextureSource(texSource: TTextureSource);
begin
  FTextureSource := texSource;
  SetCubeTexture(FType);
end;   

end.

TTextureCubeこれは、から継承する新しいキューブ クラスを提供しますTCube。キューブは列挙型を追加し、TTextureSource各型のテクスチャを提供する にリンクできます。ここでは、これらをコンポーネント ツールバーのセクションに追加しましたSamples。好きな場所に配置できます。TTextureSource と TTexture キューブをフォームにドロップするだけです。TTextureCubeこれは、 をフォーム上の に自動関連付けすることで明らかに改善できますTTextureSource。今のところ、キューブとソースを関連付けるだけです。

ここに画像の説明を入力

ここでは、カスタム エディター/ビューアーをわざわざ作成しませんでしたTTextureSource。どのタイプを選択して、そのタイプのテクスチャを設定するだけでかまいません。TTextureSource は、各キューブ タイプに関連付けられたテクスチャのライブラリを保存します。

ここに画像の説明を入力

次に、それぞれに対してTTextureCubeキューブ タイプを変更するだけで、関連するテクスチャが から取得されますTTextureSource

ここに画像の説明を入力

完全な注意として、私は日曜日の退屈から非常に簡単にこれを書き始めました. 明らかに、私はおそらく多くのことを見逃していたり​​、適切にクリーンアップしていなかったりする可能性があります。これを本番コードで使用するには、もう一度適切にやり直し、例外処理、バグチェック、および整頓を追加する必要があります。

于 2013-08-11T19:10:17.257 に答える
1

フレームワークは、テクスチャのソースを追跡しません。したがって、要求したことを実行する方法はなく、代わりに、アプリケーション コードでテクスチャ ソースを自分で追跡する必要があります。

于 2013-08-12T11:10:42.613 に答える