文档章节

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

flyoahc
 flyoahc
发布于 2015/06/18 08:58
字数 909
阅读 633
收藏 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
libgdx 概述

libgdx 是一个跨平台的2D/3D的游戏开发框架,由Java/C/C++语言编写而成,基于 Apache License 2.0 协议,对商业使用和非商业使用均免费,代码托管于github 优点 1、 兼容性强 libgdx兼容大多...

长平狐
2013/01/06
600
0
【Visual C++】游戏开发笔记二十三 游戏基础物理建模(五) 粒子系统模拟(二)

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

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

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

flyoahc
2015/06/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在 Linux 系统查询机器最近重启时间

在你的 Linux 或类 UNIX 系统中,你是如何查询系统上次重新启动的日期和时间?怎样显示系统关机的日期和时间? last 命令不仅可以按照时间从近到远的顺序列出该会话的特定用户、终端和主机名...

来来来来来
33分钟前
0
0
Redis协议是什么样的

前言 我们用过很多redis的客户端,有没有相过自己撸一个redis客户端? 其实很简单,基于socket,监听6379端口,解析数据就可以了。 redis协议 解析数据的过程主要依赖于redis的协议了。 我们...

春哥大魔王的博客
50分钟前
2
0
乱入Linux界的我是如何学习的

欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux。 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在...

linuxCool
今天
1
0
携程Apollo统一配置中心的搭建和使用(java)

一.Apollo配置中心介绍 1、What is Apollo 1.1 Apollo简介 Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到...

morpheusWB
今天
1
0
远程获得的有趣的linux命令

使用这些工具从远程了解天气、阅读资料等。 我们即将结束为期 24 天的 Linux 命令行玩具日历。希望你有一直在看,如果没有,请回到开始,从头看过来。你会发现 Linux 终端有很多游戏、消遣和...

Linux就该这么学
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部