TDIB.InitLight 與 DrawLights 結合實現 2D 動態點光源效果,支援多光源、光暈大小、顏色與衰減控制。本文提供滑鼠追蹤單一光源的即時互動範例。

unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DIB, StdCtrls;
type
TForm1 = class(TForm)
DXPaintBox1: TDXPaintBox;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure DXPaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
end;
var Form1: TForm1;
implementation {$R *.dfm}
var dib: TDIB;
procedure TForm1.DXPaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var a: TLightArray;
begin
DXPaintBox1.DIB.Assign(dib); // 重置基礎圖
SetLength(a, 1); // 單一光源陣列
a[0].X := X; a[0].Y := Y; // 光源位置跟隨滑鼠
a[0].Size1 := 4; a[0].Size2 := 4; // 內/外半徑
a[0].Color := clWhite; // 光源顏色
DXPaintBox1.DIB.InitLight(1, 1); // 初始化光照引擎
DXPaintBox1.DIB.DrawLights(a, clBlack); // 繪製光照(環境光黑)
DXPaintBox1.Repaint;
end;
procedure TForm1.FormCreate(Sender: TObject);
const ImgPath1 = 'C:\Temp\DX.jpg';
begin
dib := TDIB.Create;
dib.LoadFromFile(ImgPath1);
DXPaintBox1.DIB.Assign(dib);
DXPaintBox1.Width := dib.Width;
DXPaintBox1.Height := dib.Height;
DXPaintBox1.Repaint;
end;
procedure TForm1.FormDestroy(Sender: TObject); begin dib.Free; end;
end.
| 欄位 | 類型 | 說明 |
|---|---|---|
| X, Y | Integer | 光源中心座標 |
| Size1 | Integer | 核心半徑(全亮區域) |
| Size2 | Integer | 外緣半徑(衰減到 0 區域) |
| Color | TColor | 光源顏色(RGB 分量獨立計算) |
InitLight(AmbientR, AmbientG, AmbientB) 或 InitLight(AmbientColor, Intensity):初始化環境光與強度DrawLights(LightArray, AmbientColor):根據光源陣列計算光照並混合到 DIBAssign 回原圖,再重新計算光照(非累加)SetLength(a, N) 定義多個光源,如火把、法術特效、車燈Color := RGB(r,g,b) 實現紅/綠/藍氛圍燈X,Y,Size1,Size2 產生脈動、閃爍、移動效果