3

I am trying to get the name of the jpg used as the meterial texture. But not sure how to get it back as a string.

I have this NOTE: CreateCube[1] is a TCube component in an array

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

where blocktype is going to be

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

ect.. but how to get the type once it has been assgined? Currently I have a string texture in the record cube.

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

what property will give the name as string?

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与 s 自动关联来改进TTextureSource- 现在只需关联立方体和源:

在此处输入图像描述

我没有费心在这里制作自定义编辑器/查看器 -TTextureSource您可以选择任何类型并为该类型设置纹理。TTextureSource 将保存与每种立方体类型关联的纹理库:

在此处输入图像描述

然后对于每个TTextureCube您只需要更改立方体类型,它就会从以下位置获取关联的纹理TTextureSource

在此处输入图像描述

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

于 2013-08-11T19:10:17.257 回答
1

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

于 2013-08-12T11:10:42.613 回答