简介
Android游戏开发中常用的三种视图是View、SurfaceView和GLSurfaceView
下面简单介绍这三种视图:
- View:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等;
- SurfaceView:基于View视图进行拓展的视图类,更适用于2D游戏开发;
- GLSurfaceView:基于SurfaceView视图类再次拓展的视图类,用于3D游戏开发的视图。
在2D游戏开发中,大致分为两种游戏框架:View游戏框架和SurfaceView游戏框架。两者的主要区别有:
1) 更新画布
View是由系统主UI线程进行更新,通过调用View提供的postInvalidate()和invalidate()这两个函数重新绘制的。棋牌类游戏,其画面更新属于被动更新,这类游戏适用于View游戏框架。
SurfaceView可在UI线程或者新的线程中更新。RPG、飞行射击类游戏,其画面更新属于主动更新,需要不断重绘,这类游戏实用于SurfaceView游戏框架。
2)视图机制
View视图没有双缓冲机制,而SurfaceView视图有。
实例
View游戏框架,此Demo跟踪用户的方向键点击事件,以及触屏事件,具体步骤如下:
1.新建Android项目“ViewDemo”,此处略去若干字
2.创建一个类MyView,此类继承View,代码如下:
package com.cpxiao.viewdemo;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
/**
* Created by cpxiao on 15/9/19.
*/
public class MyView extends View {
private Paint mPaint;
/**
* 重写构造方法
*/
public MyView(Context context) {
super(context);
init();
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
//设置焦点
setFocusable(true);
mPaint = new Paint();
mPaint.setColor(Color.RED);
mPaint.setTextSize(30);
}
/**
* 重写绘图方法
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawText("MyView", textX, textY, mPaint);
}
int textX = 100;
int textY = 100;
/**
* 重写按键按下事件的方法
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//判断按下的是否为方向键(上下左右)
if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
textY -= 10;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
textY += 10;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
textX -= 10;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
textX += 10;
}
//重绘画布的函数有invalidate()和postInvalidate(),区别在于invalidate()不能在子线程中循环调用,而postInvalidate()可以。
invalidate();
// postInvalidate();
return super.onKeyDown(keyCode, event);
}
/**
* 重写按键抬起事件的方法
*/
@Override
public b