文档章节

Libgdx学习笔记:自己封装各种粒子特效

flyoahc
 flyoahc
发布于 2015/06/18 08:58
字数 909
阅读 617
收藏 5

实现的思路:缓存池+(Image或者CHActor) + Actions

例:实现星星右中心点向圆形周围扩散,且星星不断的旋转,缩小,到达圆上时消失。

这个需求里面对于单个星星包含的Action有:

moveTo 移动

roatateBy 旋转

scaleTo 缩小

我们使用Actions.parallel(...)来同时执行上面三个Action。当然我们再执行上面所有Action还需要加上最后的RunnableAction.用来处理粒子结束后的其他工作(释放星星对象到缓存池)。

单个星星的运动过程了解后,剩下的就简单了,我们约定使用30个星星来实现这个效果,在360度的范围随机30次,得到各个星星的运动目标位置,随机整个运动时长。OK。加入舞台,就可以了。


同样,如果我需要一个烟花效果呢?

  1. 确定一个矩形范围

  2. 在矩形范围随机位置,播放上面的星星效果,这就是个烟花释放的效果。


理解了这种思路,其他的粒子的效果都不在话下了,自由扩展吧!!!


下面为本人封装两种粒子效果:


package com.oahcfly.chgame.core.helper;

import java.util.Random;

import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.scenes.scene2d.Action;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.actions.Actions;
import com.badlogic.gdx.utils.Align;
import com.badlogic.gdx.utils.Pool;
import com.badlogic.gdx.utils.Pool.Poolable;
import com.badlogic.gdx.utils.Pools;
import com.oahcfly.chgame.core.Chao;
import com.oahcfly.chgame.core.actions.CHScheduleAction;
import com.oahcfly.chgame.core.mvc.CHActor;

/**
 * 
 * <pre>
 * 
 * 可自由扩展的粒子播放器
 * <设置粒子图片路径即可>
 * date: 2015年3月26日
 * </pre>
 * 
 * @author caohao
 */
public class CHAutoParticle implements Poolable {
	private Random random = new Random();

	private Pool<CHActor> starPool = null;

	// 半径
	private int cradius = 100;

	public void setRadius(int radius) {
		cradius = radius;
	}

	private String imgString;

	// 设置图片路径assets目录下
	public void setImagePath(final String imgPath) {
		this.imgString = imgPath;
		starPool = (Pool<CHActor>) Pools.get(CHActor.class);
	}

	private CHActor getActor() {
		CHActor chActor = starPool.obtain();
		Texture texture = Chao.game.getTexture(imgString);
		chActor.setBgTexture(texture);
		chActor.setSize(50, 50);
		chActor.setOrigin(com.badlogic.gdx.utils.Align.center);
		float r = (float) ((Math.random() * 0.4f) + 0.7f);
		float g = (float) ((Math.random() * 0.4f) + 0.7f);
		float b = (float) ((Math.random() * 0.4f) + 0.7f);
		chActor.setColor(r, g, b, 1);
		return chActor;
	}

	/**
	 * 
	 * @param imgPath
	 *            图片路径
	 */
	public CHAutoParticle(final String imgPath) {
		setImagePath(imgPath);
	}

	public CHAutoParticle() {

	}

	/**
	 * 
	 * <pre>
	 *   <由中心向周围扩散并且旋转缩小>
	 *    播放粒子效果
	 * date: 2015年3月26日
	 * </pre>
	 * 
	 * @author caohao
	 * @param stage
	 * @param centerX
	 *            中心点位置X
	 * @param centerY
	 *            中心点位置Y
	 */
	public void playCircleParticle(Stage stage, float centerX, float centerY) {
		// 半径范围
		float initRadius = cradius;
		// 星星数量
		float starNum = 30;
		float initStarDuration = 0.3f;
		for (int i = 0; i < starNum; i++) {
			// 随机角度
			int degree = random.nextInt(360) + 1;
			// 随机运行时间
			float starDuration = (float) (initStarDuration + random.nextInt(5) / 10f);
			// 随机半径
			float radius = initRadius + random.nextInt(10);
			final CHActor starImg = getActor();
			starImg.setPosition(centerX, centerY, Align.center);
			starImg.setScale(1);
			// 目标点
			float targetX = centerX + (float) (radius * Math.cos(Math.toRadians(degree)));
			float targetY = centerY + (float) (radius * Math.sin(Math.toRadians(degree)));

			final boolean islast = i == starNum - 1;
			// 运动同时进行旋转,缩小
			Action parallelAction = Actions.parallel(Actions.moveTo(targetX, targetY, starDuration),
					Actions.rotateBy(360, starDuration), Actions.scaleTo(0.1f, 0.1f, starDuration));
			starImg.addAction(Actions.sequence(parallelAction, Actions.run(new Runnable() {

				@Override
				public void run() {
					// 释放加移除
					starPool.free(starImg);
					starImg.remove();
					if (islast) {
						Pool<CHAutoParticle> pool = Pools.get(CHAutoParticle.class);
						pool.free(CHAutoParticle.this);
					}
				}
			})));
			stage.addActor(starImg);
		}
	}

