有没有想过爆炸是如何产生的? 让我们绕个弯路,尝试实现基本的粒子爆炸。

爆炸不过是一堆散布在屏幕上的,源自单个点的粒子(无论是像素,小形状还是图像)。 为了方便起见,并非总是如此,而是为了简洁起见,我们将假定所有粒子都源自单个点。

想想烟花。 一颗微小的小火箭弹起来并爆炸成数百颗闪闪发光的小星星,它们在坠落时逐渐消失。 发生的情况是,火箭中心的巨大力将身体撕裂(从而产生粒子),并在爆炸点附近将它们随机散布。

为简单起见,我们将创建一些粒子,将它们放置在一个位置(原点)并赋予它们随机的力。 力是矢量。 这意味着它具有大小和方向。 大小将决定其速度,其方向将告诉粒子走哪条路。

粒子

类文件:

public class Particle {public static final int STATE_ALIVE = 0;    // particle is alivepublic static final int STATE_DEAD = 1;        // particle is deadpublic static final int DEFAULT_LIFETIME     = 200; // play with thispublic static final int MAX_DIMENSION      = 5;   // the maximum width or heightpublic static final int MAX_SPEED         = 10;  // maximum speed (per update)private int state;         // particle is alive or deadprivate float width;        // width of the particleprivate float height;       // height of the particleprivate float x, y;            // horizontal and vertical positionprivate double xv, yv;       // vertical and horizontal velocityprivate int age;         // current age of the particleprivate int lifetime;     // particle dies when it reaches this valueprivate int color;           // the color of the particleprivate Paint paint;        // internal use to avoid instantiation
}

粒子不过是一个带有一些属性的小矩形(可以是图像,圆形或任何其他形状,但是在我们的情况下,我们使用的是矩形)。

它具有状态 。 这表明粒子是存活的还是死亡的。 一个质点是活着的时候,它的颜色不是黑色的(它具有不褪色)和它的年龄还没有达到其寿命 。 稍后再详细介绍。

它有一个位置 。 它在2D坐标系中的位置由2个点表示: xy

它还具有速度和方向。 您记得速度是一个向量,因此它在2D中具有2个分量。 在3D模式下,它也将具有z分量,但我们暂时停留在2D模式下。 为了简单起见,我们为此添加两个属性。 vxvy

粒子的年龄在开始时是0,并且在每次更新时都会增加。

寿命是粒子死亡之前可以达到的最大年龄。

其余的是颜色油漆 。 这些仅用于绘图。

如果您回想起先前的条目,则游戏更新无非就是调用游戏中每个实体的更新方法并显示它们。 粒子的更新方法非常简单。

但是首先我们需要创建粒子:

public Particle(int x, int y) {this.x = x;this.y = y;this.state = Particle.STATE_ALIVE;this.widht = rndInt(1, MAX_DIMENSION);this.height = this.widht;this.lifetime = DEFAULT_LIFETIME;this.age = 0;this.xv = (rndDbl(0, MAX_SPEED * 2) - MAX_SPEED);this.yv = (rndDbl(0, MAX_SPEED * 2) - MAX_SPEED);// smoothing out the diagonal speedif (xv * xv + yv * yv > MAX_SPEED * MAX_SPEED) {xv *= 0.7;yv *= 0.7;}this.color = Color.argb(255, rndInt(0, 255), rndInt(0, 255), rndInt(0, 255));this.paint = new Paint(this.color);
}

检查粒子的创建,它应该是直接的。

您会注意到在位置xy处创建了粒子。

状态设置为活着
我们想要随机化矩形的大小,因为爆炸会产生不同大小和形状的粒子,但是我们只会随机化大小和颜色。
我编写了一些辅助方法,这些方法为我提供了随机数,为此请检查完整的源代码。

接下来设置寿命 。 每个粒子将具有相同的寿命。

当然, 年龄0 ,因为粒子刚出生。

