我使用此函数来获得材料我可以将Emition Color更改为GLScene中的GLHudSprite对象吗?
function AddMaterial(aMatLib: TGlMaterialLibrary; aFileName, aMaterialName: string):TGlLibMaterial;
begin
result := aMatLib.Materials.Add;
with result do
begin
with Material do
begin
MaterialOptions := [moIgnoreFog, moNoLighting];
Texture.Disabled := false;
BlendingMode := bmTransparency;
Texture.TextureMode := tmModulate;
with FrontProperties do
begin
Ambient.SetColor(1, 1, 1, 1);
Diffuse.SetColor(1, 1, 1, 1);
Emission.SetColor(1, 1, 1, 1);
Specular.SetColor(1, 1, 1, 1);
end;
Texture.ImageClassName := 'TGLCompositeImage';
if ExtractFileExt(aFileName) = '' then
TGLCompositeImage(Texture.Image).LoadFromFile(aFileName + '.png')
else
TGLCompositeImage(Texture.Image).LoadFromFile(aFileName);
//TGLCompositeImage(Texture.Image).LoadFromFile(aFileName);
end;
Name := aMaterialName;
end;
end;
第二i添加onmouse移动过程
第一const的矢量颜色
const
OnMoveInObjects_Color: TColorVector = (0.243, 0.243, 0.243, 1.000);
OnOutObjects_Color: TColorVector = (0.000, 0.000, 0.000, 1.000);
创建对象
fsExit:= TGLHUDSprite.CreateAsChild(MainForm.Dummy_mainmenu);
fsExit.Material.MaterialLibrary:= MatLib;
fsExit.Material.LibMaterialName:= 'bexit';
fsExit.SetSquareSize(50);
fsExit.Position.X:= CenterX;
fsExit.Position.Y:= 30;
fsExit.Visible:= true;
然后程序
procedure Check_Mouse_UpPlayer(x,y:Integer);
var
sTVol: FLOAT;
begin
if MainForm.IsMouseOverImage(fsExit,x,y) then
begin
fsExit.Material.FrontProperties.Emission.Color:= OnMoveInObjects_Color;
if IsKeyDown(VK_LBUTTON) then
begin
fade_blur:= true;
ShowExit;
end;
end
else
fsExit.Material.FrontProperties.Emission.Color:= OnOutObjects_Color;
end;
这里是ismouseoverImage功能...
function TMainForm.IsMouseOverImage(const AButton: TGLHudSprite; const X, Y: Integer):Boolean;
begin
Result := (X >= AButton.Position.X - AButton.Width/2) and (X <= AButton.Position.X + AButton.Width/2) and
(Y >= AButton.Position.Y - AButton.Height/2) and (Y <= AButton.Position.Y + AButton.Height/2);
end;
现在,当鼠标移动到图像的材料改变emition颜色,但我不明白的结果...(我不看到任何东西)。
我做错了什么...?
谢谢...
也许我不把我的问题正确。 ..或者你不明白我在问什么......我不想把材料放到我想改变当前素材的表现颜色......所以在你的例子中我想改变'selected'材质。 emition.color to'unselected'meterial.emition.color不使用第二个材质...当鼠标结束时更改它...查看下面的例子“..” – azrael11
@ azrael11,请更具体地说明你在尝试什么实现。正如我已经告诉过你的,一旦你将matlib&Libmatname分配给HUDSprite,你可以把它看作是一种材料指针,从这个lib中指向特定的材质。它不会复制MatLib材质的信息,它实际上是“指向”它并使用它来代替它自己的内部材质。因此,如果您更改该材质的发光颜色,则使用该特定材质的所有对象也会改变颜色。 –
您的代码至少从上面共享的内容中可能无法工作,因为在将matlib和matlibname分配给对象之后,无论您在其内部应用的更改都被忽略。所以请更具体地说明你正在努力获得什么。我试图帮助这里,但我似乎并没有把握你的实际问题。我提出的解决方案(在matlib中使用两种材料并在它们之间切换)是最优雅,高效的内存,并且提供了最大的设计自由度。请告诉我你到底想要达到什么目标。 –