首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

DelphiX 圖形旋轉繪製進階:DrawRotate 系列函數完整實戰

     編輯:Delphi

DelphiX 旋轉繪製函數家族概覽

DelphiX 的 TPictureCollectionItem 提供了豐富的旋轉繪製方法,支援透明度混合、加色/減色模式、Alpha 通道控制等進階效果。本文詳細解析所有 7 種旋轉繪製函數的參數、效果差異與實際應用場景。

七大旋轉繪製函數簽名對比

函數名稱混合模式額外參數典型用途
DrawRotate普通覆蓋無基本旋轉顯示
DrawRotateAdd加色混合無發光、光效、火焰、魔法特效
DrawRotateSub減色混合無陰影、遮罩、黑暗效果
DrawRotateAlphaAlpha 混合Alpha 值 (0-255)半透明旋轉、淡入淡出
DrawRotateAddCol加色 + 色調顏色值 (TColor)彩色光效、屬性攻擊特效
DrawRotateSubCol減色 + 色調顏色值 (TColor)彩色陰隱、狀態異常視覺化
DrawRotateAlphaColAlpha + 色調顏色值 (TColor)著色半透明、UI 圖示動態著色

統一參數說明

function DrawRotateX(
  Dest: TDirectDrawSurface;  // 目標繪圖表面
  X, Y: Integer;             // 旋轉中心在目標表面的座標
  Width, Height: Integer;    // 繪製寬高(可縮放)
  Pattern: Integer;          // 圖樣索引(動畫幀)
  CenterX, CenterY: Single;  // 旋轉中心相對圖片大小的比例 (0.0-1.0)
  Angle: Integer;            // 旋轉角度 (0-255,對應 0-360°)
  // 額外參數視具體函數而定
): Boolean;

關鍵參數解析:

  • Angle:0-255 映射 0°-360°,Angle = 32 ≈ 45°,Angle = 64 = 90°
  • CenterX, CenterY:0.0 為左/上邊緣,0.5 為中心,1.0 為右/下邊緣
  • Pattern:用於動畫圖集,指定要繪製的幀索引

完整範例程式:互動式旋轉效果展示

以下程式碼建立一個包含 7 個按鈕的視窗,每個按鈕對應一種旋轉繪製模式,即時預覽效果差異。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DXDraws, StdCtrls;

type
  TForm1 = class(TForm)
    DXDraw1: TDXDraw;
    DXImageList1: TDXImageList;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  Angle = 32;  // 對應 45°
  BgColor = $777777;  // 背景灰色

var
  PicItem: TPictureCollectionItem;

procedure TForm1.FormCreate(Sender: TObject);
const
  ImgPath1 = 'C:\Temp\DelphiX.bmp';  // 請確保圖片存在
begin
  // 關聯 DXDraw 與 ImageList
  DXImageList1.DXDraw := DXDraw1;
  
  // 添加圖片到集合
  PicItem := TPictureCollectionItem(DXImageList1.Items.Add);
  PicItem.Picture.LoadFromFile(ImgPath1);
  
  // 設定按鈕標題
  Button1.Caption := 'DrawRotateAdd (加色)';
  Button2.Caption := 'DrawRotateSub (減色)';
  Button3.Caption := 'DrawRotateAlpha (Alpha)';
  Button4.Caption := 'DrawRotateAddCol (加色+著色)';
  Button5.Caption := 'DrawRotateSubCol (減色+著色)';
  Button6.Caption := 'DrawRotateAlphaCol (Alpha+著色)';
  Button7.Caption := 'DrawRotate (原始)';
end;

