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
- android开发中使用surfaceView开发游戏
- Android游戏开发使用View还是SurfaceView
- Android游戏开发使用View还是SurfaceView
- Android开发中的游戏开发使用View还是SurfaceView?
- Android 开发中的游戏开发使用 View 还是 SurfaceView
- Android 游戏开发 SurfaceView框架
- Android 游戏开发之 SurfaceView
- Android SurfaceView游戏开发示例
- Android SurfaceView游戏开发示例
- 【Android游戏开发十四】深入Animation,在SurfaceView中照样使用Android—Tween Animation!
- 【Android游戏开发十四】深入Animation,在SurfaceView中照样使用Android—Tween Animation!
- 【Android游戏开发十四】深入Animation,在SurfaceView中照样使用Android—Tween Animation!
- (转)【Android游戏开发十四】深入Animation,在SurfaceView中照样使用Android—Tween Animation!
- 【Android游戏开发十四】深入Animation,在SurfaceView中照样使用Android—Tween Animation!
- 【Android游戏开发十四】深入Animation,在SurfaceView中照样使用Android—Tween Animation!
- android 游戏开发 - 使用SurfaceView 创建你自己的View
- Android 游戏开发笔记一、入门之SurfaceView的使用
- android:使用SurfaceView游戏开发简单屏幕适配方法
- ##如何通过写博客赚钱
- Android设备调试(二)Genymotion模拟器引起的Address already in use ADB server didn't ACK
- 正则表达式
- HTML5快速上手之2:与标签有关的基本指令
- 使用Apriori算法进行关联分析
- android开发中使用surfaceView开发游戏
- 【poj3669】Meteor Shower 搜索
- Fleury算法求欧拉路径
- Leetcode 104 Maximum Depth of Binary Tree
- LeetCode—417. Pacific Atlantic Water Flow
- 玄学曲线并不玄 教你如何看懂GPU呈现
- 编程规范积累
- 感知哈希算法实现简单图片搜索
- openssl 证书流程和概念