メートルテクスチャとして使用される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.?????
どのプロパティが名前を文字列として与えますか?
コメントでの議論のフォローアップとして、これを行う方法の一例を示します。新しいコンポーネントを作成し、それをプロジェクトに追加します。ここで私はそれを呼び出しました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
のsにsを自動関連付けさせることで明らかに改善できます。TTextureSource
今のところ、キューブとソースを関連付けるだけです。
ここではわざわざカスタムエディタ/ビューアを作成しませんでした。ここでは、TTextureSource
任意のタイプを選択して、そのタイプのテクスチャを設定できます。TTextureSourceは、各キューブタイプに関連付けられたテクスチャのライブラリを保存します。
次に、それぞれTTextureCube
について、キューブタイプを変更するだけで、関連するテクスチャがTTextureSource
:から取得されます。
完全な注意として-私はこれを日曜日の退屈から非常に迅速に書き始めた方法の例として、そしておそらくもう少しエレガントなデザインを組み込む方法の例として書きました。明らかに、私はおそらく多くのことを見逃している、おそらく適切にクリーンアップされていないなどです。これを本番コードで使用するには、もう一度、いくつかの追加の例外処理、バグチェック、および整理を行う必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加