繼「滿天星」繪圖練習後,本文實現經典「滾雪球」動畫:小球從頂部下落到底部後重置循環。核心涉及 重繪機制 與 多線程動畫循環 兩大知識點。
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Panel;
public class SnowBall {
public static void main(String[] args) {
Frame frame = new Frame();
frame.setBackground(Color.BLACK);
frame.setSize(1024, 768);
MyPanel myPanel = new MyPanel();
frame.add(myPanel);
Thread thread = new Thread(myPanel);
thread.start();
frame.show();
}
}
class MyPanel extends Panel implements Runnable {
int x = 120;
int y = 10;
@Override
public void paint(Graphics g) {
g.setColor(Color.WHITE);
g.fillOval(x, y, 20, 20);
}
@Override
public void run() {
while (true) {
y++;
if (y > 768) { y = 0; }
repaint(); // 觸發重繪
// 關鍵:線程休眠控制幀率,否則CPU跑太快導致動畫不可見
try { Thread.sleep(10); }
catch (InterruptedException e) { e.printStackTrace(); }
}
}
}
repaint() 觸發系統調用 paint(),實現幀更新Thread.sleep(10) 限制約 100 FPS,否則動畫過快人眼無法捕捉y > 768 重置實現循環下落效果Runnable 作為動畫執行單元⚠️ 忘記 sleep 會導致 CPU 100% 佔用且動畫不可見 —— 初學者最易忽略的關鍵行
此例為 Java GUI 入門奠定基礎,後續可擴展碰撞檢測、多球體管理、鍵盤/鼠標交互等遊戲開發核心功能。