Step by Step,用JAVA做一個FLAPPYBIRD遊戲(三)

遊戲界面的滾動背景

上一篇我們講了如何製作開始菜單,開始菜單比較簡單,就只涉及了一個Entity,接下來幾篇,我們要一步步實現遊戲界面,對應的gameState爲GAME_STATE_PLAYING。
這一篇,我們先講滾動的背景是怎麼做到的。
FlappyBird從遊戲效果來說,算是一個橫板的卷軸遊戲。什麼叫橫板卷軸遊戲呢?比如馬里奧,就是隨着人物的移動,背景會不斷滾動變換,像是卷軸展開一樣的效果。
橫板卷軸遊戲的背景有一副很長的圖,事先繪製好之後,隨着人物的移動,移動背景圖,達到卷軸的效果。說到這裏大家可能有疑問了。FlappyBird這遊戲是沒有終點也沒有關卡一說的啊,那他的背景理論上是無限滾動的,永遠沒有盡頭,那麼要怎麼實現這樣的背景呢?其實,FlappyBird只有一副背景圖,但是確能做到背景無限滾動,這背後是有一個技巧的。
假如我們拿兩張背景圖橫着拼在一起,我們看看是什麼情況:

兩張背景圖拼接
發現了沒,這個背景圖設計的很巧妙,兩段正好是可以“無縫鏈接”的。其實我們就可以這樣一直連接下去,就能創造無限的背景圖了。具體在程序裏怎麼做呢?請看下面這張圖。
兩張背景交替進入屏幕

兩幅背景圖(其實都是同樣的圖)暫時叫BG1,BG2吧,兩張圖一起往右邊運動,當BG2的左側要離開屏幕的最右邊時把BG2再移回BG1開始的位置,這樣相當於又回到圖中的情況,開始下一次循環。

如果還是不理解,可以看下代碼:


public class Background {

    private final Image IMG_BG = new ImageIcon("images/bg.png").getImage();
    private int firstBgX=-IMG_BG.getWidth(null),secBgX=0;
    private int rollingSpeed = 6;

    public void draw(Graphics g) {
        g.drawImage(IMG_BG, firstBgX, 0, null);
        g.drawImage(IMG_BG, secBgX, 0, null);
    }

    public void logic() {
        firstBgX+=rollingSpeed;
        secBgX+=rollingSpeed;
        if(firstBgX==0) {
            secBgX = -IMG_BG.getWidth(null);
        }
        if(firstBgX==IMG_BG.getWidth(null)) {
            firstBgX = -IMG_BG.getWidth(null);
        }
    }

}

可以看到firstBgX也就是前面背景的x座標開始是在負的IMG_BG.WIDTH,rollingSpeed表示移動的速度,每一幀兩幅背景的x座標加上rollingSpeed,當firstBgX等於0,也就是第一張圖完全進入了屏幕,第二張圖完全離開了屏幕,此時,把第二張圖的x座標設置成負的IMG_BG.WIDTH,當第一張圖的x座標等於正的IMG_BG.WIDTH,也就是第一張圖完全移出了屏幕,第二張圖完全進入了屏幕,此時,再把第一張圖的x座標設置爲負的IMG_BG.WIDTH,即又回到了開始狀態,繼續循環下去。這樣我們就得到了無限滾動的背景。

看一下實現的效果:
滾動背景

小結

這一篇講了滾軸遊戲的背景滾動的特點,FlappyBird的背景圖設計的很巧妙,使我們只需要一幅圖就能做出無限滾動的背景圖片。
下一篇,我們要開始講我們的主角,小鳥的實現代碼,對應的Entity爲Bird。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章