留心的朋友会发现,安装完微信4.5后,会有一个跳动的火焰、并播放《一无所有》的欢迎页。本篇文章模拟的是火焰跳动的效果。
一、LibGdx游戏引擎介绍
LibGdx是一款基于OpenGL ES技术开发的Android游戏引擎,支持Android平台下的2D游戏开发,物理引擎采用Box2D实现
LibGdx是一个跨平台的2D/3D的游戏开发框架,它由Java/C/C++语言编写而成。它基于Apache License, Version 2.0协议,对商业使用和非商业使用均免费。代码托管于Github中。最新版本为0.9.8。
官方网站:http://code.google.com/p/libgdx/
LibGdx单就性能角度来说,堪称是一款非常强大的 Android游戏引擎。
二、粒子特效
为模拟现实中的水、火、雾、气等效果由各种三维软件开发的制作模块,原理是将无数的单个粒子组合使其呈现出固定形态,借由控制器,脚本来控制其整体或单个的运动,模拟出现真实的效果。
三、LibGdx粒子特效编辑器
下载地址:http://code.google.com/p/libgdx/wiki/ParticleEditor
用来编辑粒子效果的编辑器。(参数可以任意尝试设置)
打开后界面如下, 可直接保存效果为my.p,为后续使用。
四、具体实现
功能:实现一个画面,当手触摸时,火焰随之移动。
核心代码:(my.p放在asset/data目录下,并在该目录下放一张particle.png(为单个粒子的图片文件,文件名唯一))
- package
com.example.libgdx_02_Particle; -
- import
com.badlogic.gdx.ApplicationListener; - import
com.badlogic.gdx.Gdx; - import
com.badlogic.gdx.InputProcessor; - import
com.badlogic.gdx.graphics.GL10; - import
com.badlogic.gdx.graphics.g2d.ParticleEffect; - import
com.badlogic.gdx.graphics.g2d.ParticleEmitter; - import
com.badlogic.gdx.graphics.g2d.SpriteBatch; - import
com.badlogic.gdx.utils.Array; -
- public
class Game implements ApplicationListener - {
-
-
SpriteBatch batch; -
ParticleEffect effect; -
int index; -
Array emitters; -
int count; -
-
//一旦ApplicationListener开始运行,render函数就会不停执行 -
@Override -
public void render()//着色, 渲染. -
{ -
// TODO Auto-generated method stub -
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);//清屏 -
Gdx.gl.glClearColor(0f, 0f, 0f, 0f); -
-
batch.getProjectionMatrix().setToOrtho2D(0, 0, Gdx.graphics.getWidth(), -
Gdx.graphics.getHeight()); -
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); -
batch.begin(); -
effect.draw(batch, Gdx.graphics.getDeltaTime()); -
batch.end(); -
-
} -
-
@Override -
public void create() -
{ -
//初始化 -
batch = new SpriteBatch(); -
effect = new ParticleEffect(); -
//加载文件 -
effect.load(Gdx.files.internal("data/my.p"), -
Gdx.files.internal("data/")); -
//设置特效位置 -
effect.setPosition(Gdx.graphics.getWidth() / 2, -
Gdx.graphics.getHeight() / 2); -
-
emitters = new Array(effect.getEmitters()); -
effect.getEmitters().clear(); -
effect.getEmitters().add(emitters.get(index)); -
-
//点击屏幕移动, 设置输入 -
InputProcessor inputProcessor = new InputProcessor() -
{ -
-
@Override -
public boolean touchUp(int arg0, int arg1, int arg2, int arg3) -
{ -
return false; -
} -
-
@Override -
public boolean touchDragged(int arg0, int arg1, int arg2) -
{ -
effect.setPosition(arg0, Gdx.graphics.getHeight() - arg1); -
return false; -
} -
-
@Override -
public boolean touchDown(int arg0, int arg1, int arg2, int arg3) -
{ -
ParticleEmitter emitter = emitters.get(index); -
count += 100; -
if (count > emitter.getMaxParticleCount()) -
emitter.setMaxParticleCount(count * 2); -
count = Math.max(0, count); -
emitter.getEmission().setHigh( -
count / emitter.getLife().getHighMax() * 1000); -
effect.getEmitters().clear(); -
effect.getEmitters().add(emitter); -
return false; -
} -
-
@Override -
public boolean scrolled(int arg0) -
{ -
// TODO Auto-generated method stub -
return false; -
} -
-
@Override -
public boolean keyUp(int arg0) -
{ -
// TODO Auto-generated method stub -
return false; -
} -
-
@Override -
public boolean keyTyped(char arg0) -
{ -
// TODO Auto-generated method stub -
return false; -
} -
-
@Override -
public boolean keyDown(int arg0) -
{ -
// TODO Auto-generated method stub -
return false; -
} -
-
@Override -
public boolean mouseMoved(int arg0, int arg1) -
{ -
// TODO Auto-generated method stub -
return false; -
} -
}; -
Gdx.input.setInputProcessor(inputProcessor); -
} -
-
@Override -
public void dispose() -
{ -
// 释放资源 -
batch.dispose(); -
-
} -
-
@Override -
public void pause() -
{ -
// TODO Auto-generated method stub -
-
} -
-
@Override -
public void resize(int arg0, int arg1) -
{ -
// TODO Auto-generated method stub -
-
} -
-
@Override -
public void resume() -
{ -
// TODO Auto-generated method stub -
-
} -
- }
package com.example.libgdx_02_Particle; import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.InputProcessor; import com.badlogic.gdx.graphics.GL10; import com.badlogic.gdx.graphics.g2d.ParticleEffect; import com.badlogic.gdx.graphics.g2d.ParticleEmitter; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.utils.Array; public class Game implements ApplicationListener { SpriteBatch batch; ParticleEffect effect; int index; Array emitters; int count; //一旦ApplicationListener开始运行,render函数就会不停执行 @Override public void render()//着色, 渲染. { // TODO Auto-generated method stub Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);//清屏 Gdx.gl.glClearColor(0f, 0f, 0f, 0f); batch.getProjectionMatrix().setToOrtho2D(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); batch.begin(); effect.draw(batch, Gdx.graphics.getDeltaTime()); batch.end(); } @Override public void create() { //初始化 batch = new SpriteBatch(); effect = new ParticleEffect(); //加载文件 effect.load(Gdx.files.internal("data/my.p"), Gdx.files.internal("data/")); //设置特效位置 effect.setPosition(Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() / 2); emitters = new Array(effect.getEmitters()); effect.getEmitters().clear(); effect.getEmitters().add(emitters.get(index)); //点击屏幕移动, 设置输入 InputProcessor inputProcessor = new InputProcessor() { @Override public boolean touchUp(int arg0, int arg1, int arg2, int arg3) { return false; } @Override public boolean touchDragged(int arg0, int arg1, int arg2) { effect.setPosition(arg0, Gdx.graphics.getHeight() - arg1); return false; } @Override public boolean touchDown(int arg0, int arg1, int arg2, int arg3) { ParticleEmitter emitter = emitters.get(index); count += 100; if (count > emitter.getMaxParticleCount()) emitter.setMaxParticleCount(count * 2); count = Math.max(0, count); emitter.getEmission().setHigh( count / emitter.getLife().getHighMax() * 1000); effect.getEmitters().clear(); effect.getEmitters().add(emitter); return false; } @Override public boolean scrolled(int arg0) { // TODO Auto-generated method stub return false; } @Override public boolean keyUp(int arg0) { // TODO Auto-generated method stub return false; } @Override public boolean keyTyped(char arg0) { // TODO Auto-generated method stub return false; } @Override public boolean keyDown(int arg0) { // TODO Auto-generated method stub return false; } @Override public boolean mouseMoved(int arg0, int arg1) { // TODO Auto-generated method stub return false; } }; Gdx.input.setInputProcessor(inputProcessor); } @Override public void dispose() { // 释放资源 batch.dispose(); } @Override public void pause() { // TODO Auto-generated method stub } @Override public void resize(int arg0, int arg1) { // TODO Auto-generated method stub } @Override public void resume() { // TODO Auto-generated method stub } }
运行效果:
有没有比微信还炫呢??
更多资料:
源码下载 :http://download.csdn.net/detail/xn4545945/5643035
原创文章,转载请注明出处:http://blog.csdn.net/xn4545945