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

DelphiX 教學 (18):TDirectDrawSurface 繪圖指令大全 - 從 Draw 到 DrawWave 進階特效

     編輯:Delphi

TDXDraw 本身不具備繪圖功能,但其核心屬性 Surface (型別為 TDirectDrawSurface) 提供了極其豐富的繪圖指令集,遠超 TPictureCollectionItem。本文系統整理所有 TDirectDrawSurface 繪圖方法並說明核心差異:繪圖來源必須是另一個已繪製好的 TDirectDrawSurface。

繪圖指令完整分類

類別方法功能特色
基礎繪製Draw基本位元複製,支援來源矩形裁剪
StretchDraw縮放繪製,目標矩形可異於來源尺寸
DrawRotate旋轉繪製,支援中心點旋轉角度
混合模式DrawAlphaAlpha 混合 (半透明)
DrawAdd加法混合 (發光/高光)
DrawSub減法混合 (陰影/變暗)
DrawAddCol加法混合 + 色彩調整
DrawAlphaColAlpha 混合 + 色彩調整
DrawSubCol減法混合 + 色彩調整
旋轉進階DrawRotateAdd旋轉 + 加法混合
DrawRotateAlpha旋轉 + Alpha 混合
DrawRotateSub旋轉 + 減法混合
DrawRotateAddCol旋轉 + 加法混合 + 色彩調整
DrawRotateAlphaCol旋轉 + Alpha 混合 + 色彩調整
DrawRotateCol旋轉 + 色彩調整
DrawRotateSubCol旋轉 + 減法混合 + 色彩調整
波浪變形DrawWaveX水平正弦波變形
DrawWaveXAdd水平波浪 + 加法混合
DrawWaveXAlpha水平波浪 + Alpha 混合
DrawWaveXSub水平波浪 + 減法混合
DrawWaveY垂直正弦波變形
DrawWaveYAdd垂直波浪 + 加法混合
DrawWaveYAlpha垂直波浪 + Alpha 混合
DrawWaveYSub垂直波浪 + 減法混合

核心差異:來源表面機制

  • TPictureCollectionItem 方法直接從影像列表物件繪製。
  • TDirectDrawSurface 方法**來源必須是另一個 TDirectDrawSurface**,需先將圖片載入/繪製到來源表面,再繪製到目標表面 (通常是 DXDraw1.Surface)。

基礎應用範例:建立中介表面繪製

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;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  PicItem: TPictureCollectionItem;

procedure TForm1.FormCreate(Sender: TObject);
const
  ImgPath1 = 'C:\Temp\DelphiX.bmp';
begin
  DXImageList1.DXDraw := DXDraw1;
  PicItem := TPictureCollectionItem(DXImageList1.Items.Add);
  PicItem.Picture.LoadFromFile(ImgPath1);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MySurface: TDirectDrawSurface;
begin
  MySurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
  try
    PicItem.Restore;  // 重置圖片狀態 (重要!)
    MySurface.SetSize(PicItem.Width, PicItem.Height);
    MySurface.Fill(0);
    { 從 PicItem 繪製到中介表面 MySurface }
    PicItem.Draw(MySurface, 0, 0, 0);
    
    { 從中介表面繪製到主表面 (置中顯示) }
    DXDraw1.Surface.Fill(0);
    DXDraw1.Surface.Draw(
      (DXDraw1.Width - MySurface.Width) div 2,
      (DXDraw1.Height - MySurface.Height) div 2,
      MySurface
    );
    DXDraw1.Flip;
  finally
    FreeAndNil(MySurface);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  MySurface: TDirectDrawSurface;
  m, n: Integer;
begin
  m := 40; n := 15;
  MySurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
  try
    PicItem.Restore;
    MySurface.SetSize(PicItem.Width, PicItem.Height);
    MySurface.Fill(0);
    PicItem.Draw(MySurface, 0, 0, 0);
    
    DXDraw1.Surface.Fill(0);
    { 使用來源矩形裁剪繪製 (切掉邊框) }
    DXDraw1.Surface.Draw(
      (DXDraw1.Width - MySurface.Width) div 2 + m,
      (DXDraw1.Height - MySurface.Height) div 2 + n,
      Bounds(m, n, MySurface.Width - m*2, MySurface.Height - n*2),
      MySurface
    );
    DXDraw1.Flip;
  finally
    FreeAndNil(MySurface);
  end;
end;

end.

執行效果

TDirectDrawSurface 繪圖指令基礎應用效果

進階特效應用建議

  1. 波浪特效:DrawWaveX/Y 系列適合水面倒影、熱氣擾動、魔法護盾等動態變形效果。
  2. 旋轉混合:DrawRotateAlpha 是實現旋轉半透明精靈 (如旋轉光標、彈幕) 的標準方法。
  3. 色彩調整:Col 後綴方法可實現著色、變色、淡入淡出等效果,無需準備多張圖片。
  4. 效能優化:複雜混合模式可能回退軟體渲染,大量精靈建議分批次渲染或預先烘焙到靜態表面。

開發關鍵提醒

  • 來源表面準備:所有繪圖前必須確保來源 TDirectDrawSurface 已正確建立並包含有效像素資料。
  • PicItem.Restore:從 TPictureCollectionItem 繪製到表面前務必呼叫 Restore,否則可能受之前 PatternWidth/Height 等設定影響導致繪製異常。
  • 座標系統:所有座標均為表面相對座標 (0,0 為左上角),需自行處理螢幕座標轉換。

TDirectDrawSurface 的繪圖指令集是 DelphiX 2D 渲染的核心引擎,掌握其分類與組合方式,可實現媲美現代引擎的豐富視覺效果。

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