我试图获得用作材质纹理的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.?????
什么属性会将名称赋予字符串?
答案 0 :(得分:7)
在评论中讨论后,这里有一个如何执行此操作的示例 - 创建一个新组件并将其添加到项目中。在这里,我将其称为TextureCube
(右键单击包 - &gt;安装。要更改,请执行右键单击 - >卸载,进行更改,然后右键单击 - >再次安装>:< / p>
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
中获取相关的纹理:
作为一个完整的警告 - 我在周日的无聊中很快写下了这个,作为如何开始的例子,也许是如何融入更优雅的设计。显然我可能错过了很多东西,可能还没有正确清理等等。如果没有一次好的,我不会在生产代码中使用它,一些添加了异常处理,错误检查和整洁。
答案 1 :(得分:1)
框架不跟踪纹理的来源。因此,无法按照您的要求进行操作,而是需要在应用程序代码中自行跟踪纹理源。