android开发中使用surfaceView开发游戏

开发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版其实就是通过这种方法来实现的。现在就可以来设计自己的小游戏了。

猜你喜欢

转载自blog.csdn.net/qq_28859405/article/details/52768167