开发android游戏和开发android应用是是两个不同的方向,开发的方法也不一样。
开发游戏一般会选择一个游戏引擎,比如unity3d、cocos2d-x、cocos2d-android等,但是有时候需要做一些小的东西,我们可以使用android系统自带的一个组件surfaceView来开发,同时我们也可以了解到游戏引擎到底是怎么开发的,也可以把其中的一些技巧用到我们平时开发app中,让页面效果更好。
现在通过一个例子来演示
因为我们开发游戏和传统的app完全不同,所以一般不需要布局文件了。我们先创建一个android项目,然后把项目的主题改为全屏
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zl.itgeek.gametest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.AppCompat.NoActionBar">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
surfaceView是一个具有双缓冲机制的显示组件,可以避免游戏时屏幕的闪烁,也可以和mediaplay配合用于播放视频。它可以在子线程中对其进行绘制,但需要满足几个条件。
创建一个对象继承SurfaceView
public class GameUI extends SurfaceView {
public GameUI(Context context) {
super(context);
}
}
在activity中创建并添加该对象
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GameUI gameUI = new GameUI(this);
setContentView(gameUI);
}
}
获取到holder对象,由于holder要添加Callback,所以让GameUI实现Callback接口
public class GameUI extends SurfaceView implements SurfaceHolder.Callback {
private final SurfaceHolder holder;
public GameUI(Context context) {
super(context);
//获取到holder对象
holder = getHolder();
holder.addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
如果要开启子线程的话子线程必须在surface创建之后开启,在surface之后关闭。
public class GameUI extends SurfaceView implements SurfaceHolder.Callback {
private final SurfaceHolder holder;
private boolean flag = true;
MyThread myThread;
public GameUI(Context context) {
super(context);
//获取到holder对象
holder = getHolder();
holder.addCallback(this);
//创建子线程
myThread = new MyThread();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
myThread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
flag = false;
}
class MyThread extends Thread{
@Override
public void run() {
while(flag){
try {
//
}catch (Exception e){
}
}
}
}
}
然后我们就可以通过子线程在屏幕上进行绘制,在子线程中写如代码
class MyThread extends Thread{
@Override
public void run() {
while(flag){
try {
drowUI();
}catch (Exception e){
}
}
}
private void drowUI() {
Canvas canvas = holder.lockCanvas();
canvas.drawRect(0,0,1,1,null);
holder.unlockCanvasAndPost(canvas);
}
}
以上代码会不停的绘制,如果需要重复绘制,后绘制的东西会覆盖在之前绘制的东西之上。可以通过绘制一个全屏的矩形来覆盖上一次绘制的东西,然后重新绘制。
如果需要设置点击事件,可以在GameUI类中重写onTouchEvent方法。
@Override
public boolean onTouchEvent(MotionEvent event) {
System.out.print("屏幕被点击了");
return super.onTouchEvent(event);
}
一般游戏开发中就是通过快速绘制一张张的图片在实现,现在市场上很火的一个游戏引擎cocos2d-x,其android版其实就是通过这种方法来实现的。现在就可以来设计自己的小游戏了。