- 浏览: 579819 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
hxlniada:
[color=darkred][/color][size=sm ...
利用Handler来更新android的UI -
jack_ye:
...
检测Android中触摸屏手势的动作与坐标 -
z278013421:
Android Services使用示例 -
东方vs不败:
写的不错,挺好的
利用Handler来更新android的UI -
liangxping:
就是双缓存机制而已。
Android中SurfaceView的使用示例
在做Android游戏MagicBubble开发的时候,在连通两个Bubbles的时候,Bubble会以水泡爆破的情形消失。为了实现这一效果,我查找了不少资料,希望能找到一些标准的实现方面,花了不少时间,发觉Android关于游戏开发的资料实在太少了,更不用说标准做法了,没办法,只能按照自己的思路来实现这一效果。
我的思路是这样的(仅供参考,希望有更好做法的朋友跟我们共享一下):在FrameLayout里面加入一ImageView,再定义一个爆炸的Animation,不需要的时候,ImageView就隐藏起来,需要的时候,就把ImageView移动到需要的地方,再StartAnimation,这样,就可以实现爆炸的效果。
下面是简化后的程序的代码,程序的效果如下:点中屏幕中任意地方,就在点击地方显示爆炸效果。
首先是Animation的定义,定义一个Frame Animation,依次播放5帧动画,每帧动画持续时间为50毫秒:
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true"> <item android:drawable="@drawable/explode1" android:duration="50" /> <item android:drawable="@drawable/explode2" android:duration="50" /> <item android:drawable="@drawable/explode3" android:duration="50" /> <item android:drawable="@drawable/explode4" android:duration="50" /> <item android:drawable="@drawable/explode5" android:duration="50" /> </animation-list>
接着是主程序代码:
package com.ray.bubble; import android.app.Activity; import android.content.Context; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.view.View.OnTouchListener; import android.widget.FrameLayout; import android.widget.ImageView; public class BubbleExplosion extends Activity { private FrameLayout fl; private ExplosionView exv1; private AnimationDrawable exa1; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //set full screen requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN , WindowManager.LayoutParams. FLAG_FULLSCREEN); fl = new FrameLayout(this); fl.setBackgroundResource(R.drawable.bg); exv1 = new ExplosionView(this); exv1.setVisibility(View.INVISIBLE); exv1.setBackgroundResource(R.anim.explosion); exa1 = (AnimationDrawable)exv1.getBackground(); fl.addView(exv1); fl.setOnTouchListener(new LayoutListener()); setContentView(fl); } class ExplosionView extends ImageView{ public ExplosionView(Context context) { super(context); } //handle the location of the explosion public void setLocation(int top,int left){ this.setFrame(left, top, left+40, top+40); } } class LayoutListener implements OnTouchListener{ public boolean onTouch(View v, MotionEvent event) { //firstly, u have to stop the animation,if the animation //is starting ,u can not start it again! exv1.setVisibility(View.INVISIBLE); exa1.stop(); float x = event.getX(); float y = event.getY(); exv1.setLocation((int)y-20, (int)x-20); exv1.setVisibility(View.VISIBLE); exa1.start(); return false; } } }
配合Android的SurfaceView,Animation可以实现很好的过渡效果,SurfaceView的用法很简单,可参考:
http://rayleung.iteye.com/blog/420410
- BubbleExplosion.rar (163.5 KB)
- 下载次数: 2914
评论
30 楼
biner
2011-08-10
强大的楼主
29 楼
wangzx1983
2010-07-30
正好需要学习这方面的技术,把代码下下来看看,感谢几位老大的无私奉献。
28 楼
mncc
2010-03-22
那么问一下,如果屏幕上有多个地方需要上Animation,比如说飞行射击的时候,或者是多个物体碰撞的时候,这个时候应该怎么弄?View只能定义一个Animation啊?
27 楼
hone033
2010-02-09
这位老大写得不错,多谢楼主分享
26 楼
yicw
2010-01-08
在这里学到了不少知识,谢谢几位老大的无私奉献
25 楼
healthjava
2009-10-08
一直在考虑SurfaceView的动画显示问题。看了vlinux的代码豁然开朗。顶
24 楼
lordhong
2009-09-21
学习一下... 希望有一天开发出自己心仪的游戏
23 楼
raymondlueng
2009-09-21
vlinux 写道
回来的路上就在想,是不是对SurfaceView的理解严重有误呢。一下飞机马上就开始实现设想,终于找到解决办法了。
使用SurfaceView就命中注定了一切从头开始自己动手创建、动手释放、动手画,不应该再抱有类似AnimationDrawable一样用法的幻想。
写了一个DEMO,Kuba这类的游戏要做也只是时间问题。
作为绘画核心的DrawRunning线程
使用SurfaceView就命中注定了一切从头开始自己动手创建、动手释放、动手画,不应该再抱有类似AnimationDrawable一样用法的幻想。
写了一个DEMO,Kuba这类的游戏要做也只是时间问题。
作为绘画核心的DrawRunning线程
/** * 绘画线程 * * @author vlinux * */ public class DrawRunning implements Runnable { private List<AnimationDraw> animationDraws;//所有需要画动画的集合 private List<AnimationDraw> buffers;//缓存前台传入需要展示的动画 private SurfaceHolder surfaceHolder; private boolean running; public DrawRunning(SurfaceHolder surfaceHolder) { this.surfaceHolder = surfaceHolder; animationDraws = new ArrayList<AnimationDraw>(); buffers = new ArrayList<AnimationDraw>(); running = true; } @Override public void run() { // TODO Auto-generated method stub while (running) { synchronized (surfaceHolder) { Canvas canvas = null; try { canvas = surfaceHolder.lockCanvas(null); doDraw(canvas); } finally { if (null != canvas) { surfaceHolder.unlockCanvasAndPost(canvas); }// if }// try }// syn }// while } private void doDraw(Canvas canvas) { synchronized(this) { //检查缓存中是否有需要加入的动画 if( !buffers.isEmpty() ) { animationDraws.addAll(buffers);//加入animationDraws buffers.clear();//清空缓存 }//if }//syn if( animationDraws.isEmpty() ) { return;//如果animationDraws里面是空的那就不用画了 }//if //---这里开始绘画 Iterator<AnimationDraw> bombIt = animationDraws.iterator(); while (bombIt.hasNext()) { AnimationDraw bomb = bombIt.next(); Bitmap nextFrame = bomb.nextFrame(); if (null == nextFrame) { //下一Frame为null,说明动画序列已经结束 //该动画已经完成,从动画集合中删除 bombIt.remove(); continue;//while }// if canvas.drawBitmap(nextFrame, bomb.getX(), bomb.getY(), null); }// while } public void addAnimationDraw(AnimationDraw bomb) { synchronized(this) { //尽量减少这个的同步响应时间,因为这个方法是前台响应的 //多0.1秒都会直接反应到用户感知 buffers.add(bomb);//将需要显示动画的内容加入到缓存 }//syn } public void stopDrawing() { running = false; } }
这段代码写得好,很好的思路,非常感谢!
22 楼
vlinux
2009-09-20
回来的路上就在想,是不是对SurfaceView的理解严重有误呢。一下飞机马上就开始实现设想,终于找到解决办法了。
使用SurfaceView就命中注定了一切从头开始自己动手创建、动手释放、动手画,不应该再抱有类似AnimationDrawable一样用法的幻想。
写了一个DEMO,Kuba这类的游戏要做也只是时间问题。
作为绘画核心的DrawRunning线程
使用SurfaceView就命中注定了一切从头开始自己动手创建、动手释放、动手画,不应该再抱有类似AnimationDrawable一样用法的幻想。
写了一个DEMO,Kuba这类的游戏要做也只是时间问题。
作为绘画核心的DrawRunning线程
/** * 绘画线程 * * @author vlinux * */ public class DrawRunning implements Runnable { private List<AnimationDraw> animationDraws;//所有需要画动画的集合 private List<AnimationDraw> buffers;//缓存前台传入需要展示的动画 private SurfaceHolder surfaceHolder; private boolean running; public DrawRunning(SurfaceHolder surfaceHolder) { this.surfaceHolder = surfaceHolder; animationDraws = new ArrayList<AnimationDraw>(); buffers = new ArrayList<AnimationDraw>(); running = true; } @Override public void run() { // TODO Auto-generated method stub while (running) { synchronized (surfaceHolder) { Canvas canvas = null; try { canvas = surfaceHolder.lockCanvas(null); doDraw(canvas); } finally { if (null != canvas) { surfaceHolder.unlockCanvasAndPost(canvas); }// if }// try }// syn }// while } private void doDraw(Canvas canvas) { synchronized(this) { //检查缓存中是否有需要加入的动画 if( !buffers.isEmpty() ) { animationDraws.addAll(buffers);//加入animationDraws buffers.clear();//清空缓存 }//if }//syn if( animationDraws.isEmpty() ) { return;//如果animationDraws里面是空的那就不用画了 }//if //---这里开始绘画 Iterator<AnimationDraw> bombIt = animationDraws.iterator(); while (bombIt.hasNext()) { AnimationDraw bomb = bombIt.next(); Bitmap nextFrame = bomb.nextFrame(); if (null == nextFrame) { //下一Frame为null,说明动画序列已经结束 //该动画已经完成,从动画集合中删除 bombIt.remove(); continue;//while }// if canvas.drawBitmap(nextFrame, bomb.getX(), bomb.getY(), null); }// while } public void addAnimationDraw(AnimationDraw bomb) { synchronized(this) { //尽量减少这个的同步响应时间,因为这个方法是前台响应的 //多0.1秒都会直接反应到用户感知 buffers.add(bomb);//将需要显示动画的内容加入到缓存 }//syn } public void stopDrawing() { running = false; } }
21 楼
raymondlueng
2009-09-15
vlinux 写道
是,那个代码我干掉了,我想完善点再丢上来的。总觉得真相就在手边了。
好,一起加油!
20 楼
vlinux
2009-09-15
是,那个代码我干掉了,我想完善点再丢上来的。总觉得真相就在手边了。
19 楼
raymondlueng
2009-09-15
vlinux 写道
不知道你是否有玩过一款叫做 “Buka" 的游戏,你觉得密集touch所产生那群蓝色光晕是多个View的效果么?
多个隐藏View,恩.你是想要做一个隐藏的View池?总觉得这不是一个最好的解决办法的说。
多个隐藏View,恩.你是想要做一个隐藏的View池?总觉得这不是一个最好的解决办法的说。
玩过Buka,还挺喜欢的,我也的确认为隐藏View做不出Buka这样的游戏,我认为隐藏VIew是对于一些比较简单动画的 游戏,是个方便高效的方法而已,我看了你的代码,代码并不是你说的用SurfaceVIew来实现动画啊!
18 楼
vlinux
2009-09-15
不知道你是否有玩过一款叫做 “Buka" 的游戏,你觉得密集touch所产生那群蓝色光晕是多个View的效果么?
多个隐藏View,恩.你是想要做一个隐藏的View池?总觉得这不是一个最好的解决办法的说。
多个隐藏View,恩.你是想要做一个隐藏的View池?总觉得这不是一个最好的解决办法的说。
17 楼
raymondlueng
2009-09-15
vlinux 写道
raymondlueng 写道
vlinux 写道
这个方法可行性不高,因为同一时间只有一个动画存在,如果是要多个动画出现,就挂了
使用过多个动画效果同时显示,没性能问题,请问您有没更好的方法,分享一下啦!
多个动画效果同时显示,根据你的例子来看,一个动画必须绑定一个View吧。但是爆炸是随机发生的事件。比如说我touch一下屏幕就要有一个爆炸动画出现,如果我在短时间是大量的touch那一个View的劣势就显示出来了。
如果你是打算用动态添加View,那肯定要有性能代价。
其实也不用的,我这个做法是从flash游戏的开发受启发的,你可以同时隐藏多个view,需要的时候就把其显现出来,大量的touch毕竟也是有些的,View的复用也是蛮高的!
16 楼
raymondlueng
2009-09-15
vlinux 写道
初涉这块领地,也正在努力探索。
分两个思路来讨论一下
1.改进你的方法。
你的的方法是利用Android自带的Frame-By-Frame例子的,缺点就是Android目前依靠配置无法从一张动画序列图中截取部分来显示动画。所以这样就造成了必须准备一张张单独的图片,这对一个游戏拥有大量动作且Android的res目录不支持子目录的情况下来看是不大雅观的。
我用AnimationDrawable稍做了一些改进。
2.直接用SurfaceView开线程画。用线程+SurfaceView无疑是最好的办法了。不过我目前卡死在这里,因为每帧画出的图案就永久生效了。不像之前的Animation是可以重叠,当动画消失之后还原背景。非常令我苦闷,不知道你有没有在SurfaceView做动画的好办法。
分两个思路来讨论一下
1.改进你的方法。
你的的方法是利用Android自带的Frame-By-Frame例子的,缺点就是Android目前依靠配置无法从一张动画序列图中截取部分来显示动画。所以这样就造成了必须准备一张张单独的图片,这对一个游戏拥有大量动作且Android的res目录不支持子目录的情况下来看是不大雅观的。
我用AnimationDrawable稍做了一些改进。
2.直接用SurfaceView开线程画。用线程+SurfaceView无疑是最好的办法了。不过我目前卡死在这里,因为每帧画出的图案就永久生效了。不像之前的Animation是可以重叠,当动画消失之后还原背景。非常令我苦闷,不知道你有没有在SurfaceView做动画的好办法。
我一开始做游戏动画的时候就是用surfaceview+线程来实现的,正如你所说的,动画消失后还要还原背景,在画面上画任何一点东西,都要导致整个画面重画,如果画动画的时候,有用户交换(比如说拖动某个物体,会导致画面闪烁非常严重),似乎这个办法也不是解决之道
15 楼
vlinux
2009-09-15
raymondlueng 写道
vlinux 写道
这个方法可行性不高,因为同一时间只有一个动画存在,如果是要多个动画出现,就挂了
使用过多个动画效果同时显示,没性能问题,请问您有没更好的方法,分享一下啦!
多个动画效果同时显示,根据你的例子来看,一个动画必须绑定一个View吧。但是爆炸是随机发生的事件。比如说我touch一下屏幕就要有一个爆炸动画出现,如果我在短时间是大量的touch那一个View的劣势就显示出来了。
如果你是打算用动态添加View,那肯定要有性能代价。
14 楼
vlinux
2009-09-15
初涉这块领地,也正在努力探索。
分两个思路来讨论一下
1.改进你的方法。
你的的方法是利用Android自带的Frame-By-Frame例子的,缺点就是Android目前依靠配置无法从一张动画序列图中截取部分来显示动画。所以这样就造成了必须准备一张张单独的图片,这对一个游戏拥有大量动作且Android的res目录不支持子目录的情况下来看是不大雅观的。
我用AnimationDrawable稍做了一些改进。
2.直接用SurfaceView开线程画。用线程+SurfaceView无疑是最好的办法了。不过我目前卡死在这里,因为每帧画出的图案就永久生效了。不像之前的Animation是可以重叠,当动画消失之后还原背景。非常令我苦闷,不知道你有没有在SurfaceView做动画的好办法。
分两个思路来讨论一下
1.改进你的方法。
你的的方法是利用Android自带的Frame-By-Frame例子的,缺点就是Android目前依靠配置无法从一张动画序列图中截取部分来显示动画。所以这样就造成了必须准备一张张单独的图片,这对一个游戏拥有大量动作且Android的res目录不支持子目录的情况下来看是不大雅观的。
我用AnimationDrawable稍做了一些改进。
2.直接用SurfaceView开线程画。用线程+SurfaceView无疑是最好的办法了。不过我目前卡死在这里,因为每帧画出的图案就永久生效了。不像之前的Animation是可以重叠,当动画消失之后还原背景。非常令我苦闷,不知道你有没有在SurfaceView做动画的好办法。
13 楼
raymondlueng
2009-09-14
vlinux 写道
这个方法可行性不高,因为同一时间只有一个动画存在,如果是要多个动画出现,就挂了
使用过多个动画效果同时显示,没性能问题,请问您有没更好的方法,分享一下啦!
12 楼
vlinux
2009-09-14
这个方法可行性不高,因为同一时间只有一个动画存在,如果是要多个动画出现,就挂了
11 楼
fkpwolf
2009-09-06
爆炸这个好像是游戏里面挺难解决的一个问题,如果要真是模拟爆炸的话,大多是预先设好了所有爆炸的画面,当然这个画面是一样的
发表评论
-
类似Chome的翻转效果
2012-09-18 23:14 2413简单的demo,屏幕上下滑动翻转View,类似Android ... -
3D编程基础数学之旋转及在Android中的应用
2012-02-10 00:11 0最近因为兴趣,看了一些3D编程的书,有种感觉就是写这些书的作者 ... -
Android中屏幕Density对BitmapDrawable的影响
2011-07-08 21:44 7905很早之前写的文章了,发在这里记录一下。 在之前的 ... -
Android程序与Javascript的交换
2010-04-16 21:40 0hello! -
Android Services使用示例
2010-01-12 16:50 14143Android开发中,当需要创建在后台运行的程序的时候,就要 ... -
Android游戏开发之服务器端
2010-01-09 16:38 6721首先我不知道这篇文章发到Android开发板块是否适合的,因为 ... -
Android ListView常用用法
2009-12-03 20:56 36750ListView是比较常用的控件,但一直都觉得创建ListVi ... -
Android View添加 Listener 小技巧示例
2009-12-02 15:35 9873在开发中为控件添加Listener是非常常见的工作,最简单的添 ... -
Android Gesture 手势识别使用实例
2009-10-20 11:56 10217很高兴能在Android1.6的sdk看到手势识别这一 ... -
Android第二个游戏 DragonFeed(勇者喂恶龙)
2009-10-12 17:57 8119这是参加学校一个小比赛的参赛游戏,之前一直在忙 认证考试和项目 ... -
Android 震动示例--心跳效果
2009-10-02 23:58 7719正在开发第二个游戏,计时就要结束的时候,为了营造紧张的气氛, ... -
Android adb的使用略解
2009-09-30 16:08 40289安卓网的一个帖子,写得不错,记下来 ADB全称Android ... -
Android游戏开发之连连看算法
2009-09-29 00:36 10481因为有朋友在站内信中问到连连看的具体算法,所以我就把算法pos ... -
android游戏开发之选关画面
2009-09-21 15:44 4056在游戏开发中,往往要提供选关的页面,选择关卡可以简单地使用li ... -
Android重力感应Demo
2009-09-11 23:33 14084android中的很多游戏的游戏都使用了重力感应的技术,但其a ... -
Android 的第一个游戏
2009-08-18 08:48 8023学了android1个多月,做了一款连连看游戏,上了andro ... -
Android canvas的save()和restore()用法
2009-08-05 12:21 19930在读Android SDK里面的samples里面游戏的时候, ... -
Android 2d物理引擎Box2d的使用示例
2009-08-04 09:06 14299Box2d是一个很出名的2d物理引擎,大家可以google之。 ... -
利用Handler更新Android UI的另一种方法
2009-07-29 11:28 11923文字程序很简单,一个View,一个Activity,利用han ... -
android布局学习利器-Hierarchy Viewer
2009-07-27 18:17 8150Hierarchy Viewer 帮你分析应用程序UI布局 ...
相关推荐
在Android游戏开发领域,"飞机大战怪兽"是一个常见的入门级项目,非常适合初学者学习。这个例子通过构建一个简单的2D游戏,展示了Android游戏开发的基本流程和技术要点。下面我们将详细探讨其中涉及的知识点。 首先...
在Android应用开发中,视觉效果往往能够提升用户体验,其中粒子爆炸效果是一种常见且吸引人的动态效果,常用于游戏、动画或者界面过渡等场景。本文将深入探讨如何在Android Studio中实现这种效果,以及如何利用提供...
本资源"Android游戏开发之飞行射击类游戏原理实现源码"提供了一个深入学习和实践此类游戏开发的宝贵机会。下面我们将探讨飞行射击类游戏的关键技术和实现步骤。 首先,游戏的核心是游戏循环(Game Loop)。游戏循环...
《Android炸弹爆炸游戏开发详解》 在Android平台上,游戏开发是一项充满挑战与乐趣的任务,尤其是一款结合了帧动画、补间动画以及音效的游戏——"android炸弹爆炸游戏"。这款游戏展示了Android开发中的多个核心知识...
【Android小游戏源码】是一个适合初学者学习的项目,它基于Eclipse开发...这个源码项目是实践和学习Android游戏开发的宝贵资源,不仅可以帮助初学者掌握基本技能,还能激发他们进一步探索更复杂的Android游戏开发技术。
在Android游戏开发中,模拟粒子系统是一个非常关键的技能,它能够为游戏带来生动的视觉效果,如火焰、烟雾、水波、爆炸等。粒子系统通过生成大量小图形(粒子)并控制它们的行为,来模拟复杂的动态效果,极大地提升...
在Android平台上,开发3D游戏是一项复杂而富有挑战性的任务,...通过学习这些章节,开发者不仅可以掌握创建3D游戏的基本技能,还能深入了解Android游戏开发的高级技巧,为创建更丰富、更具沉浸感的游戏体验奠定基础。
源代码的提供对于学习Android游戏开发的开发者或者对游戏编程感兴趣的爱好者来说,是一份宝贵的参考资料。接下来,我们将深入探讨这款游戏中涉及的关键技术和知识点。 1. **Android游戏开发基础**: - **Android ...
首先,我们要明确Android游戏开发的核心是利用Java或Kotlin语言,并结合Android SDK中的游戏开发工具和库,如Android Studio、OpenGL ES等。在这个项目中,我们可能看到的主要文件和组件包括: 1. **主Activity**:...
总结,通过分析"泡泡大作战"的源码,开发者不仅可以掌握Android游戏开发的基本技巧,还能深入了解游戏逻辑、UI设计、数据管理、性能优化等多个方面。这是一份宝贵的实践资料,对提升Android游戏开发能力大有裨益。在...
在Android游戏开发中,爆炸效果是增强用户体验、提升游戏沉浸感的重要元素,特别是在动作、冒险或者策略类游戏中。 首先,我们来了解一下爆炸效果的基本组成部分。一个逼真的爆炸效果通常由以下几个要素构成: 1. ...
在Android平台上开发一款打飞机游戏是一项综合性的任务,涉及到许多技术层面和设计原则。下面将详细阐述这个过程中可能涉及的关键知识点。 首先,我们要了解Android...同时,持续学习和实践是提升游戏开发技能的关键。
这个项目是Android应用开发中的一个经典案例,可以帮助初学者深入理解Android游戏开发的基本原理和技术栈。下面将详细探讨这款游戏中涉及的关键知识点。 1. **Android SDK和Eclipse IDE**:Android SDK是Android...
《AndEngineExamples-GLES2》是针对Android游戏开发的一个开源示例库,它基于OpenGL ES 2.0,是Android平台上进行2D游戏开发的重要工具。这个资源集合为初学者提供了一个良好的学习平台,帮助他们理解和掌握Android...
【Android游戏开发基础】 在Android平台上,游戏开发主要依赖于Java或Kotlin语言,结合Android SDK(Software Development Kit)和Android Studio IDE进行。本压缩包中的"Android游戏源码切水果小游戏有详细注释"是...
10. **测试与发布**:游戏开发完成后,需在多种设备和Android版本上进行测试,确保兼容性。发布前应完成APK签名、版本号管理、权限设置等工作,遵循Google Play的提交规范。 综上所述,开发一个Android平台的飞机小...
4. **游戏框架**:虽然描述中没有提及具体的游戏框架,但通常开发Android游戏时会用到如LibGDX这样的框架。LibGDX提供了丰富的图形、音频和输入处理功能,简化了游戏开发过程。 5. **OpenGL ES**:飞机大战可能使用...
一、Android游戏开发基础 1. Android SDK:Android飞机游戏的开发离不开Android Software Development Kit(SDK),它是Android系统开发的基础工具,包含了编译、调试和部署应用所需的全部组件。开发者需要在...