libgdx 2D 粒子效果二

在上一篇随笔中,我们能够把粒子效果在stage中使用了。

想了想,在实际应用中粒子效果可能有2中使用的情况:

1. 单独的粒子效果,比如一个飞行的火球。他跟真正的Actor没啥关系,只有自己的position或者说飞行轨迹。

施法者放完后爱哪玩去哪玩去,粒子效果跟他无关了。

2. 跟真正的Actor相关的粒子效果,比如飞机发动机的火焰,或者飞机爆炸的效果。

他一直跟着飞机在动。

-------------------当然以上两种未必用粒子效果实现,我只是这么说。。。

对于第二种情况,不防封装一个简单的Actor试试。

上代码:

 1 public class ActorWithEffect extends Actor {
 2     private Texture mTexture;
 3     private TextureRegion region;
 4     private ParticleEffect particleEffect;
 5     private Vector2 acc = new Vector2();
 6     private boolean dead = false;
 7     private float deadTime = 0f;
 8     private Sound bomb;
 9
10     public ActorWithEffect()
11     {
12         mTexture = new Texture("badlogic.jpg");
13         region = new TextureRegion(mTexture);
14         particleEffect = new ParticleEffect();
15         particleEffect.load(Gdx.files.internal("data/abc.p"), Gdx.files.internal("data"));//第一个参数是粒子效果文件,第二个参数是图片basepath(这里应该有一个默认的particle.png别忘了)
16         bomb = Gdx.audio.newSound(Gdx.files.internal("bomb.mp3"));
17     }
18
19     @Override
20     public void draw(Batch batch, float parentAlpha)
21     {
22         Color color = getColor();
23         batch.setColor(color.r, color.g, color.b, color.a * parentAlpha);
24         if(deadTime<2.0f){//开始消灭时,再显示2秒图片,剩余1秒只显示销毁粒子效果
25             batch.draw(region, getX(), getY(),
26                     region.getRegionWidth() / 2,
27                     region.getRegionHeight() / 2,
28                     region.getRegionWidth(),
29                     region.getRegionHeight(), getScaleX(), getScaleY(),
30                     getRotation());
31         }
32         if(dead){
33             particleEffect.draw(batch);
34         }
35
36         if(deadTime>3.0f){
37             this.getStage().getActors().removeValue(this,true);
38             this.clear();//放这合适吗?
39         }
40     }
41
42     @Override
43     public void act(float delta) {
44         super.act(delta);
45         acc.set(getWidth() / 2, getHeight() / 2);
46         localToStageCoordinates(acc);
47         particleEffect.setPosition(acc.x, acc.y);
48         particleEffect.update(delta);
49         if(dead){
50             deadTime = deadTime+delta;
51         }
52     }
53
54     public void startDestroy(){
55         this.dead = true;
56         particleEffect.start();
57         bomb.play();
58     }
59
60     @Override
61     public void clear() {//还没明白这个方法啥时候调用,请指教啊
62         mTexture.dispose();
63         particleEffect.dispose();
64         bomb.dispose();
65         super.clear();
66     }
67 }
 1 public class ParticleTest2 extends ApplicationAdapter implements InputProcessor {
 2     private Stage stage;
 3     private static final Logger LOGGER = new Logger(ParticleTest2.class.getName(),Application.LOG_DEBUG);
 4     private ActorWithEffect actor;
 5     @Override
 6     public void create () {
 7         Gdx.app.setLogLevel(Application.LOG_DEBUG);
 8         stage = new Stage();
 9         Gdx.input.setInputProcessor(this);
10
11         actor = new ActorWithEffect();
12         actor.setPosition(Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2);
13         stage.addActor(actor);
14     }
15
16     @Override
17     public void render () {
18         Gdx.gl.glClearColor(0.2f, 0.2f, 0.2f, 1);
19         Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
20         stage.act();
21         stage.draw();
22     }
23
24     @Override
25     public void dispose() {
26
27         stage.dispose();
28         super.dispose();
29     }
30
31     @Override
32     public void resize(int width, int height) {
33         stage.getViewport().update(width,height);
34         super.resize(width, height);
35     }
36
37     @Override
38     public boolean keyDown(int keycode) {
39         if(keycode == Input.Keys.J){
40             actor.startDestroy();
41             actor = null;
42         }
43         return false;
44     }
45
46     @Override
47     public boolean keyUp(int keycode) {
48         return false;
49     }
50
51     @Override
52     public boolean keyTyped(char character) {
53         return false;
54     }
55
56     @Override
57     public boolean touchDown(int screenX, int screenY, int pointer, int button) {
58         return false;
59     }
60
61     @Override
62     public boolean touchUp(int screenX, int screenY, int pointer, int button) {
63         return false;
64     }
65
66     @Override
67     public boolean touchDragged(int screenX, int screenY, int pointer) {
68         return false;
69     }
70
71     @Override
72     public boolean mouseMoved(int screenX, int screenY) {
73         return false;
74     }
75
76     @Override
77     public boolean scrolled(int amount) {
78         return false;
79     }
80 }

以上代码中,按下J键飞机自毁。

actor的clear方法什么时候调用恰当我还没弄明白。我理解上,这个方法应该是有东西自动调啊。

