获取用作纹理的文件名

时间:2013-08-11 14:38:47

标签: delphi delphi-xe2 firemonkey

我试图获得用作材质纹理的jpg的名称。但不知道如何把它作为一个字符串。

我有这个注意:CreateCube [1]是数组中的TCube组件

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

其中blocktype将是

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

等.. 但是一旦它被分配,如何获得类型?目前,我在记录texture中有一个字符cube

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

什么属性会将名称赋予字符串?

2 个答案:

答案 0 :(得分:7)

在评论中讨论后,这里有一个如何执行此操作的示例 - 创建一个新组件并将其添加到项目中。在这里,我将其称为TextureCube(右键单击包 - &gt;安装。要更改,请执行右键单击 - >卸载,进行更改,然后右键单击 - >再次安装>:< / p>

enter image description here

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来改善这一点 - 现在只关联多维数据集和来源:

enter image description here

我没有在这里制作自定义编辑器/查看器 - 在TTextureSource中,您可以选择任何类型并为该类型设置纹理。 TTextureSource将保存与每个多维数据集类型关联的纹理库:

enter image description here

然后对于每个TTextureCube,您只需要更改多维数据集类型,它将从TTextureSource中获取相关的纹理:

enter image description here

作为一个完整的警告 - 我在周日的无聊中很快写下了这个,作为如何开始的例子,也许是如何融入更优雅的设计。显然我可能错过了很多东西,可能还没有正确清理等等。如果没有一次好的,我不会在生产代码中使用它,一些添加了异常处理,错误检查和整洁。

答案 1 :(得分:1)

框架不跟踪纹理的来源。因此,无法按照您的要求进行操作,而是需要在应用程序代码中自行跟踪纹理源。