【讀書筆記《Android游戲編程之從零開始》】10.游戲開發基礎(View 游戲框架)


對於玩家來說,游戲是動態的;對於游戲開發人員來說,游戲是靜態的,只是不停地播放不通的畫面,讓玩家看到了動態的效果。

進入Android之前,首先要熟悉三個重要的類:View(視圖)、Canvas(畫布)、Paint(畫筆)。通過畫筆,可以在畫布上畫出各種精彩的圖形、圖片等等,然后通過視圖可以將畫布上的內容展現在手機屏幕上。

其次要熟悉“刷屏”的概念。繪制在畫布中的圖像不管是圖片還是圖形,都是靜態的,只有通過不斷的展現不同的畫布,才能實現動態的效果。在手機上,畫布永遠只是一張,所以不可能通過不斷地播放不同的畫布來實現動態效果,這時就需要對畫布進行刷新來實現動態效果。

刷新畫布如同使用一塊橡皮擦,擦去之前畫布上的所有內容,然后重新繪制畫布,如此反復,形成動態效果,而擦拭畫布的過程則稱為刷屏(刷新屏幕)。

Android 游戲開發中常用的三種視圖是 View 、 SurfaceView 和 GLSurfaceView 。下面簡單介紹下這三種視圖的含義:

View :顯示視圖,內置畫布,提供圖形繪制函數、觸屏事件、按鍵事件函數等;
SurfaceView :基於 View 視圖進行拓展的視圖類,更適用於 2D 游戲開發;
GLSurfaceView : 基於 SurfaceView 視圖再次進行拓展的視圖類,專用於 3D 游戲開發的視圖。


View 游戲框架實例
1.實例效果如下:

1.步驟
新建一個項目 GameView,創建完畢后首先自定義一個視圖類 “MyView” 繼承 View 類,代碼如下:

package com.example.ex4_4;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;

public class MyView extends View {

    private int textX=20,textY=20;
    /**
     * 重寫父類構造函數
     * @param context
     */
    public MyView(Context context) {
        super(context);
        //設置焦點
        setFocusable(true);
    }

    /***
     * 重寫按鍵按下事件
     * @param  keyCode 當前用戶點擊的按鍵
     * @param  event 按鍵的動作事件隊列,此類還定義了很多靜態常量鍵值
     */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        //判定用戶按下的鍵值是否方向鍵的"上下左右"鍵
        if(keyCode==KeyEvent.KEYCODE_DPAD_UP)
        {
            //"上"按鍵被點擊,應該讓文本的Y坐標變小
            textY-=2;
        }else if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN)
        {
            //"下"按鍵被點擊,應該讓文本的Y坐標變大
            textY+=2;
        }else if(keyCode==KeyEvent.KEYCODE_DPAD_LEFT)
        {
            //"左"按鍵被點擊,應該讓文本的X坐標變小
            textX-=2;
        }else if(keyCode==KeyEvent.KEYCODE_DPAD_RIGHT)
        {
            //"右"按鍵被點擊,應該讓文本的X坐標變大
            textX+=2;
        }
        return super.onKeyDown(keyCode, event);
    }

    /**
     * 重寫按鍵抬起事件
     */
    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        //invalidate();不能在當前子線程中循環調用執行
        //postInvalidate(); 可以在子線程中循環調用執行
        invalidate();//重新繪制畫布
        return super.onKeyUp(keyCode, event);
    }

    /**
     * 重寫觸屏事件函數
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //獲取用戶手指觸屏的X坐標賦值與文本的X坐標
        int x = (int)event.getX();
        //獲取用戶手指觸屏的Y坐標賦值與文本的Y坐標
        int y = (int)event.getY();
        textX=x;
        textY=y;
        //重繪畫布
        invalidate();
        return true;
    }

    /**
     * 重寫父類繪圖函數
     */
    @Override
    protected void onDraw(Canvas canvas) {
        //創建一個畫筆實例
        Paint paint = new Paint();
        //設置畫筆顏色
        paint.setColor(Color.WHITE);
        //設置畫筆文本大小
        paint.setTextSize(18);
        //繪制文本
        canvas.drawText("Hi,你好!", textX, textY, paint);
        super.onDraw(canvas);
    }

}

修改MainActivity 類,顯示繪制的View

public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(new MyView(this));
}
}

修改配置文件,設置應用程序為全屏,這里設置主題為黑色背景並隱去了狀態欄和應用標題

android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" 

 具體可以看代碼。其實就是繼承View類,然后重寫父類的方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM