- 浏览: 761132 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (139)
- 玩转Android (48)
- Android创意美工 (0)
- Android杂谈 (23)
- Android实例练习 (2)
- Android ROM研究 (5)
- Android NDK开发指南 (5)
- Android NDK (0)
- Android Tips (3)
- Windows Phone 7 (5)
- iPhone (0)
- HTML5学习室 (0)
- JAVA (9)
- SSH+ibatis (8)
- PHP (0)
- IT生活 (1)
- linux (2)
- C (4)
- C++ (1)
- web 前端 (1)
- 云计算 (0)
- 设计模式 (0)
- C# (2)
- 其他 (1)
- 数据结构 (5)
- Web开发 (10)
- 数据库 (3)
- 搜索引擎 (0)
- Go语言 (0)
最新评论
-
wi100sh:
多谢分享~
玩转Android---UI篇---ImageButton(带图标的按钮) -
zhanghaichang:
好文章的。
高性能web开发技术(一) -
yingang:
引用classes.dex.dex2jar.jar 拖入 j ...
Andorid杂谈---Apk文件的反编译 -
扶摇诺:
讲解的简明易懂,多谢啦!
玩转Android---UI篇---LinearLayout(线性布局) -
a13429921973:
更为详细的图文介绍,可参考这个http://blog.csdn ...
Android ROM研究---CyanogenMod源代码下载及编译
由于游戏界面是由大量美工资源图片构成的,所以,在设计游戏界面的时候,千万不能用Layout来布局,因为这样的话,会将游戏界面中的对象当成一个组件来处理,开发过程中就会出现各种各样的问题。
其实,游戏就是通过状态机让Canvas不断的在View上画你想要的东西,这个状态机不仅包括游戏的内部执行,还包括外部的输入。
View类是Android的一个超类,这个类几乎包含了所有的屏幕类型。
View
extends Object
implements Drawable.Callback KeyEvent.Callback AccessibilityEventSource
上面的是SDK中对View类的一个定义,可以看到,有很多类是它的直接子类或者间接子类。
每个View类都有个可以进行绘画的画布,这个画布可以进行任一扩展。在游戏当中,可以自定义视图(View),使得这个画布的功能更能满足我们在游戏中的需要。
在Android中,任何一个View类都要重写onDraw()方法来实现画面显示,自定义的视图或者3D实现。
游戏中经常会使用触屏、键盘等事件,在View中同样也要实现它们来满足相应的功能。
onKeyUp,onKeyDown,onKeyMultiple,onKeyPreIme,onTouchEvent,onTrackballEvent等方法,在继承View的时候需要重载这些方法。
其实,游戏的核心就是不断的刷新界面和绘图,绘图可以在onDraw()方法中实现,那么刷新界面呢?Android中提供了
invalidate()方法来实现界面刷新,注意,invalidate不能直接在线程中调用,因为它违背了单线程模型:Android UI操作不是线程安全的,并且这些线程必须在UI线程中执行,因此Android中最常用的方法是利用Handler来实现UI线程的更新。
下面是个例子:
ViewDemo.java
package com.loulijun.viewdemo; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Bundle; import android.view.View; public class ViewDemo extends View { //用于后面生成不同颜色而定义的变量 int count = 0; //重写ViewDemo的构造方法 public ViewDemo(Context context) { super(context); } //画图方法 public void onDraw(Canvas canvas) { if(count < 100) { count++; } else { count = 0; } Paint paint = new Paint(); switch(count%4) { case 0:paint.setColor(Color.BLUE);break; case 1:paint.setColor(Color.GREEN);break; case 2:paint.setColor(Color.RED);break; case 3:paint.setColor(Color.YELLOW);break; default:paint.setColor(Color.WHITE);break; } //画一个坐标在(100,100),半径为60的圆 canvas.drawCircle(100,100,60,paint); } }
MainActivity.java
package com.loulijun.viewdemo; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.KeyEvent; import android.view.MotionEvent; public class MainActivity extends Activity { //设置一个id public static final int REFRESH = 0X000001; //声明ViewDemo private ViewDemo mv = null; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //实例化ViewDemo对象 mv = new ViewDemo(this); //设置显示为我们自定义的View setContentView(mv); //开启线程 new Thread(new GameThread()).start(); } Handler handler = new Handler() { //接收消息后处理 public void handleMessage(Message msg) { switch(msg.what) { case MainActivity.REFRESH:mv.invalidate();break; } super.handleMessage(msg); } }; //内部类,需要实现一个Runnable接口 class GameThread implements Runnable { @Override public void run() { //如果当前线程没有中断 while(!Thread.currentThread().isInterrupted()) { Message message = new Message(); message.what = MainActivity.REFRESH; //发送消息 handler.sendMessage(message); try { Thread.sleep(500); }catch(InterruptedException e) { Thread.currentThread().interrupt(); } } } }
分析:
这里,通过实例化一个Handler对象并重写handleMessage方法来实现一个消息接收器,然后再线程中通过sendMessage()方法发送更新界面的消息,当接收器收到更新界面的时候,便开始执行invalidate()方法更新屏幕信息。
当然,还可以直接在线程中使用postInvalidate()方法在线程中更新界面,而不用再使用Handler来接收消息了
MainActivity.java
package com.loulijun.viewdemo; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.KeyEvent; import android.view.MotionEvent; public class MainActivity extends Activity { //设置一个id public static final int REFRESH = 0X000001; //声明ViewDemo private ViewDemo mv = null; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //实例化ViewDemo对象 mv = new ViewDemo(this); //设置显示为我们自定义的View setContentView(mv); //开启线程 new Thread(new GameThread()).start(); } //内部类,需要实现一个Runnable接口 class GameThread implements Runnable { @Override public void run() { //如果当前线程没有中断 while(!Thread.currentThread().isInterrupted()) { try { Thread.sleep(500); }catch(InterruptedException e) { Thread.currentThread().interrupt(); } //使用postInvalidate()也可以直接在线程中更新界面,这样就不再需要HandlerMessage来接收消息了 mv.postInvalidate(); } } } //触笔事件 public boolean onTouchEvent(MotionEvent event) { return true; } //按键按下事件 public boolean onKeyDown(int keyCode, KeyEvent event) { return true; } //按键弹起事件 public boolean onKeyUp(int keyCode, KeyEvent event) { return false; } public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) { return true; } }
运行结果如下:
发表评论
-
玩转Android---2D图形及动画---动画分析(Tween详细分析)
2011-09-26 21:59 2629在Android系统中提供了两种动画实现方式:一种是Tween ... -
玩转Android---2D图形及动画---图片处理
2011-09-26 13:08 1781在Android中很多地方都使 ... -
玩转Android--UI篇--PreferenceActivity(开启wifi和音乐等)
2011-09-01 11:57 4852本测试主要是为了测试PreferenceActivity的使用 ... -
玩转Android---2D图形及动画---Gif动画
2011-08-05 09:36 2223由于Gif本身就是动画,所以如果能够直接使用的话,会省去很多的 ... -
玩转Android---2D图形及动画---Frame动画
2011-08-01 20:53 2087Frame动画其实就是逐帧动画,用法也比Tween动画简单,只 ... -
玩转Android---2D图形及动画---Tween动画
2011-07-31 22:53 2181Android平台提供了两类动画,分别是Tween动画,和Fr ... -
玩转Android--组件篇---Handler的使用
2011-07-30 14:01 5360public class Handler ... -
玩转Android---UI篇---ZoomControls放大缩小图片
2011-07-27 13:03 7249ZoomControls控件是一个可以缩放但控件,效果如下图 ... -
玩转Android---组件篇---TextSwitcher
2011-07-25 09:21 2194还记得有一次淘宝的电话面试的时候问了我一个关于Android的 ... -
玩转Android---组件篇---AnalogClock,DigitalClock
2011-07-10 19:28 2942首先要说的是,这两个控件并不是经常的使用,但是如果程序需要的话 ... -
玩转Android---组件篇---SeekBar,RatingBar,Chronometer
2011-07-10 19:12 2860今天补充三个组件的使用,避免日后忘记。它们分别是 SeekB ... -
玩转Android---组件篇---Handler的使用(2)
2011-05-28 17:15 2823对于Handler来说,它和与它调用它的Activity是出于 ... -
玩转Android---组件篇---Handler的使用(1)
2011-05-28 15:37 2176在android中,有很多功能是不能放在onCreate或者o ... -
玩转Android---事件监听篇---第2篇
2011-05-27 10:30 5252事件监听篇---第二篇 下面是各种常用控件的事件监听的 ... -
玩转Android---事件监听篇---第1篇
2011-05-26 21:29 9933事件就是用户与UI界面的交互时所触发的操作。比如点击某一个按钮 ... -
玩转Android---组件篇---数据存储之SQLite
2011-04-17 17:05 8486Android中通过SQLite数据库引擎来实现结构化数据存储 ... -
玩转Android---组件篇---数据存储之File
2011-04-17 11:07 2047我们可以将一些数据直接以文件的形式保存在设备中。例如,一些文本 ... -
玩转Andorid---组件篇---数据存储之preference
2011-04-14 21:58 2304程序是数据的输入、处 ... -
玩转Android---组件篇---Broadcast Receiver(广播接收器)
2011-04-14 19:24 29350Braodcast Receiver顾名思义 ... -
玩转Andorid---组件篇---Service(服务)之RPC远程进程调用
2011-04-08 21:17 3467在Andorid平台中,各个组件运行在自己的进程中,他们 ...
相关推荐
6. **物理模拟**:为了模拟真实世界的运动,项目可能使用Box2D或自定义的物理引擎来处理碰撞检测、重力等。 四、性能优化 1. **多线程**:游戏的计算密集型部分应放在工作线程中,以保持UI流畅。 2. **内存管理**...
总的来说,要玩转Android的360度全景图功能,你需要掌握OpenGL ES、Google VR SDK和Three.js的相关知识,以及Android Studio项目管理和构建工具的使用。通过不断学习和实践,你将能够创造出引人入胜的全景体验。
3. **2D图形绘制**:Android提供了Canvas和SurfaceView等组件用于绘制2D图形。游戏中的角色、障碍物和背景等元素都需要通过这些API来绘制。 4. **物理引擎**:为了模拟真实的跳跃效果,涂鸦跳跃可能会使用简单的...
开发者可以通过它们创建丰富的2D图形。 5. **Path和Typeface**:`Path`用于构造复杂的矢量图形路径,而`Typeface`用来改变文字的字体风格,对于游戏中的文字和标识设计很重要。 6. **手势识别**:Android提供了`...
游戏逻辑可能通过自定义View或者使用游戏引擎如Unity、Cocos2d-x来实现。 3. **用户界面**:Android版俄罗斯方块需要设计直观且响应迅速的用户界面,包括游戏主屏幕、开始游戏、设置选项和排行榜等功能。UI元素应...
对于复杂的游戏图形,开发者可能选择使用OpenGL ES,这是一个为嵌入式设备设计的2D和3D图形库。在《水果忍者》这种游戏中,利用OpenGL ES可以实现高效且流畅的图形渲染,例如切割水果时的粒子效果、刀片轨迹等。 4...
GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的...
GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的...
GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的...
开发者可能使用Unity的层级视图(Hierarchy View)和场景视图(Scene View)来构建游戏世界,包括地铁轨道、建筑、道具等元素。同时,他们可以通过编写脚本来随机生成或预定义关卡布局,增加游戏的可玩性和重玩价值...
GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的...
GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的...
GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的...
GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的...
GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的...
GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的...
GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的...
GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的...
此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...