對於玩家來說,游戲是動態的;對於游戲開發人員來說,游戲是靜態的,只是不停地播放不通的畫面,讓玩家看到了動態的效果。
進入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類,然后重寫父類的方法。