接下来是有趣的一点。 这是非常业余的。 为了设置速度,我对速度矢量的2个分量( vxvy )使用了2个随机数。 之所以需要平滑,是因为如果两个分量都接近最大值,那么最终的幅度将超过最大速度。 您可以使用具有随机度的简单三角函数代替此函数。

可以设置的是再次随机化的颜色

你有它。

粒子的update()方法。

public void update() {if (this.state != STATE_DEAD) {this.x += this.xv;this.y += this.yv;// extract alphaint a = this.color >>> 24;a -= 2; // fade by 2if (a <= 0) { // if reached transparency kill the particlethis.state = STATE_DEAD;} else {this.color = (this.color & 0x00ffffff) + (a << 24);      // set the new alphathis.paint.setAlpha(a);this.age++; // increase the age of the particle}if (this.age >= this.lifetime) {   // reached the end if its lifethis.state = STATE_DEAD;}}
}

很简单 每次更新时,都会根据速度设置位置,并减小粒子颜色的alpha分量。 换句话说,粒子正在褪色。

如果年龄超过寿命或不透明度为0(这意味着它是完全透明的),则该粒子将被声明为死亡。

如果您想知道彩色魔术,那么一旦获得按位运算符,它就非常简单。 别担心,我也是垃圾,只要确保您知道要看的地方即可。 这是颜色成分以及如何使用按位运算符对其进行操作的很好的解释: http : //lab.polygonal.de/2007/05/10/bitwise-gems-fast-integer-math/ 。 它比使用对象要快,但是您也可以安全地使用android方法。

就像关于颜色的附注
您可以在Android中将颜色指定为int。 如果您熟悉rgb和argb,那就太好了。 rgb是24位彩色,而argb是32位。 它还具有透明度/不透明度的alpha分量。

不透明度值:0 =透明,255 =完全不透明。

要以十六进制表示一个int,只需在其前面加上0x即可 。 十六进制的颜色很简单:例如0x00FF00为绿色。 模式为: 0xRRGGBB (红色,绿色,蓝色)。 现在要添加Alpha,请将其添加到开头。 0xAARRGGBB
因为它是十六进制的,所以值在00到FF之间。 0为0,FF为255(十进制)。 当您使用诸如color(a,r,g,b)之类的分量创建颜色时(例如: new Color(125,255,0,0)创建半透明红色),您可以简单地用表示为整数的整数来创建它像这样十六进制: new Color(0x80FF0000);

这就是您提取argb颜色分量的方式。

int color = 0xff336699;
int alpha = color >>> 24;
int red   = color >>> 16 & 0xFF;
int green = color >>>  8 & 0xFF;
int blue  = color & 0xFF;

draw()方法再次很简单。

public void draw(Canvas canvas) {paint.setColor(this.color);canvas.drawRect(this.x, this.y, this.x + this.widht, this.y + this.height, paint);
}

在此阶段,尝试在游戏面板中创建一些粒子,然后看看会发生什么。

爆炸

爆炸不过是数百个来自某个地方(即起源)的粒子。

在上图中,您看到一个简单爆炸的前4个更新。 所有粒子都具有相同的速度,但是它们以不同的方向散布。 每个圆圈是一个更新。

爆炸的主要特性是:

public class Explosion {public static final int STATE_ALIVE  = 0;   // at least 1 particle is alivepublic static final int STATE_DEAD       = 1;   // all particles are deadprivate Particle[] particles;          // particles in the explosionprivate int x, y;                      // the explosion's originprivate int size;                     // number of particlesprivate int state;                        // whether it's still active or not
}

它包含粒子阵列。 大小是颗粒数。 如果爆炸中至少有一个活着的粒子,那么它就是活着的。

更新非常简单。 它遍历所有粒子,并在每个粒子上调用update()方法。 draw()同上。

在我们的应用程序中,我们将在触摸屏幕的地方创建爆炸。
构造函数非常简单:

public Explosion(int particleNr, int x, int y) {Log.d(TAG, "Explosion created at " + x + "," + y);this.state = STATE_ALIVE;this.particles = new Particle[particleNr];for (int i = 0; i < this.particles.length; i++) {Particle p = new Particle(x, y);this.particles[i] = p;}this.size = particleNr;
}

颗粒阵列在触地位置处被填充。

在我们的应用中,我们最多允许爆炸10次。 因此,在MainGamePanel中,我们声明了一系列爆炸。

private Explosion[] explosions;

surfaceCreated方法中,我们实例化该数组并将其填充为null

explosions = new Explosion[10];
for (int i = 0; i < explosions.length; i++) {explosions[i] = null;
}

onTouchEvent是我们创建爆炸的地方。

public boolean onTouchEvent(MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_DOWN) {// check if explosion is null or if it is still activeint currentExplosion = 0;Explosion explosion = explosions[currentExplosion];while (explosion != null && explosion.isAlive() && currentExplosion < explosions.length) {currentExplosion++;explosion = explosions[currentExplosion];}if (explosion == null || explosion.isDead()) {explosion = new Explosion(EXPLOSION_SIZE, (int)event.getX(), (int)event.getY());explosions[currentExplosion] = explosion;}}return true;
}

我们要做的是遍历爆炸,当我们发现第一个null (这意味着我们从未在实例中使用过)或第一次死爆炸时,我们会在触摸位置创建一个新的null

updaterender方法很简单。 遍历爆炸,如果爆炸不为null并且仍然存在,则分别调用其update和draw方法。

在最后的代码中,我为屏幕添加了边框作为墙,并为粒子添加了基本的碰撞检测功能,以使粒子从墙反弹。 正在传输墙作为参考,更新方法将检查是否与墙发生碰撞。 将其用作练习并消除碰撞,然后尝试将图像附加到粒子而不是矩形。 要创建爆炸,只需单击屏幕。

它看起来应该像这样:

探索代码并玩得开心。

在此处下载( android.particles.tgz )。

参考:来自JCG合作伙伴Tamas Jano的Android进行的《粒子爆炸》,来自“ Against The Grain ”博客。

不要忘记查看我们的新Android游戏 ArkDroid (以下屏幕截图) 。 您的反馈将大有帮助!
相关文章:
  • Android游戏开发教程简介
  • Android游戏开发–游戏创意
  • Android游戏开发–创建项目
  • Android游戏开发–基本游戏架构
  • Android游戏开发–基本游戏循环
  • Android游戏开发–使用Android显示图像
  • Android游戏开发–在屏幕上移动图像
  • Android游戏开发–游戏循环
  • Android游戏开发–测量FPS
  • Android游戏开发–雪碧动画
  • Android游戏开发–设计游戏实体–策略模式
  • Android游戏开发–使用位图字体
  • Android游戏开发–从Canvas切换到OpenGL ES
  • Android游戏开发–使用OpenGL ES显示图形元素(原语)
  • Android游戏开发– OpenGL纹理映射
  • Android游戏开发–设计游戏实体–状态模式
  • Android游戏文章系列

翻译自: https://www.javacodegeeks.com/2011/08/android-game-development-particle.html

Android游戏开发–粒子爆炸相关推荐

  1. android爆炸粒子_Android游戏开发–粒子爆炸

    android爆炸粒子 有没有想过爆炸是如何产生的? 让我们绕个弯路,尝试实现基本的粒子爆炸. 爆炸不过是一堆散布在屏幕上的,源自单个点的粒子(无论是像素,小形状还是图像). 为了方便起见,并非总是如 ...

  2. Android游戏开发–雪碧动画

    如果到目前为止您仍然关注该系列,我们将在处理触摸,显示图像和移动它们方面广为人知. 但是,动态图像看起来很呆板,因为它看起来确实是假的和业余的. 为了给角色一些生活,我们将需要做更多的事情. 这就是动 ...

  3. Android游戏开发–游戏循环

    游戏循环是每个游戏的心跳. 到目前为止,我们仅使用了非常简单的一种(您可以在此处找到),无法控制我们更新游戏状态的速度或速度以及要渲染的帧. 概括地说,最基本的游戏循环是while循环,该循环一直执行 ...

  4. android游戏开发_Android游戏开发–游戏循环

    android游戏开发 游戏循环是每个游戏的心跳. 到目前为止,我们仅使用了非常简单的一种(您可以在此处找到),无法控制我们更新游戏状态的速度或速度以及要渲染的帧. 概括地说,最基本的游戏循环是whi ...

  5. Android游戏开发实践指南(华章程序员书库)

    <Android游戏开发实践指南(华章程序员书库)> 基本信息 原书名:Learning Android Game Programming:A Hands-On Guide to Buil ...

  6. Android 游戏开发入门

    Android 游戏开发入门 图书描述: Android系统已经红遍了大江南北,持有Android设备的人也在不断增长.看着大街上用手指划着手机玩游戏的人,你有没有一种自己做一个游戏的想法呢?然而,入 ...

  7. 【邀您参加】Android大讲堂-Android游戏开发之捕鱼游戏

    来源:华清远见嵌入式培训中心 ● 揭开Android底层架构的神秘面纱 Android应用开发与底层开发一网打尽! ● 全程免费 网络直播 实时互动 业内专家精辟讲解 项目案例透彻分析 作为目前全球最 ...

  8. Android游戏开发起步(译文)

    英文 http://dev.chinamobile.com/cmdn/bbs/thread-13718-1-1.html 如果你有兴趣为Android平台开发游戏,有很多你需要了解的东西.我是Ligh ...

  9. Android游戏开发大全

    查看书籍详细信息: Android游戏开发大全 编辑推荐 帮助读者掌握Android游戏项目的开发流程 和项目驱动的好书! 内容简介 <Android游戏开发大全>以Android手机游戏 ...

最新文章

  1. JavaScript定义函数的几种方式
  2. 快速排序时间复杂度为O(n×log(n))的证明
  3. LockSettingsService的setLockCredentialInternal函数详解
  4. Python小游戏(XO大战)
  5. Zstd 压缩性能分析(含比较)
  6. mysql 对表插入多行_MySQL表中怎么一次插入两行或更多行
  7. 第七天Python学习记录
  8. jira 查找issue_JIRA使用教程:高级搜索—字段参考4/4
  9. 890. Find and Replace Pattern找出匹配形式的单词
  10. 系统同传软件_语情快递 | 手语同传AI,你见过吗?
  11. 基于MUI框架的影视播放APP的设计与实现毕业设计论文参考【原查重5.1%】
  12. MATLAB处理txt文档数据——以处理pscad输出数据为例
  13. CSS font-family常见中文字体对应的英文名称
  14. 2023南京航空航天大学计算机考研信息汇总
  15. 斜率、梯度(完全不一样的理解)
  16. MaskRNN Instance Level Video Object Segmentation 论文翻译
  17. 软件测试工程师Linux笔试题及答案(三)
  18. OPPO Pad 评测怎么样
  19. Python学习——分支结构
  20. 搜狗输入法在idea打不了汉字_好烦啊,IDEA输入中文时输入法候选词框不跟随光标...

热门文章

  1. android连接天天模拟器方法
  2. recommend a book for android newcomer
  3. nextInt和nextLine以及next方法的区别
  4. Java中的animal类
  5. uni-app树形列表(单选,多选)
  6. 工业相机、镜头接口:C口与CS口
  7. 非智能手机斗破苍穹Java_支付宝推JAVA版 非智能手机增支付功能
  8. 共享经济发展新机遇 传统广告转型共享广告布局新型商业模式
  9. SQL分类和命名规范
  10. 渗透测试中常见的一些名词解释