|
橫向捲軸或縱向捲軸的遊戲大家應該有玩過,其背景其本身都很單調,例如一個星空不斷的移動,或是一個海洋,其實它
只使用到一張背景圖片不斷的播放而已,其製作的概念是將圖片的兩端接起來,然後像跑馬燈一樣不斷的捲動,所以背景就會循環播放,如下圖所示:

當然電腦上的圖片可無法像紙片一樣的「捲」起來,我們製作的方法是在播放區域超出圖片範圍時,從圖片後端剪下一段並補到播放畫面上,如下圖所示:

按照以上,只要稍微計算一下,就可以輕易的製作出捲動的效果,不過這邊要介紹一個投機但方便的方法,可以省下一些運算的成本,我們將背景圖
片複製為兩個,首先一張圖的繪製目標X1位置由0開始,另一張圖繪製目標位置X2由-ImageWidth開始,也就是在繪圖區域之外,其中
ImageWidth為圖片寬度,如下圖所示:

X1與X2都一直向右移動,所以圖片可以完美的播放,如果X1超過繪圖區域右緣了,就將X1設定為-ImageWidth,同樣的,如果X2超出繪圖區域
右緣,就將之再設定為-ImageWidth,如此循環不已,背景就可以不斷的播放了。
捲軸背景的基本工作原理還可以再變化一下,例如可以製作遠景與近景,遠景在螢幕上方更新,圖片更新速度較慢,而近景在螢幕下方更新,而更新速度較快,還有
如雲彩的行進等等,像這類的變化應用不少。
連結 示範星空背
景的捲軸播放,以下是示範程式:
package onlyfun.caterpillar.graphics.animation; import java.awt.*; import javax.swing.JApplet; public class ScrollBackground extends JApplet implements Runnable { private int appletWidth, appletHeight, imageWidth; private int x1, x2; private Image scrollImage, scrollImage2, offScreen; public void init() { appletWidth = getSize().width; appletHeight = getSize().height; //取得捲動畫面影像 MediaTracker mediaTracker = new MediaTracker(this); scrollImage = getImage(getDocumentBase(),"scroll.gif"); mediaTracker.addImage(scrollImage,0); try { mediaTracker.waitForAll(); } catch(InterruptedException e){} //複製捲動畫面影像 scrollImage2 = createImage(scrollImage.getSource()); offScreen = createImage(appletWidth, appletHeight); imageWidth = scrollImage.getWidth(this); x1 = 0; x2 = -imageWidth; } public void start() { (new Thread(this)).start(); } public void paint(Graphics g) { g.drawImage(offScreen, 0, 0, this); } public void update(Graphics g) { paint(g); } public void run() { Graphics gOffScreen = offScreen.getGraphics(); while(true) { gOffScreen.drawImage(scrollImage, x1, 0, this); gOffScreen.drawImage(scrollImage2, x2, 0, this); repaint(); try { Thread.sleep(33); } catch(InterruptedException e){ } //更新影像位置(產生捲動效果) if(x1 == appletWidth) x1 = -imageWidth; else x1++; if(x2 == appletWidth) x2 = -imageWidth; else x2++; } } }
|