请指教啊,这个方法也是我从网上抄来的,忘了是哪了。

时间: 2024-10-20 07:58:14

libgdx 2D 粒子效果二的相关文章

SpriteBuilder实现2D精灵光影明暗反射效果(二)

使用SpriteBuilder新建一个项目,将默认MainScene.ccb中的内容统统删掉,此时场景应该是一片漆黑. 将官网中的2张图片以及我自己做的2张图片全部拖拽到其文件视图中去: 其中加_n后缀的图片表示原图的法线贴图. 将2张不带_n后缀的图片分别拖到黑黑的场景中去,调整到合适位置. 分别将2个精灵的Normal map设置为_n后缀的对应图片: 分别打开2个精灵的Lighting特效.这时已经可以看到光影效果,可惜这时SpriteBuilder给你的"假象",如果此时编译运

SkylineGlobe 如何使用二次开发接口创建粒子效果

SkylineGlobe在6.6版本,ICreator66接口新增加了CreateEffect方法,用来创建粒子效果对象: 以及ITerrainEffect66对象接口,可以灵活设置粒子效果对象的相关属性: 下图是TerraExplorer Pro中对应的菜单界面: 下图是ITerrainEffect66接口的属性: SkylineGlobe提供的示例代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml&qu

超炫的粒子效果!代码,就应该这么写!

最近瞎逛的时候发现了一个超炫的粒子进度效果,有多炫呢?请擦亮眼镜! 粗略一看真的被惊艳到了,而且很实用啊有木有!这是 Jack Rugile 写的一个小效果,源码当然是有的.聪慧如你,肯定觉得这个东西so easy 要看啥源码,给我3分钟我就写出来了吧.所以你的思路可能是: 1)进度条的实现没什么好说的,简单的一个 fillRect(0,0,long,20),long和20是分别进度条的长宽.然后每帧动画调用前将画布清除clearRect(0,0,canvas.width,canvas.heig

使用Unity创造动态的2D水体效果

者:Alex Rose 在本篇教程中,我们将使用简单的物理机制模拟一个动态的2D水体.我们将使用一个线性渲染器.网格渲染器,触发器以及粒子的混合体来创造这一水体效果,最终得到可运用于你下款游戏的水纹和水花.这里包含了Unity样本源,但你应该能够使用任何游戏引擎以相同的原理执行类似的操作. 设置水体管理器 我们将使用Unity的一个线性渲染器来渲染我们的水体表面,并使用这些节点来展现持续的波纹. unity-water-linerenderer(from gamedevelopment) 我们将

IOS开发——UI进阶篇(十八)核心动画小例子,转盘(裁剪图片、自定义按钮、旋转)图片折叠、音量震动条、倒影、粒子效果

一.转盘(裁剪图片.自定义按钮.旋转) 1.裁剪图片 将一张大图片裁剪为多张 // CGImageCreateWithImageInRect:用来裁剪图片 // image:需要裁剪的图片 // rect:裁剪图片的尺寸,传递是像素 CGImageRef norImage = CGImageCreateWithImageInRect(norBigImage.CGImage, clipRect); 2.每次点击按钮立马变为选中状态,并且取消上次的按钮的选中状态 当然还要重写- (void)setH

Canvas + JavaScript 制作图片粒子效果

首先看一下源图和转换成粒子效果的对比图:       左侧图片为源图,右侧图片为粒子效果图.该效果是在Canvas画布上制作的.将图片制作成粒子效果相对而言是比较简单的.重点了解两个知识点即可 1:图片是通过image对象形式绘制在画布上的,然后使用Canvas的getImageData接口,获取图像的像素信息. var imageData=ctx.getImageData(x, y, width, height); 参数说明:x,y为画布上的x和y坐标 width,height为获取指定区域图

使用带粒子效果的 CAEmitterLayer

1.用CAEmitterLayer产生粒子效果 2.封装CAEmitterLayer 3.封装下雪.下雨的粒子效果控件 一.用CAEmitterLayer产生粒子效果 - (void)emitterLayer { // 1.创建出Layer CAEmitterLayer *emitterLayer = [CAEmitterLayer layer]; // 显示边框 emitterLayer.borderWidth = 1.f; // 给定尺寸 emitterLayer.frame = CGRec

three.js粒子效果(分别基于CPU&amp;GPU实现)

前段时间做了一个基于CPU和GPU对比的粒子效果丢在学习WebGL的群里,技术上没有多作讲解,有同学反馈看不太懂GPU版本,干脆开一篇文章,重点讲解基于GPU开发的版本. 一.概况 废话不多说,先丢上demo,用移动设备更能明显感觉性能差异. 维护粒子位移.颜色.尺寸:GPU版本  CPU版本 维护粒子位移:GPU版本  CPU版本 结论:同时需要维护多种粒子特征变化时,GPU有明显优势.只是维护粒子位移时,GPU版本稍流畅,但优势并不明显.当然,这还得具体到设备,一些中低端Android机器,

粒子效果演示

<!DOCTYPE html> <html lang="en"> <head> <meta charset=utf-8> <title>粒子效果演示 </title> <meta name="description" content="HTML5/canvas demo, 500 particles to play around with." /> <met