Java Applet 曾是網頁豐富客戶端的代表,現今 Flash/Silverlight 已退場,WebAssembly 成主流。但 .NET 仍可透過舊版 <object> 標籤載入 WinForms 控制項於網頁(需客戶端安裝 .NET Framework),本文以彈跳球動畫為例展示基本原理,**僅供教學娛樂,生產環境請勿使用**。
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Threading;
using System.Windows.Forms;
namespace BallGame
{
public class BallControl : Control
{
private Rectangle ballRegion = new Rectangle(0, 0, 50, 50);
private Thread drawThread;
private Image offscreenImage;
private int speedX = 4, speedY = 6;
public BallControl()
{
ClientSize = new Size(200, 300);
BackColor = Color.Gray;
drawThread = new Thread(Run) { IsBackground = true };
drawThread.Start();
}
protected override void OnPaint(PaintEventArgs e)
{
if (offscreenImage != null)
e.Graphics.DrawImage(offscreenImage, 0, 0);
}
private void Run()
{
while (true)
{
offscreenImage = new Bitmap(ClientSize.Width, ClientSize.Height);
using (Graphics g = Graphics.FromImage(offscreenImage))
{
g.FillEllipse(Brushes.Blue, ballRegion);
}
if (ballRegion.X <= 0 || ballRegion.Right >= ClientSize.Width)
speedX = -speedX;
if (ballRegion.Y <= 0 || ballRegion.Bottom >= ClientSize.Height)
speedY = -speedY;
ballRegion.X += speedX;
ballRegion.Y += speedY;
Invalidate(); // 觸發重繪
Thread.Sleep(30); // 約 33 FPS
}
}
}
}
Bitmap + Graphics.FromImage,再於 OnPaint 一次繪製,消除閃爍。IsBackground = true 隨應用程式結束自動終止。OnPaint。Rectangle.Right/Bottom 簡化碰撞邏輯。<object id="ballCtrl" classid="http:BallGame.dll#BallGame.BallControl"
width="200" height="300"></object>
雖然 WinForms 網頁控制項已成歷史,但雙重緩衝、多執行緒繪圖、碰撞檢測等核心技術在現代遊戲開發、即時視覺化應用中依然通用。建議改用 Blazor 或 Web 標準技術實作同類效果。