首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 結合 Ming 函式庫動態生成 Flash 動畫:從入門到實戰

     編輯:PHP 綜合知識

前言

Ming 是一個用 C 撰寫的開源函式庫,讓 PHP 能以程式化方式生成 SWF (Flash) 檔案。雖然 Flash 已退出歷史舞台,但 Ming 的設計理念——伺服器端程式化向量圖形/動畫生成——在現代 Web 開發中仍有啟發價值(如動態 SVG、Canvas、PDF、圖表生成)。本文記錄 Ming 的安裝、核心物件模型、完整範例與遷移建議。

安裝與環境需求

  • PHP 版本:PHP 4.0.5+ 內建實驗性支援;PHP 5/7/8 需安裝 PECL 擴充:pecl install ming
  • 系統相依:libming、freetype、libpng、zlib
  • 驗證安裝:php -m | grep ming 或 php -r "echo 'Ming version: ' . ming_version();"
  • 官方資源:libming.org、PHP 手冊

核心物件模型

類別用途關鍵方法
SWFMovie動畫主容器,對應 _rootsetDimension(), setRate(), add(), output(), save(), nextFrame()
SWFShape向量圖形(線條、填滿、曲線)addFill(), setRightFill(), movePenTo(), drawLine(), drawCurve()
SWFSprite動畫剪輯add(), nextFrame(), setFrames(), add(SWFAction)
SWFButton互動按鈕(四態:Up/Over/Down/Hit)addShape(), addAction()
SWFText / SWFTextField文字顯示/輸入欄位setFont(), setHeight(), addString()
SWFFont字體載入(支援 .fdb、.ttf 轉換)__construct()
SWFActionActionScript 位元組碼封裝__construct($script)
SWFBitmap / SWFGradient位圖填滿/漸層填滿__construct()
SWFMorph形狀變形動畫getShape1(), getShape2()
SWFDisplayItem場景中的顯示實例(由 add() 回傳)moveTo(), rotate(), scale(), setDepth(), setName()

完整範例:旋轉方塊 + 互動按鈕

<?php
// ming_demo.php
// 1. 建立圖形:藍色正方形
$square = new SWFShape();
$fill = $square->addFill(0, 0, 0xFF); // RGB 藍
$square->setRightFill($fill);
$square->movePenTo(-50, -50);
$square->drawLineTo(50, -50);
$square->drawLineTo(50, 50);
$square->drawLineTo(-50, 50);
$square->drawLineTo(-50, -50);

// 2. 建立 Sprite(動畫剪輯)並加入旋轉腳本
$sprite = new SWFSprite();
$item = $sprite->add($square);
$item->setDepth(1);
$sprite->setFrames(24); // 總幀數

// 幀 1:停止
$sprite->add(new SWFAction("stop();"));

// 幀 2~24:每幀旋轉 -15 度
for ($i = 0; $i < 23; $i++) {
    $item->rotate(-15);
    $sprite->nextFrame();
}
// 最後一幀:播放(循環)
$sprite->add(new SWFAction("play();"));

// 3. 建立按鈕(四態不同顏色)
function makeRect($r, $g, $b) {
    $s = new SWFShape();
    $s->setRightFill($s->addFill($r, $g, $b));
    $s->drawLine(100, 0);
    $s->drawLine(0, 40);
    $s->drawLine(-100, 0);
    $s->drawLine(0, -40);
    return $s;
}

$btn = new SWFButton();
$btn->addShape(makeRect(0xFF, 0, 0), SWFBUTTON_UP | SWFBUTTON_HIT);    // 紅:預設/點擊區
$btn->addShape(makeRect(0, 0xFF, 0), SWFBUTTON_OVER);                    // 綠:滑鼠懸停
$btn->addShape(makeRect(0, 0, 0xFF), SWFBUTTON_DOWN);                    // 藍:按下
// 點擊動作:控制名為 "box" 的 Sprite 跳到第 2 幀播放
$btn->addAction(new SWFAction('setTarget("/box"); gotoAndPlay(2);'), SWFBUTTON_MOUSEDOWN);

// 4. 建立主動畫
$movie = new SWFMovie();
$movie->setDimension(400, 300); // 寬、高
$movie->setRate(12);            // 幀率
$movie->setBackground(0xFF, 0xFF, 0xFF); // 白色背景

// 加入 Sprite,命名為 "box"
$boxItem = $movie->add($sprite);
$boxItem->setDepth(2);
$boxItem->moveTo(200, 150);
$boxItem->setName("box");

// 加入按鈕
$btnItem = $movie->add($btn);
$btnItem->setDepth(3);
$btnItem->moveTo(150, 250);

// 5. 輸出 SWF
header('Content-Type: application/x-shockwave-flash');
$movie->output();
// 亦可存檔:$movie->save('demo.swf');
?>

進階應用場景

1. 動態圖表生成

根據資料庫數據繪製長條圖、圓餅圖、折線圖,輸出 SWF 供舊版瀏覽器顯示,或轉換為 PNG(需搭配 swftools 的 swfrender)。

2. 個性化證書/名片

合併背景模板、使用者姓名、編號、QR Code,即時生成可列印的 SWF/PDF。

3. 遊戲資產預渲染

將向量圖形預先渲染為 SWF,減少客戶端運算量。

從 Ming 遷移到現代技術棧

由於 Flash Player 於 2020 年底停止支援,新專案不建議使用 Ming 生成 SWF。以下是現代替代方案對照:

Ming 功能現代替代方案PHP 整合方式
向量圖形繪製SVG (XML 格式)直接拼接字串、XMLWriter、Sabberworm\CSS、vgcross/svg-builder
動畫/互動CSS Animation / Web Animations API / Canvas / GSAPPHP 生成 JSON 設定,前端渲染
動態圖表Chart.js, ApexCharts, ECharts, HighchartsPHP 提供資料 API,前端圖表庫渲染
PDF 生成Dompdf, TCPDF, Snappy (wkhtmltopdf), mPDFComposer 安裝,PHP 直接生成 PDF
圖片處理GD, ImageMagick (Imagick), Intervention Image內建/PECL 擴充
字體處理Freetype (Imagick), 瀏覽器 @font-faceCSS 載入 Web Font

遷移範例:SVG 替代 SWF

<?php
// svg_demo.php - 產生等效的 SVG
$width = 400; $height = 300;
$cx = 200; $cy = 150; $size = 50;

header('Content-Type: image/svg+xml');
echo '';
?>

  
  
  
    
      
    
  
  
  
    
    控制
  
  

結語

Ming 是 PHP 歷史上將程式碼轉化為多媒體內容的先驅嘗試。雖然 SWF 格式已成歷史,但「伺服器端宣告式圖形/動畫生成」的思維在 SVG、Canvas、PDF、甚至 WebGL 伺服器端渲染中延續。理解 Ming 的物件模型(Movie、Shape、Sprite、Action、DisplayItem)有助於掌握現代圖形庫的設計模式。維護舊專案時可續用 Ming;新專案請直接擁抱 HTML5 標準技術棧。

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