android开发中使用surfaceView开发游戏

来源:互联网 发布:在线教育源码 编辑:程序博客网 时间:2024/05/20 11:33

开发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方法。

@Overridepublic boolean onTouchEvent(MotionEvent event) {    System.out.print("屏幕被点击了");    return super.onTouchEvent(event);}

一般游戏开发中就是通过快速绘制一张张的图片在实现,现在市场上很火的一个游戏引擎cocos2d-x,其android版其实就是通过这种方法来实现的。现在就可以来设计自己的小游戏了。

1 0
原创粉丝点击