// 通用繪製邏輯
procedure DrawRotated(DrawMethod: Integer);
begin
  DXDraw1.Surface.Fill(BgColor);
  case DrawMethod of
    1: PicItem.DrawRotateAdd(DXDraw1.Surface,
         DXDraw1.Width div 2, DXDraw1.Height div 2,
         PicItem.Width, PicItem.Height, 0, 0.5, 0.5, Angle);
    2: PicItem.DrawRotateSub(DXDraw1.Surface,
         DXDraw1.Width div 2, DXDraw1.Height div 2,
         PicItem.Width, PicItem.Height, 0, 0.5, 0.5, Angle);
    3: PicItem.DrawRotateAlpha(DXDraw1.Surface,
         DXDraw1.Width div 2, DXDraw1.Height div 2,
         PicItem.Width, PicItem.Height, 0, 0.5, 0.5, Angle, 128);
    4: PicItem.DrawRotateAddCol(DXDraw1.Surface,
         DXDraw1.Width div 2, DXDraw1.Height div 2,
         PicItem.Width, PicItem.Height, 0, 0.5, 0.5, Angle, clYellow);
    5: PicItem.DrawRotateSubCol(DXDraw1.Surface,
         DXDraw1.Width div 2, DXDraw1.Height div 2,
         PicItem.Width, PicItem.Height, 0, 0.5, 0.5, Angle, clYellow);
    6: PicItem.DrawRotateAlphaCol(DXDraw1.Surface,
         DXDraw1.Width div 2, DXDraw1.Height div 2,
         PicItem.Width, PicItem.Height, 0, 0.5, 0.5, Angle, clYellow);
    7: PicItem.DrawRotate(DXDraw1.Surface,
         DXDraw1.Width div 2, DXDraw1.Height div 2,
         PicItem.Width, PicItem.Height, 0, 0.5, 0.5, Angle);
  end;
  DXDraw1.Flip;
end;

procedure TForm1.Button1Click(Sender: TObject); begin DrawRotated(1); end;
procedure TForm1.Button2Click(Sender: TObject); begin DrawRotated(2); end;
procedure TForm1.Button3Click(Sender: TObject); begin DrawRotated(3); end;
procedure TForm1.Button4Click(Sender: TObject); begin DrawRotated(4); end;
procedure TForm1.Button5Click(Sender: TObject); begin DrawRotated(5); end;
procedure TForm1.Button6Click(Sender: TObject); begin DrawRotated(6); end;
procedure TForm1.Button7Click(Sender: TObject); begin DrawRotated(7); end;

end.

DFM 視窗定義

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'DelphiX 旋轉繪製效果展示'
  ClientHeight = 226
  ClientWidth = 356
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object DXDraw1: TDXDraw
    Left = 8
    Top = 8
    Width = 225
    Height = 211
    AutoInitialize = True
    AutoSize = True
    Color = clBlack
    Display.FixedBitCount = False
    Display.FixedRatio = True
    Display.FixedSize = True
    Options = [doAllowReboot, doWaitVBlank, doCenter, do3D, doDirectX7Mode, doHardware, doSelectDriver]
    SurfaceHeight = 211
    SurfaceWidth = 225
    TabOrder = 0
    Traces = <>
  end
  object Button1: TButton
    Left = 239
    Top = 8
    Width = 112
    Height = 25
    Caption = 'Button1'
    TabOrder = 1
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 239
    Top = 39
    Width = 112
    Height = 25
    Caption = 'Button2'
    TabOrder = 2
    OnClick = Button2Click
  end
  object Button3: TButton
    Left = 239
    Top = 70
    Width = 112
    Height = 25
    Caption = 'Button3'
    TabOrder = 3
    OnClick = Button3Click
  end
  object Button4: TButton
    Left = 239
    Top = 101
    Width = 112
    Height = 25
    Caption = 'Button4'
    TabOrder = 4
    OnClick = Button4Click
  end
  object Button5: TButton
    Left = 239
    Top = 132
    Width = 112
    Height = 25
    Caption = 'Button5'
    TabOrder = 5
    OnClick = Button5Click
  end
  object Button6: TButton
    Left = 239
    Top = 163
    Width = 112
    Height = 25
    Caption = 'Button6'
    TabOrder = 6
    OnClick = Button6Click
  end
  object Button7: TButton
    Left = 239
    Top = 194
    Width = 112
    Height = 25
    Caption = 'Button7'
    TabOrder = 7
    OnClick = Button7Click
  end
  object DXImageList1: TDXImageList
    Left = 192
    Top = 16
  end