	/**
	 * 
	 * <pre>
	 * <烟花效果>
	 * 
	 * date: 2015年3月26日
	 * </pre>
	 * 
	 * @author caohao
	 * @param stage
	 * @param rangeRectangle
	 *            烟花范围
	 */
	public void playFireWorks(final Stage stage, final Rectangle rangeRectangle, final int playCount,
			final Runnable callbackRunnable) {
		Action runnableAction = Actions.run(new Runnable() {

			int count;

			@Override
			public void run() {
				count++;
				if (count > playCount) {
					for (Action action : stage.getRoot().getActions()) {
						if (action instanceof CHScheduleAction) {
							((CHScheduleAction) action).finish();
						}
					}
					return;
				}
				for (int i = 0; i < 10; i++) {
					int x = (int) (random.nextInt((int) rangeRectangle.width) + rangeRectangle.x);
					int y = (int) (random.nextInt((int) rangeRectangle.height) + rangeRectangle.y);
					playCircleParticle(stage, x, y);
				}
			}
		});

		Runnable runnable = new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				if (callbackRunnable != null) {
					callbackRunnable.run();
				}

				Pool<CHAutoParticle> pool = Pools.get(CHAutoParticle.class);
				pool.free(CHAutoParticle.this);

			}
		};
		CHScheduleAction scheduleAction = new CHScheduleAction(0.5f, playCount, runnableAction);
		scheduleAction.setCallbackRunnable(runnable);
		stage.addAction(scheduleAction);
	}

	@Override
	public void reset() {
		// TODO Auto-generated method stub
		cradius = 100;
		if (starPool != null) {
			starPool.clear();
		}
	}

	public static CHAutoParticle obtain(String imgPath) {
		Pool<CHAutoParticle> pool = Pools.get(CHAutoParticle.class);
		CHAutoParticle chAutoParticle = pool.obtain();
		chAutoParticle.setImagePath(imgPath);
		return chAutoParticle;
	}
}


  基于libGdx二次封装的CHGame框架 :

     https://git.oschina.net/oahcfly/CHGame



© 著作权归作者所有

共有 人打赏支持
flyoahc
粉丝 12
博文 37
码字总数 15728
作品 0
南京
程序员
Libgdx 1.6.0 发布,开源跨平台游戏开发框架

[1.6.0] -API更改:GlyphLayout xAdvances现在有了额外的开始入口,这需要实现tighter text bounds。 -API更改:Label#getTextBounds更改成getGlyphLayout。不仅仅暴露width和height。 在2...

宋志辉
2015/05/08
5.4K
4
使用SpriteBuilder制作Cocos2D游戏完全中文教程(七)

使用SpriteBuilder添加粒子特效(Add Particle Effects using SpriteBuilder) SpriteBuilder集成了一个很强大的粒子特效设计器,我们将用他来定义我们的第一个粒子效果的风格。现在,当我们的...

wealpan
2014/03/03
0
1
从零开始学基于ARKit的Unity3d游戏开发系列13

在上一课的内容中,我们学习了如何添加敌人受伤时的粒子特效,而在这一课的内容中,我们将继续学习添加其它特效,也就是攻击没有落到敌人身上时的特效。此外,我们还希望当敌人受到攻击时不但...

王寒
01/02
0
0
【Visual C++】游戏开发笔记二十三 游戏基础物理建模(五) 粒子系统模拟(二)

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。 http://blog.csdn.net/zhmxy555/article/details/7607916 作者:毛星云 邮箱: happylifemxy@qq.com 期待着与志同道合的朋友们相互交...

长平狐
2012/11/12
92
0
Libgdx学习笔记:封装自己的Actor

为什么要去封装我们自己的Actor? 答:Actor本身可能无法满足我们的开发需求,或者无法支持各种各样的效果,由此需要在其基础上进行拓展。 下面贴出本人二次封装的CHActor代码,供大家参考:...

flyoahc
2015/06/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

搬瓦工镜像站bwh1.net被DNS污染,国内打不开搬瓦工官网

今天下午(2018年10月17日),继搬瓦工主域名bandwagonhost.com被污染后,这个国内的镜像地址bwh1.net也被墙了。那么目前应该怎么访问搬瓦工官网呢? 消息来源:搬瓦工优惠网->搬瓦工镜像站b...

flyzy2005
15分钟前
0
0
SpringBoot自动配置

本篇介绍下,如何通过springboot的自动配置,将公司项目内的依赖jar,不需要扫描路径,依赖jar的情况下,就能将jar内配置了@configuration注解的类,创建到IOC里面 介绍下开发环境 JDK版本1.8 spr...

贺小五
今天
3
0
命令行新建Maven多项目

参考地址 # DgroupId 可以理解为包名# DartifactId 可以理解为项目名mvn archetype:generate -DgroupId=cn.modfun -DartifactId=scaffold -DarchetypeArtifactId=maven-archetype-quickst......

阿白
今天
1
0
OSChina 周四乱弹 —— 上帝对我单身年限的惩罚越来越长了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享张卫健的单曲《身体健康》 《身体健康》- 张卫健 手机党少年们想听歌,请使劲儿戳(这里) 昨天是重阳节咯, 可惜小小编辑总是晚...

小小编辑
今天
12
1
django rest framework 外键序列化方法与问题总结

django rest framework 外键序列化方法与问题总结 当借口中需要出现一对多关系的时候,我们可以用rest_framwork的序列化功能来处理,代码如下. # models.pyfrom django.db import modelscl...

_Change_
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部