私がやろうとしていること
複数のグラフィックスを Timage に描画しようとしています。描画するこれらのグラフィックスは、フードフィルと線を含む順序付けられたレイヤーで構成されています。順序付けとダブル バッファリングを確実にするために、複数のバッファを使用します。
私がしていること
procedure DrawScene();
var
ObjLength,LineLength,Filllength,Obj,lin,angle,i:integer;
Npoints : array[0..1] of Tpoint;
Objmap:TBitmap;
wholemap:TBitmap;
begin
wholemap := TBitmap.Create;
wholemap.Width:=area;
wholemap.height:=area;
ObjLength:=length(Objects);
for Obj:=0 to (ObjLength-1) do
if objects[Obj].Visible then
begin
// create object bitmap
if Objects[obj].Tag='FBOX' then
begin
Objmap := TBitmap.Create;
Objmap.Width:=area;
Objmap.height:=area;
Objmap.Transparent:=true;
Objmap.Canvas.Rectangle((objects[obj].Boundleft-4)+objects[obj].Position.x,area-((objects[obj].boundtop+4)+objects[obj].Position.y),(objects[obj].boundright+4)+objects[obj].Position.x,area-((objects[obj].boundbottom-4)+objects[obj].Position.y));
end;
//draw object
LineLength:=length(objects[Obj].Lines)-1;
angle:=objects[Obj].Rotation;
for lin:=0 to (LineLength) do
begin
for i:=0 to 1 do
begin
Npoints[i] := PointAddition(RotatePoint(objects[obj].Lines[lin].Point[i],angle),objects[obj].Position,false);
end;
Objmap:=DrawLine(Npoints[0].x,Npoints[0].y,Npoints[1].x,Npoints[1].y,objects[obj].Lines[lin].Color,Objmap);
end;
Filllength:=length(objects[Obj].Fills)-1;
for i:=0 to Filllength do
begin
Npoints[0]:=PointAddition(RotatePoint(objects[Obj].Fills[i].Point,objects[Obj].Rotation),objects[Obj].Position,false);
Objmap:=fillpoint( Npoints[0].x, Npoints[0].y,objects[Obj].Fills[i].color,Objmap);
end;
//write object to step frame
wholemap.Canvas.Draw(0,0,Objmap);
Objmap.Free;
end;
// write step frame to Visible Canvas
mainwindow.bufferim.Canvas.Draw(0,0,wholemap);
mainwindow.RobotArea.Picture.Graphic:=mainwindow.bufferim.Picture.Graphic;
wholemap.Free;
end;
私が期待すること
各画像オブジェクトが互いの上にレイヤー化され、各画像レイヤーがそのレイヤーの完全な画像になることを期待しています。私の例では、後ろに旗が付いたロボットです。最初に旗が描かれ、次にロボットが描かれます。
私が得るもの(PC上)
PC では、期待どおりの結果が得られ、すべてが正しいように見えます。
私が得るもの(ラップトップ上)
ほぼすべてのラップトップと一部の PC では、ロボットしか表示されません。フラグを描いているかどうかを確認するためにいくつかのステートメントを入れました。ゲームは正しい方法でフラグとやり取りすることさえできます。さらに調査したところ、「描画シーン」で描画された最後の画像のみが表示され、画像がキャンバス全体に直接描画されたときにすべてが表示されたことがわかりました(これは、塗りつぶしレイヤーが重なっている理由で実行できません)
私が考えていることは起こっている
だから私が推測したのは、TimageのTimage.transparentプロパティが機能していないか、一部のマシンで異なる方法で計算されているということです..
これを証明するためにテストを行い、キャンバスを赤くしました。次に、そのキャンバスに 0,0 i Timage でプロパティ transparent=true を描画し、赤いキャンバスの真ん中にドットを 1 つだけ配置しました。その結果、真ん中に点のある白いキャンバスができました。
非常に基本的なグラフィックス ドライバーを搭載したマシンは null または透明を白として扱い、より強力なマシンは null または透明を透明として扱うようであると推測しています。
Timage.Transparent プロパティが true であったため、これは少し失敗したようです。
編集:更新!!! ATI グラフィックス カードでは、色が「null」の場合、PF24bit の形式で解釈されるため、アルファ チャネルも透明度もありません。
Nvidia カードでは、PF32bit として取り、null を透明として扱います。
この問題を回避する明白な方法は、bitmaptype を PF32bit に設定することですが、それでもうまくいきません。次に、おそらくそれでは不十分であり、背景がnullのままではなく透明に設定されていることを確認する必要があると想定しました..しかし、Timage内にアルファで色を設定するためのツール(私が見ることができる)はありません. すべてのキャンバス描画関数は、RGB 24 ビットの Tcolor を必要とし、RGBA 32 ビットの TcolorRef のみが必要です....アルファ 0 で描画する方法はありますか?
私が知る必要があると思うこと
透明なプロパティをすべてのマシンで強制的に機能させる方法、またはラップトップを白として透明に貼り付けないようにする方法、または同じ結果を達成する方法。
誰にも解決策やアイデアはありますか?