Android Canvas打飛機之讓背景動起來

前面已經(jīng)了解過<a href="http://www.reibang.com/p/05aa77075fe5">SurfaceView</a>了,今天這里就直接開始通過Canvas來實現(xiàn)繪圖相關的東西蹬竖,我這里主要就是通過實現(xiàn)一個游戲來完成Canvas的學習。

<b>1.創(chuàng)建一個GameView的類并且繼承SurfaceView灰伟。</b>

Paste_Image.png

<b>2.創(chuàng)建一個管理游戲背景的類DrawBackground</b>

package com.tangyx.game.holder;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;

import com.tangyx.game.util.BitmapUtils;
import com.tangyx.game.util.ScreenUtils;

/**
 * Created by tangyx on 2016/12/22.
 *
 */

public class DrawBackground extends DrawGame {

    private Bitmap mBackgroundTop;
    private Bitmap mBackgroundBottom;
    /**
     * 因為背景是全屏的呆奕,并且飛機是一直在往上運動,所以X坐標不需要運動偏窝,只需要改變y的坐標來完成運動效果
     */
    private float mTopY;
    private float mBottomY;
    /**
     * 背景移動速度
     */
    private float mSpeedBY=4;

    public DrawBackground(Context context,String background){
        super(context);
        //加載背景圖片
        mBackgroundBottom = BitmapUtils.ReadBitMap(context,background);
        //把背景圖大小設置為手機屏幕大小
        mBackgroundBottom = BitmapUtils.getBitmap(getContext(), mBackgroundBottom,0);
        //把背景圖在垂直翻轉生成一張新的圖片
        mBackgroundTop = BitmapUtils.getScaleMap(mBackgroundBottom);
    }

    @Override
    void initialize() {
        mBottomY = 0;
        /**
         * 第一張背景放在屏幕的頂部外面
         */
        mTopY = -ScreenUtils.getScreenHeight(getContext());
        mSpeedBY=4;
    }

    @Override
    void onDraw(Canvas canvas) {
        //背景是一張圖片收恢,所以我們應該通過canvas的drawBitmap來實現(xiàn),
        // 景的圖片其實一直是一張圖片在由上至下運動祭往,通過兩張圖片鏈接進行循環(huán)
        canvas.drawBitmap(mBackgroundBottom,0, mBottomY,mPaint);
        canvas.drawBitmap(mBackgroundTop,0, mTopY,mPaint);
    }

    @Override
    void updateGame() {
        mBottomY +=mSpeedBY;
        mTopY +=mSpeedBY;
        //當mBackgroundBottom已經(jīng)移動出屏幕就自動設置到屏幕之外的最頂部伦意。
        if(mBottomY >= ScreenUtils.getScreenHeight(getContext())){
            mBottomY = -ScreenUtils.getScreenHeight(getContext());
        }
        //mBackgroundTop已經(jīng)移動出屏幕就自動設置到屏幕之外的最頂部。
        if(mTopY >= ScreenUtils.getScreenHeight(getContext())){
            mTopY = -ScreenUtils.getScreenHeight(getContext());
        }
    }
}

它繼承了DrawGame硼补,這是我自定義的一個抽象類驮肉,因為后面可能不會的內容都需要繼承它來進行規(guī)范管理。

package com.tangyx.game.holder;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;

/**
 * Created by tangyx on 2016/12/22.
 *
 */

public abstract class DrawGame {

    private Context mContext;
    protected Paint mPaint;

    public DrawGame(Context context) {
        this.mContext = context;
        mPaint = new Paint();
        mPaint.setColor(Color.WHITE);
        initialize();
    }

    /**
     * 初始化內容
     */
    abstract void initialize();

    /**
     * 繪制內容
     * @param canvas
     */
    abstract void onDraw(Canvas canvas);

    /**
     * 數(shù)據(jù)更新
     */
    abstract void updateGame();

    public Context getContext() {
        return mContext;
    }
}

<b>3.說一下游戲背景的實現(xiàn)的思路:</b>
通過選擇的場景在DrawBackground中加載得到一個圖片的對象mBackgroundBottom已骇,然后再通過getScaleMap得到mBackgroundBottom垂直翻轉的新對象mBackgroundTop离钝,getScaleMap在BitmapUtils工具類中。

初始化這兩張圖片的位置褪储,整個屏幕的可見區(qū)域卵渴,肯定只能顯示一張圖片(mBackgroundBottom),那另一張呢(mBackgroundTop)鲤竹?由于飛機的感覺是一直向上飛行的感覺浪读,所以地圖應該一直感覺在往下運動,我們就需要去改變兩種圖片在surface中Y的坐標實現(xiàn)動畫效果宛裕,所以另一張圖片就在屏幕頂部的最上方瑟啃。

通過updateGame去增加Y的坐標,判斷哪一張圖片移動到屏幕之外了就立刻移動到屏幕最頂部的上方揩尸。通過這樣的邏輯就能實現(xiàn)地圖無限循環(huán)蛹屿。

<b>在GameView中使用</b>

Paste_Image.png
Paste_Image.png
Paste_Image.png
background.gif

最后附上<a >源碼</a>

再次重復一下,學習Canvas有一定的過程岩榆,源碼是通過git持續(xù)更新错负,如果有什么不太明白,你可以查看前面的文章勇边。

下一節(jié)將會講解主角的邏輯以及手勢控制犹撒,如果你也喜歡就一起來學習吧。

<b>學習是生活的一種態(tài)度</b>

<a href="http://www.reibang.com/p/05aa77075fe5">上一篇</a> <a href="http://www.reibang.com/p/8b65e7e73f70">下一篇</a>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末粒褒,一起剝皮案震驚了整個濱河市识颊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖祥款,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件清笨,死亡現(xiàn)場離奇詭異,居然都是意外死亡刃跛,警方通過查閱死者的電腦和手機抠艾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桨昙,“玉大人检号,你說我怎么就攤上這事⊥芾遥” “怎么了齐苛?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長桂塞。 經(jīng)常有香客問我脸狸,道長,這世上最難降的妖魔是什么藐俺? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮泥彤,結果婚禮上欲芹,老公的妹妹穿的比我還像新娘。我一直安慰自己吟吝,他們只是感情好菱父,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剑逃,像睡著了一般浙宜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛹磺,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天粟瞬,我揣著相機與錄音,去河邊找鬼萤捆。 笑死裙品,一個胖子當著我的面吹牛,可吹牛的內容都是我干的俗或。 我是一名探鬼主播市怎,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辛慰!你這毒婦竟也來了区匠?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤帅腌,失蹤者是張志新(化名)和其女友劉穎驰弄,沒想到半個月后麻汰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡揩懒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年什乙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片已球。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡臣镣,死狀恐怖,靈堂內的尸體忽然破棺而出智亮,到底是詐尸還是另有隱情忆某,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布阔蛉,位于F島的核電站弃舒,受9級特大地震影響,放射性物質發(fā)生泄漏状原。R本人自食惡果不足惜聋呢,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颠区。 院中可真熱鬧削锰,春花似錦、人聲如沸毕莱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朋截。三九已至蛹稍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間部服,已是汗流浹背唆姐。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留饲宿,地道東北人厦酬。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像瘫想,于是被迫代替她去往敵國和親仗阅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內容