`

Android游戏开发之爆炸效果

阅读更多

    在做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

分享到:
评论
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线程
/**
 * 绘画线程
 * 
 * @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线程
/**
 * 绘画线程
 * 
 * @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池?总觉得这不是一个最好的解决办法的说。

玩过Buka,还挺喜欢的,我也的确认为隐藏View做不出Buka这样的游戏,我认为隐藏VIew是对于一些比较简单动画的 游戏,是个方便高效的方法而已,我看了你的代码,代码并不是你说的用SurfaceVIew来实现动画啊!
18 楼 vlinux 2009-09-15  
不知道你是否有玩过一款叫做  “Buka" 的游戏,你觉得密集touch所产生那群蓝色光晕是多个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做动画的好办法。



我一开始做游戏动画的时候就是用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做动画的好办法。


13 楼 raymondlueng 2009-09-14  
vlinux 写道
这个方法可行性不高,因为同一时间只有一个动画存在,如果是要多个动画出现,就挂了

使用过多个动画效果同时显示,没性能问题,请问您有没更好的方法,分享一下啦!
12 楼 vlinux 2009-09-14  
这个方法可行性不高,因为同一时间只有一个动画存在,如果是要多个动画出现,就挂了
11 楼 fkpwolf 2009-09-06  
爆炸这个好像是游戏里面挺难解决的一个问题,如果要真是模拟爆炸的话,大多是预先设好了所有爆炸的画面,当然这个画面是一样的

相关推荐

    android游戏开发例子_飞机大战怪兽

    在Android游戏开发领域,"飞机大战怪兽"是一个常见的入门级项目,非常适合初学者学习。这个例子通过构建一个简单的2D游戏,展示了Android游戏开发的基本流程和技术要点。下面我们将详细探讨其中涉及的知识点。 首先...

    Android粒子爆炸效果

    在Android应用开发中,视觉效果往往能够提升用户体验,其中粒子爆炸效果是一种常见且吸引人的动态效果,常用于游戏、动画或者界面过渡等场景。本文将深入探讨如何在Android Studio中实现这种效果,以及如何利用提供...

    Android游戏开发之飞行射击类游戏原理实现源码

    本资源"Android游戏开发之飞行射击类游戏原理实现源码"提供了一个深入学习和实践此类游戏开发的宝贵机会。下面我们将探讨飞行射击类游戏的关键技术和实现步骤。 首先,游戏的核心是游戏循环(Game Loop)。游戏循环...

    android炸弹爆炸游戏

    《Android炸弹爆炸游戏开发详解》 在Android平台上,游戏开发是一项充满挑战与乐趣的任务,尤其是一款结合了帧动画、补间动画以及音效的游戏——"android炸弹爆炸游戏"。这款游戏展示了Android开发中的多个核心知识...

    Android小游戏源码

    【Android小游戏源码】是一个适合初学者学习的项目,它基于Eclipse开发...这个源码项目是实践和学习Android游戏开发的宝贵资源,不仅可以帮助初学者掌握基本技能,还能激发他们进一步探索更复杂的Android游戏开发技术。

    android游戏开发基础模拟粒子系统

    在Android游戏开发中,模拟粒子系统是一个非常关键的技能,它能够为游戏带来生动的视觉效果,如火焰、烟雾、水波、爆炸等。粒子系统通过生成大量小图形(粒子)并控制它们的行为,来模拟复杂的动态效果,极大地提升...

    Android 3D游戏案例开发大全3 代码

    在Android平台上,开发3D游戏是一项复杂而富有挑战性的任务,...通过学习这些章节,开发者不仅可以掌握创建3D游戏的基本技能,还能深入了解Android游戏开发的高级技巧,为创建更丰富、更具沉浸感的游戏体验奠定基础。

    Android打飞机类游戏源码

    源代码的提供对于学习Android游戏开发的开发者或者对游戏编程感兴趣的爱好者来说,是一份宝贵的参考资料。接下来,我们将深入探讨这款游戏中涉及的关键技术和知识点。 1. **Android游戏开发基础**: - **Android ...

    Android游戏源码简单飞行射击游戏

    首先,我们要明确Android游戏开发的核心是利用Java或Kotlin语言,并结合Android SDK中的游戏开发工具和库,如Android Studio、OpenGL ES等。在这个项目中,我们可能看到的主要文件和组件包括: 1. **主Activity**:...

    android游戏泡泡大作战源码

    总结,通过分析"泡泡大作战"的源码,开发者不仅可以掌握Android游戏开发的基本技巧,还能深入了解游戏逻辑、UI设计、数据管理、性能优化等多个方面。这是一份宝贵的实践资料,对提升Android游戏开发能力大有裨益。在...

    android爆炸效果

    在Android游戏开发中,爆炸效果是增强用户体验、提升游戏沉浸感的重要元素,特别是在动作、冒险或者策略类游戏中。 首先,我们来了解一下爆炸效果的基本组成部分。一个逼真的爆炸效果通常由以下几个要素构成: 1. ...

    Android开发打飞机游戏

    在Android平台上开发一款打飞机游戏是一项综合性的任务,涉及到许多技术层面和设计原则。下面将详细阐述这个过程中可能涉及的关键知识点。 首先,我们要了解Android...同时,持续学习和实践是提升游戏开发技能的关键。

    Android 飞机大战小游戏

    这个项目是Android应用开发中的一个经典案例,可以帮助初学者深入理解Android游戏开发的基本原理和技术栈。下面将详细探讨这款游戏中涉及的关键知识点。 1. **Android SDK和Eclipse IDE**:Android SDK是Android...

    AndEngineExamples-GLES2_android游戏_android_

    《AndEngineExamples-GLES2》是针对Android游戏开发的一个开源示例库,它基于OpenGL ES 2.0,是Android平台上进行2D游戏开发的重要工具。这个资源集合为初学者提供了一个良好的学习平台,帮助他们理解和掌握Android...

    Android游戏源码切水果小游戏有详细注释.zip

    【Android游戏开发基础】 在Android平台上,游戏开发主要依赖于Java或Kotlin语言,结合Android SDK(Software Development Kit)和Android Studio IDE进行。本压缩包中的"Android游戏源码切水果小游戏有详细注释"是...

    android开发的飞机小游戏

    10. **测试与发布**:游戏开发完成后,需在多种设备和Android版本上进行测试,确保兼容性。发布前应完成APK签名、版本号管理、权限设置等工作,遵循Google Play的提交规范。 综上所述,开发一个Android平台的飞机小...

    基于Android的飞机大战游戏

    4. **游戏框架**:虽然描述中没有提及具体的游戏框架,但通常开发Android游戏时会用到如LibGDX这样的框架。LibGDX提供了丰富的图形、音频和输入处理功能,简化了游戏开发过程。 5. **OpenGL ES**:飞机大战可能使用...

    android飞机游戏.rar

    一、Android游戏开发基础 1. Android SDK:Android飞机游戏的开发离不开Android Software Development Kit(SDK),它是Android系统开发的基础工具,包含了编译、调试和部署应用所需的全部组件。开发者需要在...

Global site tag (gtag.js) - Google Analytics