end

混合模式視覺效果解析

DrawRotate (普通)

直接覆蓋像素,不透明像素完全遮蓋背景。適合一般精靈顯示、UI 元素。

DrawRotateAdd (加色)

公式:Result = Src + Dest(飽和到 255)。亮部疊加變更亮,產生發光感。適合火焰、爆炸、魔法光環、雷電特效。

DrawRotateSub (減色)

公式:Result = Dest - Src(下限 0)。暗部疊加變更暗,產生陰影感。適合陰影投射、黑暗氣氛、遮罩效果。

DrawRotateAlpha (Alpha混合)

公式:Result = Src * Alpha + Dest * (1-Alpha)。支援 0-255 階透明度。適合淡入淡出、半透明 UI、煙霧、水面倒影。

DrawRotateAddCol (加色著色)

先將圖片著色為指定顏色,再進行加色混合。適合屬性攻擊特效(火/冰/電/毒)、道具稀有度光環。

DrawRotateAlphaCol (Alpha著色)

著色後進行 Alpha 混合。適合動態 UI 圖示著色、角色裝備染色預覽、血條/法力條顏色漸變。

進階技巧:動畫旋轉與效能優化

1. 幀率無關的平滑旋轉

procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
var
  DeltaTime: Single;
begin
  // 使用高精度計時器計算時間差
  DeltaTime := DXTimer1.ElapsedTime / 1000.0; // 秒
  
  // 每秒旋轉 90 度 (256/4 = 64 単位/秒)
  Angle := (Angle + Round(64 * DeltaTime)) mod 256;
  
  DXDraw1.Surface.Fill(0);
  PicItem.DrawRotate(DXDraw1.Surface,
    DXDraw1.Width div 2, DXDraw1.Height div 2,
    PicItem.Width, PicItem.Height, 0, 0.5, 0.5, Angle);
  DXDraw1.Flip;
end;

2. 批次繪製優化

若需繪製大量旋轉精靈(如粒子系統),建議:

  • 預先計算正弦/餘弦查找表(Sin256/Cos256)
  • 使用 TDXSpriteEngine 管理精靈生命週期
  • 合併相同材質的繪製呼叫,減少狀態切換
  • 考慮使用 Direct3D 介面 (TD2D) 獲得硬體加速

3. 記憶體管理注意事項

// 正確釋放資源
procedure TForm1.FormDestroy(Sender: TObject);
begin
  // DXImageList 會自動管理 Items 的生命週期
  // 但若手動創建 TPictureCollectionItem 需自行釋放
  if Assigned(PicItem) then
    PicItem.Free; // 實際上由 Items 集合管理,通常不需手動 Free
  
  DXImageList1.DXDraw := nil; // 解除關聯
end;

常見問題排查

問題可能原因解決方案
圖片不顯示/全黑透明色設定錯誤檢查 TransparentColor 與 Transparent 屬性
旋轉中心偏移CenterX/Y 設定不當圖片中心為 (0.5, 0.5),角落為 (0,0) 或 (1,1)
Angle 參數無效果數值超出 0-255 範圍使用 Angle mod 256 確保範圍正確
加色效果不明顯背景過亮或圖片無亮部確保背景較暗,圖片包含高亮像素
AlphaCol 著色異常圖片非灰度/白色基底著色基底建議使用白色或灰度圖片

總結

DelphiX 的 DrawRotate 系列函數為 2D 遊戲開發提供了強大的旋轉繪製能力。掌握 7 種混合模式的特性與適用場景,配合 TDXTimer 實現幀率無關的平滑動畫,能輕鬆創建專業級的視覺特效。建議開發者根據具體需求選擇合適的混合模式,並注意效能優化與資源管理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved