package org.cocos2d.tests;
import org.cocos2d.actions.UpdateCallback;
import org.cocos2d.actions.base.CCRepeatForever;
import org.cocos2d.actions.interval.CCIntervalAction;
import org.cocos2d.actions.interval.CCMoveBy;
import org.cocos2d.actions.interval.CCRotateBy;
import org.cocos2d.actions.interval.CCSequence;
import org.cocos2d.layers.CCColorLayer;
import org.cocos2d.layers.CCLayer;
import org.cocos2d.layers.CCScene;
import org.cocos2d.menus.CCMenu;
import org.cocos2d.menus.CCMenuItemFont;
import org.cocos2d.menus.CCMenuItemImage;
import org.cocos2d.menus.CCMenuItemToggle;
import org.cocos2d.nodes.CCDirector;
import org.cocos2d.nodes.CCLabel;
import org.cocos2d.nodes.CCLabelAtlas;
import org.cocos2d.nodes.CCParallaxNode;
import org.cocos2d.nodes.CCSprite;
import org.cocos2d.nodes.CCTextureCache;
import org.cocos2d.opengl.CCGLSurfaceView;
import org.cocos2d.opengl.CCTextureAtlas;
import org.cocos2d.particlesystem.CCParticleExplosion;
import org.cocos2d.particlesystem.CCParticleFire;
import org.cocos2d.particlesystem.CCParticleFireworks;
import org.cocos2d.particlesystem.CCParticleFlower;
import org.cocos2d.particlesystem.CCParticleGalaxy;
import org.cocos2d.particlesystem.CCParticleMeteor;
import org.cocos2d.particlesystem.CCParticleRain;
import org.cocos2d.particlesystem.CCParticleSmoke;
import org.cocos2d.particlesystem.CCParticleSnow;
import org.cocos2d.particlesystem.CCParticleSpiral;
import org.cocos2d.particlesystem.CCParticleSun;
import org.cocos2d.particlesystem.CCParticleSystem;
import org.cocos2d.particlesystem.CCPointParticleSystem;
import org.cocos2d.particlesystem.CCQuadParticleSystem;
import org.cocos2d.types.CGPoint;
import org.cocos2d.types.CGRect;
import org.cocos2d.types.CGSize;
import org.cocos2d.types.ccColor3B;
import org.cocos2d.types.ccColor4B;
import org.cocos2d.types.ccColor4F;
import org.cocos2d.utils.javolution.MathLib;
import org.cocos2d.utils.javolution.TextBuilder;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;
public class ParticleTest extends Activity {
// private static final String LOG_TAG = AtlasSpriteTest.class.getSimpleName();
private CCGLSurfaceView mGLSurfaceView;//建立view
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//没标题..
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);//全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//不黑
mGLSurfaceView = new CCGLSurfaceView(this);//建立新的view
setContentView(mGLSurfaceView);//设置view
// attach the OpenGL view to a window
CCDirector.sharedDirector().attachInView(mGLSurfaceView);//把所有的图像附加到view上
// set landscape mode
CCDirector.sharedDirector().setLandscape(false);//横屏
// show FPS
CCDirector.sharedDirector().setDisplayFPS(true);//fps
// frames per second
CCDirector.sharedDirector().setAnimationInterval(1.0f / 60);//每1/60秒运行一次
CCScene scene = CCScene.node();//生成场景节点
scene.addChild(nextAction());//场景布置
// Make the Scene active
CCDirector.sharedDirector().runWithScene(scene);//执行
}
@Override
public void onStart() {
super.onStart();
}
@Override
public void onPause() {
super.onPause();
CCDirector.sharedDirector().onPause();
}
@Override
public void onResume() {
super.onResume();
CCDirector.sharedDirector().onResume();
}
@Override
public void onDestroy() {
super.onDestroy();
CCDirector.sharedDirector().end();
//CCTextureCache.sharedTextureCache().removeAllTextures();
}
static int sceneIdx = -1;
static Class<?> transitions[] = {//类集合
DemoFlower.class,
DemoGalaxy.class,
DemoFirework.class,
DemoSpiral.class,
DemoSun.class,
DemoMeteor.class,
DemoFire.class,
DemoSmoke.class,
DemoExplosion.class,
DemoSnow.class,
DemoRain.class,
DemoBigFlower.class,
DemoRotFlower.class,
DemoModernArt.class,
DemoRing.class,
ParallaxParticle.class,
/* we can't work on plist files now
ParticleDesigner1.class,
ParticleDesigner2.class,
ParticleDesigner3.class,
ParticleDesigner4.class,
ParticleDesigner5.class,
ParticleDesigner6.class,
ParticleDesigner7.class,
ParticleDesigner8.class,
ParticleDesigner9.class,
ParticleDesigner10.class,
ParticleDesigner11.class, */
RadiusMode1.class,
RadiusMode2.class,
// Issue704.class,
// Issue872.class,
// Issue870.class,
};
static CCLayer nextAction() {//动作下一步
sceneIdx++;
sceneIdx = sceneIdx % transitions.length;
return restartAction();
}
static CCLayer backAction() {//返回动作
sceneIdx--;
if (sceneIdx < 0)
sceneIdx += transitions.length;
return restartAction();
}
static CCLayer restartAction() {//重置
try {
Class<?> c = transitions[sceneIdx];
return (CCLayer) c.newInstance();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
static abstract class ParticleDemo extends CCColorLayer implements UpdateCallback {
CCTextureAtlas atlas;//文字图集
static final int kTagLabelAtlas = 1;
CCParticleSystem emitter;//创建离子系统
CCSprite background;//创建背景精灵
public ParticleDemo() {
super(new ccColor4B(127,127,127,255));//颜色背景
this.setIsTouchEnabled(true);//可以点击
CGSize s = CCDirector.sharedDirector().winSize();//得到大小
CCLabel label = CCLabel.makeLabel(title(), "DroidSans", 18);//标记
label.setPosition(CGPoint.make(s.width / 2, s.height - 50));//设置位置
addChild(label, 100);//添加子类
String subtitle = subtitle();//得到字符
if( subtitle != null) {
CCLabel l = CCLabel.makeLabel(subtitle, "DroidSerif", 16);//创建标签
addChild(l, 100);//添加子类
l.setPosition(CGPoint.ccp(s.width/2, s.height-80));//设置位置
}
//创建下列3个按钮
CCMenuItemImage item1 = CCMenuItemImage.item("b1.png", "b2.png", this, "backCallback");
CCMenuItemImage item2 = CCMenuItemImage.item("r1.png", "r2.png", this, "restartCallback");
CCMenuItemImage item3 = CCMenuItemImage.item("f1.png", "f2.png", this, "nextCallback");
//添加一个标签按钮,这个标签每次点击会切换字符串
CCMenuItemToggle item4 = CCMenuItemToggle.item(this,"toggleCallback",
CCMenuItemFont.item("Free Movement"),//散开的效果
CCMenuItemFont.item("Grouped Movement"));//圆效果
//把按钮添加进去
CCMenu menu = CCMenu.menu(item1, item2, item3, item4);//添加进菜单
menu.setPosition(CGPoint.make(0, 0));//设置位置
item1.setPosition(CGPoint.make(s.width / 2 - 100, 30));
item2.setPosition(CGPoint.make(s.width / 2, 30));
item3.setPosition(CGPoint.make(s.width / 2 + 100, 30));
item4.setPosition(CGPoint.ccp(0, 100));
item4.setAnchorPoint(CGPoint.ccp(0,0));//设置锚点
addChild(menu, 100);//菜单顶置
CCLabelAtlas labelAtlas = CCLabelAtlas.label("0000", "fps_images.png", 16, 24, '.');//标签图
addChild(labelAtlas, 100, kTagLabelAtlas);//添加子类
labelAtlas.setPosition(CGPoint.make(s.width-66, 50));//设置顶点
// moving background
background = CCSprite.sprite("background3.png");//创建精灵
addChild(background, 5);//添加子类
background.setPosition(CGPoint.make(s.width/2, s.height-180));
//设置位置
CCIntervalAction move = CCMoveBy.action(4, CGPoint.ccp(300, 0));//移动
CCIntervalAction move_back = move.reverse();//反移动
CCIntervalAction seq = CCSequence.actions(move, move_back);//创建连
background.runAction(CCRepeatForever.action(seq));//执行
this.scheduleUpdate();//设置0优先等级的更新
}
@Override
public boolean ccTouchesBegan(MotionEvent e){//点击事件开始
// claim the touch
return true;
}
@Override
public boolean ccTouchesMoved(MotionEvent e) {//点击移动
return true;
}
@Override
public boolean ccTouchesEnded(MotionEvent e) {//点击结束
CGPoint location = CGPoint.ccp(e.getX(), e.getY());//定义点
CGPoint convertedLocation = CCDirector.sharedDirector().convertToGL(location);
//转换坐标
CGPoint pos = CGPoint.zero();//得到原点0.0
if( background != null)//如果背景层不为空
pos = background.convertToWorldSpace(0, 0);//转换为世界坐标
emitter.setPosition(CGPoint.ccpSub(convertedLocation, pos));//做差
return true;
}
private TextBuilder particleCountString = new TextBuilder();//字符串
// String.format("%4d", emitter.getParticleCount())//这是要格式化成4位
private TextBuilder getParticleCountString(int c) {//得到字符串的方法
int len = MathLib.digitLength(c);//得到c的长度
int zeros = 4 - len;//用4-c
while (zeros-- > 0) {//一直循环-1,只要大于0就继续做
particleCountString.append('0');//补0
}
particleCountString.append(c);//把c添加进去
return particleCountString;//返回字符
}
public void update(float dt) {//重写每帧的执行
CCLabelAtlas atlas = (CCLabelAtlas) getChildByTag(kTagLabelAtlas);//得到标签
particleCountString.reset();//清楚掉字符
// String str = String.format("%4d", emitter.getParticleCount());
atlas.setString(getParticleCountString(emitter.getParticleCount()));//设置标签字符
}
public void toggleCallback(Object sender) {//由刚才那个点击得到这个事件。每次看看自己的参数设置,如果是grop的就设为free的,否则就射为group的
if( emitter.getPositionType() == CCParticleSystem.kCCPositionTypeGrouped )
emitter.setPositionType(CCParticleSystem.kCCPositionTypeFree);
else
emitter.setPositionType(CCParticleSystem.kCCPositionTypeGrouped);
}
public void restartCallback(Object sender) {//重置
// Scene s = Scene.node();
// s.addChild(restartAction());
// Director.sharedDirector().replaceScene(s);
emitter.resetSystem();
}
public void setEmitterPosition() {//设置点
if( CGPoint.equalToPoint( emitter.getCenterOfGravity(), CGPoint.zero() ) ) //如果相等
emitter.setPosition(CGPoint.make(200, 70));//设定顶点
}
public void nextCallback(Object sender) {//2个切换事件
CCScene s = CCScene.node();
s.addChild(nextAction());
CCDirector.sharedDirector().replaceScene(s);
}
public void backCallback(Object sender) {
CCScene s = CCScene.node();
s.addChild(backAction());
CCDirector.sharedDirector().replaceScene(s);
}
public String title() {//得到字符串
return "No title";
}
public String subtitle() {
return "Tap the screen";
}
}
static class DemoFire extends ParticleDemo {//火
public void onEnter() {
super.onEnter();
emitter = CCParticleFire.node();
background.addChild(emitter, 10);//添加系统
emitter.setTexture(CCTextureCache.sharedTextureCache().addImage("fire.png"));
//在缓存中添加图片火,并把这作为图案,作为离子的图案
CGPoint p = emitter.getPosition();//得到顶点
emitter.setPosition(CGPoint.ccp(p.x, 100));//设置顶点让y=100
setEmitterPosition();//设置位置
}
public String title() {
return "ParticleFire";
}
}
static class DemoExplosion extends ParticleDemo {//爆炸
static final int kTagLabelAtlas = 1;
static final int kTagEmitter = 2;
@Override
public void onEnter() {
super.onEnter();
emitter = CCParticleExplosion.node();//新建爆炸节点
addChild(emitter, 10);
emitter.setTexture(CCTextureCache.sharedTextureCache().addImage("stars_grayscale.png"));//设置图案
emitter.setAutoRemoveOnFinish(true);//完成后自动消失
setEmitterPosition();
}
@Override
public String title() {
return "ParticleExplosion";
}
}
static class DemoFirework extends ParticleDemo {//烟花,也是一种爆炸
static final int kTagLabelAtlas = 1;
static final int kTagEmitter = 2;
@Override
public void onEnter() {
super.onEnter();
emitter = CCParticleFireworks.node();
background.addChild(emitter, 10);
emitter.setTexture(CCTextureCache.sharedTextureCache().addImage("stars.png"));//给个图片
emitter.setBlendAdditive(true);//设置加亮模式
setEmitterPosition();//设置点
}
@Override
public String title() {
return "ParticleFireworks";
}
}
static class DemoSun extends ParticleDemo {//太阳效果
@Override
public void onEnter() {
super.onEnter();
emitter = CCParticleSun.node();//生成一个太阳节点
background.addChild(emitter, 10);//添加子类
emitter.setTexture(CCTextureCache.sharedTextureCache().addImage("fire.png"));//设置图像
setEmitterPosition();
}
@Override
public String title()
{
return "ParticleSun";
}
}
static class DemoGalaxy extends ParticleDemo {//银河系
@Override
public void onEnter() {
super.onEnter();
emitter = CCParticleGalaxy.node();//生成银河系节点
background.addChild(emitter, 10);
emitter.setTexture(CCTextureCache.sharedTextureCache().addImage("fire.png"));//火图片
setEmitterPosition();
}
@Override
public String title() {
return "ParticleGalaxy";
}
}
static class DemoFlower extends ParticleDemo {//花
@Override
public void onEnter() {
super.onEnter();
emitter = CCParticleFlower.node();//花的节点
background.addChild(emitter, 10);
emitter.setTexture(CCTextureCache.sharedTextureCache().addImage("stars_grayscale.png"));
//设置基本粒子图片
setEmitterPosition();
}
@Override
public String title() {
return "ParticleFlower";
}
}
static class DemoBigFlower extends ParticleDemo {//大花
@Override
public void onEnter() {
super.onEnter();
emitter = new CCQuadParticleSystem(50);//粒子系统50个粒子
background.addChild(emitter, 10);
emitter.setTexture(CCTextureCache.sharedTextureCache().addImage("stars_grayscale.png"));
//设置图片
// duration
emitter.setDuration(CCParticleSystem.kCCParticleDurationInfinity);//粒子发射器设置永远
// Gravity Mode: gravity
emitter.setGravity(CGPoint.zero());//设置重力点在0.0
// Set "Gravity" mode (default one)
emitter.setEmitterMode(CCParticleSystem.kCCParticleModeGravity);//设置为重力模式,还有一种叫半径模式
// Gravity Mode: speed of particles
emitter.setSpeed(160);//速度
emitter.setSpeedVar(20);//加速度
// Gravity Mode: radial
emitter.setRadialAccel(-120);//设置切向速度
emitter.setRadialAccelVar(0);//切向加速度
// Gravity Mode: tagential
emitter.setTangentialAccel(30);//向心速度
emitter.setTangentialAccelVar(0);//向心加速度
// angle
emitter.setAngle(90);//设置角度
emitter.setAngleVar(360);//角度加速度
// emitter position
emitter.setPosition(CGPoint.ccp(160,240));//设置初始位置
emitter.setPosVar(CGPoint.zero());//设置位置变化率
// life of particles
emitter.setLife(4);//存活时期
emitter.setLifeVar(1);//时间变化率
// spin of particles
emitter.setStartSpin(0);//开始自转
emitter.setStartSpinVar(0);//开始转速度
emitter.setEndSpin(0);//结束自转
emitter.setEndSpinVar(0);//结束转速度
// color of particles
ccColor4F startColor = new ccColor4F(0.5f, 0.5f, 0.5f, 1.0f);
emitter.setStartColor(startColor);//设置初始颜色
ccColor4F startColorVar = new ccColor4F(0.5f, 0.5f, 0.5f, 1.0f);
emitter.setStartColorVar(startColorVar);//设置颜色变化率
ccColor4F endColor = new ccColor4F(0.1f, 0.1f, 0.1f, 0.2f);
emitter.setEndColor(endColor);//设置结束颜色
ccColor4F endColorVar = new ccColor4F(0.1f, 0.1f, 0.1f, 0.2f);
emitter.setEndColorVar(endColorVar);//设置结束颜色变化率
// size, in pixels
emitter.setStartSize(80.0f);//设置初始离子大小
emitter.setStartSizeVar(40.0f);//设置初始离子变化率
emitter.setEndSize(CCParticleSystem.kCCParticleStartSizeEqualToEndSize);//等同于初始大小
// emits per second
emitter.setEmissionRate( emitter.getTotalParticles()/emitter.getLife());//设置每秒产生离子率
// additive
emitter.setBlendAdditive(true);//设置在屏幕中间
setEmitterPosition();
}
@Override
public String title() {
return "Big Particles";
}
}
static class DemoRotFlower extends ParticleDemo {//花
@Override
public void onEnter() {
super.onEnter();
emitter = new CCQuadParticleSystem(300);//300个粒子的自定义粒子系统
background.addChild(emitter, 10);
emitter.setTexture(CCTextureCache.sharedTextureCache().addImage("stars2_grayscale.png"));
//设置纹理
// duration
emitter.setDuration(CCParticleSystem.kCCParticleDurationInfinity);//永久存活
// Set "Gravity" mode (default one)
emitter.setEmitterMode(CCParticleSystem.kCCParticleModeGravity);//重力模式
// Gravity mode: gravity
emitter.setGravity(CGPoint.zero());//设置重力点
// Gravity mode: speed of particles
emitter.setSpeed(160);//设置粒子速度
emitter.setSpeedVar(20);//设置加速度
// Gravity mode: radial
emitter.setRadialAccel(-120);//径向速度
emitter.setRadialAccelVar(0);//径向加速度
// Gravity mode: tagential
emitter.setTangentialAccel(30);//切向速度
emitter.setTangentialAccelVar(0);//切向加速度
// emitter position
emitter.setPosition(CGPoint.ccp(160,240));//出发点
emitter.setPosVar(CGPoint.zero());//点变化速度
// angle
emitter.setAngle(90);//角度
emitter.setAngleVar(360);//角加速度
// life of particles
emitter.setLife(3);//生命周期
emitter.setLifeVar(1);//衰变速度
// spin of particles
emitter.setStartSpin(0);//粒子自己开始角度
emitter.setStartSpinVar(0);//粒子自己旋转的速度,0就是一开始速度为0
emitter.setEndSpin(0);//粒子自己结束时的角度
emitter.setEndSpinVar(2000);//单个粒子自己旋转的速度,2000就转的非常快了
// color of particles
ccColor4F startColor = new ccColor4F(0.5f, 0.5f, 0.5f, 1.0f);//开始的颜色
emitter.setStartColor(startColor);//设置开始的颜色
ccColor4F startColorVar = new ccColor4F(0.5f, 0.5f, 0.5f, 1.0f);//开始颜色变化速度
emitter.setStartColorVar(startColorVar);
ccColor4F endColor = new ccColor4F(0.1f, 0.1f, 0.1f, 0.2f);//结束颜色
emitter.setEndColor(endColor);
ccColor4F endColorVar = new ccColor4F(0.1f, 0.1f, 0.1f, 0.2f);//结束时的速度
emitter.setEndColorVar(endColorVar);
// size, in pixels
emitter.setStartSize(30.0f);//开始大小
emitter.setStartSizeVar(00.0f);//开始速度
emitter.setEndSize(CCParticleSystem.kCCParticleStartSizeEqualToEndSize);//结束大小设置的和一开始一样
// emits per second
emitter.setEmissionRate(emitter.getTotalParticles()/emitter.getLife());//每秒产生粒子的效率,得到全部产生的粒子/生命周期=粒子的产生效率
// additive
emitter.setBlendAdditive(false);//设置在屏幕中间
setEmitterPosition();
}
@Override
public String title() {
return "Spinning Particles";
}
}
static class DemoMeteor extends ParticleDemo {
@Override
public void onEnter() {
super.onEnter();
emitter = CCParticleMeteor.node();//粒子流星
background.addChild(emitter, 10);//背景添加粒子流星
emitter.setTexture(CCTextureCache.sharedTextureCache().addImage("fire.png"));
//给粒子添加图案
setEmitterPosition();
}
@Override
public String title() {
return "ParticleMeteor";
}
}
static class DemoSpiral extends ParticleDemo {
@Override
public void onEnter() {
super.onEnter();
emitter = CCParticleSpiral.node();//颗粒螺旋
background.addChild(emitter, 10);//添加螺旋
emitter.setTexture(CCTextureCache.sharedTextureCache().addImage("fire.png"));
//设置画面
setEmitterPosition();
}
@Override
public String title() {
return "ParticleSpiral";
}
}
static class DemoSmoke extends ParticleDemo {
@Override
public void onEnter() {
super.onEnter();
emitter = CCParticleSmoke.node();//粒子烟雾
background.addChild(emitter, 10);
CGPoint p = emitter.getPosition();
emitter.setPosition(CGPoint.ccp( p.x, 100));//设置位置
setEmitterPosition();
}
@Override
public String title() {
return "ParticleSmoke";
}
}
static class DemoSnow extends ParticleDemo {
@Override
public void onEnter() {
super.onEnter();
emitter = CCParticleSnow.node();//粒子下雪
background.addChild(emitter, 10);
CGPoint p = emitter.getPosition();
emitter.setPosition(CGPoint.ccp( p.x, p.y-110));
emitter.setLife(3);//生命周期3
emitter.setLifeVar(1);//生命速度1
// gravity
emitter.setGravity(CGPoint.ccp(0,-10));
// speed of particles
emitter.setSpeed(130);//设置速度
emitter.setSpeedVar(30);//加速度
ccColor4F startColor = emitter.getStartColor();//得到开始颜色
startColor.r = 0.9f;
startColor.g = 0.9f;
startColor.b = 0.9f;
emitter.setStartColor(startColor);//设置开始颜色,主要为了改透明度
ccColor4F startColorVar = emitter.getStartColorVar();//开始变换速度
startColorVar.b = 0.1f;
emitter.setStartColorVar(startColorVar);//只改变蓝色的变化速度
emitter.setEmissionRate(emitter.getTotalParticles()/emitter.getLife());//粒子产生速度
emitter.setTexture(CCTextureCache.sharedTextureCache().addImage("snow.png"));
//设置纹理
setEmitterPosition();
}
@Override
public String title() {
return "ParticleSnow";
}
}
static class DemoRain extends ParticleDemo {//下雨
@Override
public void onEnter(){
super.onEnter();
emitter = CCParticleRain.node();//下雨粒子效果
background.addChild(emitter, 10);
CGPoint p = emitter.getPosition();//设置位置
emitter.setPosition(CGPoint.ccp( p.x, p.y-100));
emitter.setLife(4);//设置生命周期
emitter.setTexture(CCTextureCache.sharedTextureCache().addImage("fire.png"));
//设置纹理
setEmitterPosition();//设置位置
}
@Override
public String title() {
return "ParticleRain";
}
}
static class DemoModernArt extends ParticleDemo {
@Override
public void onEnter()
{
super.onEnter();
emitter = new CCPointParticleSystem(1000);//粒子效果1000个
background.addChild(emitter, 10);//添加子类
CGSize s = CCDirector.sharedDirector().winSize();//得到大小
// duration
emitter.setDuration(CCParticleSystem.kCCParticleDurationInfinity);//生命周期永久
// Gravity mode
emitter.setEmitterMode(CCParticleSystem.kCCParticleModeGravity);//重力模式
// Gravity mode: gravity
emitter.setGravity(CGPoint.ccp(0,0));//重心
// Gravity mode: radial
emitter.setRadialAccel(70);//以下几个方法不做赘述
emitter.setRadialAccelVar(10);
// Gravity mode: tagential
emitter.setTangentialAccel(80);
emitter.setTangentialAccelVar(0);
// Gravity mode: speed of particles
emitter.setSpeed(50);
emitter.setSpeedVar(10);
// angle
emitter.setAngle(0);
emitter.setAngleVar(360);
// emitter position
emitter.setPosition(CGPoint.ccp( s.width/2, s.height/2));
emitter.setPosVar(CGPoint.zero());
// life of particles
emitter.setLife(2.0f);
emitter.setLifeVar(0.3f);
// emits per frame
emitter.setEmissionRate(emitter.getTotalParticles()/emitter.getLife());
// color of particles
ccColor4F startColor = new ccColor4F(0.5f, 0.5f, 0.5f, 1.0f);
emitter.setStartColor(startColor);
ccColor4F startColorVar = new ccColor4F(0.5f, 0.5f, 0.5f, 1.0f);
emitter.setStartColorVar(startColorVar);
ccColor4F endColor = new ccColor4F(0.1f, 0.1f, 0.1f, 0.2f);
emitter.setEndColor(endColor);
ccColor4F endColorVar = new ccColor4F(0.1f, 0.1f, 0.1f, 0.2f);
emitter.setEndColorVar(endColorVar);
// size, in pixels
emitter.setStartSize(1.0f);
emitter.setStartSizeVar(1.0f);
emitter.setEndSize(32.0f);
emitter.setEndSizeVar(8.0f);
// texture
// emitter.texture = [[TextureCache sharedTextureCache] addImage:@"fire-grayscale.png"];
// additive
emitter.setBlendAdditive(false);//不在中心
setEmitterPosition();
}
@Override
public String title()
{
return "Varying size";
}
}
static class DemoRing extends ParticleDemo {
@Override
public void onEnter() {
super.onEnter();
emitter = CCParticleFlower.node(500);
background.addChild(emitter, 10);
emitter.setTexture(CCTextureCache.sharedTextureCache().addImage("stars_grayscale.png"));//设置纹理
emitter.setLifeVar(0);
emitter.setLife(10);
emitter.setSpeed(100);
emitter.setSpeedVar(0);
emitter.setEmissionRate(10000);//设置发射率
setEmitterPosition();
}
@Override
public String title() {
return "Ring Demo";
}
}
static class ParallaxParticle extends ParticleDemo {//视差粒子
@Override
public void onEnter() {
super.onEnter();
background.getParent().removeChild(background, true);//移除背景
background = null;
CCParallaxNode p = CCParallaxNode.node();//一个基础的视差场景
addChild(p, 5);
CCSprite p1 = CCSprite.sprite("background3.png");//得到背景精灵1
background = p1;
CCSprite p2 = CCSprite.sprite("background3.png");//背景精灵2
p.addChild(p1, 1, 0.5f, 1f, 0f, 250f);//把背景精灵添加进来
p.addChild(p2, 2, 1.5f, 1f, 0f, 50f);//添加背景精灵
emitter = CCParticleFlower.node(500);//粒子花
p1.addChild(emitter, 10);//把粒子花添加进来
emitter.setPosition(CGPoint.ccp(250,200));
CCParticleSystem par = CCParticleSun.node(250);//太阳
p2.addChild(par, 10);//添加精灵
par = null;//添加完把原字段置空,因为那个引用还在p2子类里
CCMoveBy move = CCMoveBy.action(4, CGPoint.ccp(300,0));//移动
CCMoveBy move_back = move.reverse();//返回
CCSequence seq = CCSequence.actions(move, move_back);//移动和返回
p.runAction(CCRepeatForever.action(seq));//永久动作
}
@Override
public String title() {
return "Parallax + Particles";
}
}
static class ParticleDesigner1 extends ParticleDemo {//粒子设计
@Override
public void onEnter() {
super.onEnter();
setColor(ccColor3B.ccBLACK);
removeChild(background, true);//移除场景
background = null;
emitter = CCQuadParticleSystem.particleWithFile("Particles/SpookyPeas.plist");//文件粒子
addChild(emitter, 10);//添加粒子层
}
@Override
public String title() {
return "PD: Spooky Peas";
}
}
static class ParticleDesigner2 extends ParticleDemo {//设计2
@Override
public void onEnter() {
super.onEnter();
setColor(ccColor3B.ccBLACK);//设置背景颜色
removeChild(background, true);//移除背景精灵(和上面颜色无关)
background = null;//置空,等待回收
emitter = CCQuadParticleSystem.particleWithFile("Particles/SpinningPeas.plist");//从文件得到离子
addChild(emitter, 10);//添加子类效果
// custom spinning
emitter.setStartSpin(0);//同上属性解释
emitter.setStartSpin(360);
emitter.setEndSpin(720);
emitter.setEndSpinVar(360);
}
@Override
public String title() {
return "PD: Spinning Peas";
}
}
static class ParticleDesigner3 extends ParticleDemo {//设计3
@Override
public void onEnter() {
super.onEnter();
setColor(ccColor3B.ccBLACK);
removeChild(background, true);
background = null;
emitter = CCQuadParticleSystem.particleWithFile("Particles/LavaFlow.plist");//只有文件加载的粒子
addChild(emitter, 10);//添加子类
}
@Override
public String title() {
return "PD: Lava Flow";
}
}
static class ParticleDesigner4 extends ParticleDemo {//设计4
@Override
public void onEnter()
{
super.onEnter();
setColor(ccColor3B.ccBLACK);
emitter = CCQuadParticleSystem.particleWithFile("Particles/ExplodingRing.plist");//从文件读取粒子
addChild(emitter, 10);
removeChild(background, true);//比刚才多移除了背景动作
background = null;
}
@Override
public String title()
{
return "PD: Exploding Ring";
}
}
static class ParticleDesigner5 extends ParticleDemo {//设计5
@Override
public void onEnter()
{
super.onEnter();
setColor(ccColor3B.ccBLACK);//有黑背景
removeChild(background, true);
background = null;//移除背景图层精灵
emitter = CCQuadParticleSystem.particleWithFile("Particles/Comet.plist");//加载文件
addChild(emitter, 10);
}
@Override
public String title()
{
return "PD: Comet";
}
}
static class ParticleDesigner6 extends ParticleDemo {//6
@Override
public void onEnter()
{
super.onEnter();
setColor(ccColor3B.ccBLACK);//同上
removeChild(background, true);
background = null;
emitter = CCQuadParticleSystem.particleWithFile("Particles/BurstPipe.plist");
addChild(emitter, 10);
}
@Override
public String title()
{
return "PD: Burst Pipe";
}
}
static class ParticleDesigner7 extends ParticleDemo {//7
@Override
public void onEnter()
{
super.onEnter();
setColor(ccColor3B.ccBLACK);//黑背景
removeChild(background, true);
background = null;
emitter = CCQuadParticleSystem.particleWithFile("Particles/BoilingFoam.plist");//文件
addChild(emitter, 10);
}
@Override
public String title()
{
return "PD: Boiling Foam";
}
}
static class ParticleDesigner8 extends ParticleDemo {//8,解释同理
@Override
public void onEnter()
{
super.onEnter();
setColor(ccColor3B.ccBLACK);
removeChild(background, true);
background = null;
emitter = CCQuadParticleSystem.particleWithFile("Particles/Flower.plist");
addChild(emitter, 10);
}
@Override
public String title() {
return "PD: Flower";
}
}
static class ParticleDesigner9 extends ParticleDemo {//9,解释同理
@Override
public void onEnter()
{
super.onEnter();
setColor(ccColor3B.ccBLACK);
removeChild(background, true);
background = null;
emitter = CCQuadParticleSystem.particleWithFile("Particles/Spiral.plist");
addChild(emitter, 10);
}
@Override
public String title()
{
return "PD: Blur Spiral";
}
}
static class ParticleDesigner10 extends ParticleDemo {//10,解释同理
@Override
public void onEnter()
{
super.onEnter();
setColor(ccColor3B.ccBLACK);
removeChild(background, true);
background = null;
emitter = CCQuadParticleSystem.particleWithFile("Particles/Galaxy.plist");
addChild(emitter, 10);
}
@Override
public String title() {
return "PD: Galaxy";
}
@Override
public String subtitle() {
return "Testing radial & tangential accel";
}
}
static class ParticleDesigner11 extends ParticleDemo {//11,解释同理
@Override
public void onEnter() {
super.onEnter();
setColor(ccColor3B.ccBLACK);
removeChild(background, true);
background = null;
emitter = CCQuadParticleSystem.particleWithFile("Particles/debian.plist");
addChild(emitter, 10);
}
@Override
public String title() {
return "PD: Debian";
}
@Override
public String subtitle() {
return "Testing radial & tangential accel";
}
}
static class RadiusMode1 extends ParticleDemo {//12
@Override
public void onEnter() {
super.onEnter();
setColor(ccColor3B.ccBLACK);//添加背景颜色
removeChild(background, true);//移除背景图层
background = null;
emitter = new CCQuadParticleSystem(200);//200个粒子的粒子系统
addChild(emitter, 10);
emitter.setTexture(CCTextureCache.sharedTextureCache().addImage("stars_grayscale.png"));
//添加图案
// duration
emitter.setDuration(CCParticleSystem.kCCParticleDurationInfinity);
//永久存活
// radius mode
emitter.setEmitterMode(CCParticleSystem.kCCParticleModeRadius);
//半径模式
// radius mode: start and end radius in pixels
emitter.setStartRadius(0);//开始半径
emitter.setStartRadiusVar(0);//开始半径变换速度
emitter.setEndRadius(160);//结束半径
emitter.setEndRadiusVar(0);//结束半径变换速度
// radius mode: degrees per second
emitter.setRotatePerSecond(180);//旋转180度
emitter.setRotatePerSecondVar(0);旋转加速度
// angle
emitter.setAngle(90);//设置角度
emitter.setAngleVar(0);//设置角加速度
// emitter position
CGSize size = CCDirector.sharedDirector().winSize();//设置大小
emitter.setPosition(CGPoint.ccp( size.width/2, size.height/2));//设置位置
emitter.setPosVar(CGPoint.zero());//点变化速度
// life of particles
emitter.setLife(5);//设置生命周期
emitter.setLifeVar(0);
// spin of particles
emitter.setStartSpin(0);//设置开始角速度
emitter.setStartSpinVar(0);//加速度
emitter.setEndSpin(0);//结束角速度
emitter.setEndSpinVar(0);//结束角加速度
// color of particles
ccColor4F startColor = new ccColor4F(0.5f, 0.5f, 0.5f, 1.0f);//开始颜色
emitter.setStartColor(startColor);
ccColor4F startColorVar = new ccColor4F(0.5f, 0.5f, 0.5f, 1.0f);//开始颜色变化速度
emitter.setStartColorVar(startColorVar);
ccColor4F endColor = new ccColor4F(0.1f, 0.1f, 0.1f, 0.2f);//结束速度
emitter.setEndColor(endColor);
ccColor4F endColorVar = new ccColor4F(0.1f, 0.1f, 0.1f, 0.2f);//结束加速度
emitter.setEndColorVar(endColorVar);
// size, in pixels
emitter.setStartSize(32);//开始大小
emitter.setStartSizeVar(0);//开始变换速度
emitter.setEndSize(CCParticleSystem.kCCParticleStartSizeEqualToEndSize);//结束大小
// emits per second
emitter.setEmissionRate(emitter.getTotalParticles()/emitter.getLife());//出现的频率
// additive
emitter.setBlendAdditive(false);//不在中心
}
@Override
public String title() {
return "Radius Mode: Spiral";
}
}
static class RadiusMode2 extends ParticleDemo {//2
@Override
public void onEnter() {
super.onEnter();
setColor(ccColor3B.ccBLACK);//黑色背景
removeChild(background, true);//移除背景图层
background = null;
emitter = new CCQuadParticleSystem(200);//创建一个200个精灵的图层
addChild(emitter, 10);//添加为子类
emitter.setTexture(CCTextureCache.sharedTextureCache().addImage("stars_grayscale.png"));
//设置纹理
// duration
emitter.setDuration(CCParticleSystem.kCCParticleDurationInfinity);
//永久存在的效果
// radius mode
emitter.setEmitterMode(CCParticleSystem.kCCParticleModeRadius);
//半径模式
// radius mode: 100 pixels from center
emitter.setStartRadius(100);//开始半径
emitter.setStartRadiusVar(0);//开始半径加速度
emitter.setEndRadius(CCParticleSystem.kCCParticleStartRadiusEqualToEndRadius);//结束和开始的半径相等,其参数值为-1
emitter.setEndRadiusVar(0);// not used when start == end//结束的加速度还是0
// radius mode: degrees per second
// 45 * 4 seconds of life = 180 degrees
emitter.setRotatePerSecond(45);//每秒45度
emitter.setRotatePerSecondVar(0);//加速度
// angle
emitter.setAngle(90);//设置角度90
emitter.setAngleVar(0);//设置角加速度0
// emitter position
CGSize size = CCDirector.sharedDirector().winSize();//设置大小
emitter.setPosition(CGPoint.ccp( size.width/2, size.height/2));
emitter.setPosVar(CGPoint.zero());
// life of particles
emitter.setLife(4);//设置生命周期
emitter.setLifeVar(0);//设置生命加速度
// spin of particles
emitter.setStartSpin(0);//开始角度
emitter.setStartSpinVar(0);//开始角加速度
emitter.setEndSpin(0);//结束角度
emitter.setEndSpinVar(0);//结束角加速度
// color of particles
ccColor4F startColor = new ccColor4F(0.5f, 0.5f, 0.5f, 1.0f);//颜色
emitter.setStartColor(startColor);//设置开始颜色
ccColor4F startColorVar = new ccColor4F(0.5f, 0.5f, 0.5f, 1.0f);//开始颜色加速度
emitter.setStartColorVar(startColorVar);
ccColor4F endColor = new ccColor4F(0.1f, 0.1f, 0.1f, 0.2f);//结束颜色
emitter.setEndColor(endColor);
ccColor4F endColorVar = new ccColor4F(0.1f, 0.1f, 0.1f, 0.2f);/结束颜色加速度
emitter.setEndColorVar(endColorVar);
// size, in pixels
emitter.setStartSize(32);//设置开始大小
emitter.setStartSizeVar(0);//设置大小加速度
emitter.setEndSize(CCParticleSystem.kCCParticleStartSizeEqualToEndSize);//设置结束加速度和开始加速度一样
// emits per second
emitter.setEmissionRate(emitter.getTotalParticles()/emitter.getLife());//设置迸射粒子速度
// additive
emitter.setBlendAdditive(false);//中心
}
@Override
public String title()
{
return "Radius Mode: Semi Circle";
}
}
static class Issue704 extends ParticleDemo {//
@Override
public void onEnter()
{
super.onEnter();
setColor(ccColor3B.ccBLACK);//黑色
removeChild(background, true);//移除背景
background = null;
emitter = new CCQuadParticleSystem(100);//生成一个有100个粒子的粒子系统
addChild(emitter, 10);
emitter.setDuration(CCParticleSystem.kCCParticleDurationInfinity);//永久生存
// radius mode
emitter.setEmitterMode(CCParticleSystem.kCCParticleModeRadius);//半径模式
// radius mode: 50 pixels from center
emitter.setStartRadius(50);//开始半径50
emitter.setStartRadiusVar(0);//开始半径加速度0
emitter.setEndRadius(CCParticleSystem.kCCParticleStartRadiusEqualToEndRadius);//与开始相等
emitter.setEndRadiusVar(0);// not used when start == end//也相等
// radius mode: degrees per second
// 45 * 4 seconds of life = 180 degrees
emitter.setRotatePerSecond(0);//设置每秒转角度0
emitter.setRotatePerSecondVar(0);//每秒转加速度0
// angle
emitter.setAngle(90);//设置角度90
emitter.setAngleVar(0);//设置角加速度0
// emitter position
CGSize size = CCDirector.sharedDirector().winSize();//得到屏幕大小
emitter.setPosition(CGPoint.ccp(size.width/2, size.height/2));//位于屏幕中间
emitter.setPosVar(CGPoint.zero());//设置点变化速度
// life of particles
emitter.setLife (5);//生命周期
emitter.setLifeVar(0);//生命周期速度
// spin of particles
emitter.setStartSpin (0);//开始角度
emitter.setStartSpinVar (0);//开始角加速度
emitter.setEndSpin( 0);//结束角度
emitter.setEndSpinVar (0);//结束角加速度
// color of particles
ccColor4F startColor = new ccColor4F(0.5f, 0.5f, 0.5f, 1.0f);//开始颜色
emitter.setStartColor(startColor);
ccColor4F startColorVar = new ccColor4F(0.5f, 0.5f, 0.5f, 1.0f);//开始颜色加速度
emitter.setStartColorVar(startColorVar);
ccColor4F endColor = new ccColor4F(0.1f, 0.1f, 0.1f, 0.2f);//结束颜色
emitter.setEndColor(endColor);
ccColor4F endColorVar = new ccColor4F(0.1f, 0.1f, 0.1f, 0.2f);//结束颜色加速度
emitter.setEndColorVar(endColorVar);
// size, in pixels
emitter.setStartSize(16);//设置开始大小
emitter.setStartSizeVar(0);//开始大小变化率
emitter.setEndSize(CCParticleSystem.kCCParticleStartSizeEqualToEndSize);//结束大小和开始大小一样
// emits per second
emitter.setEmissionRate( emitter.getTotalParticles()/emitter.getLife());//每秒的迸发速度
// additive
emitter.setBlendAdditive(false);//不在中心
CCIntervalAction rot = CCRotateBy.action(16, 360);//一个相对旋转动作,转换为瞬间动作
emitter.runAction(CCRepeatForever.action(rot));//让粒子执行
}
@Override
public String title() {
return "Issue 704. Free + Rot";
}
@Override
public String subtitle() {
return "Emitted particles should not rotate";
}
}
static class Issue872 extends ParticleDemo {//872
@Override
public void onEnter()
{
super.onEnter();
setColor(ccColor3B.ccBLACK);
removeChild(background, true);//移除背景
background = null;
emitter = CCQuadParticleSystem.particleWithFile("Particles/Upsidedown.plist");//得到粒子效果从一个文件
addChild(emitter, 10);
}
@Override
public String title() {
return "Issue 872. UpsideDown";
}
@Override
public String subtitle()
{
return "Particles should NOT be Upside Down. M should appear, not W.";
}
}
static class Issue870 extends ParticleDemo {//870
int index;
@Override
public void onEnter()
{
super.onEnter();
setColor(ccColor3B.ccBLACK);
removeChild(background, true);//同理
background = null;
CCQuadParticleSystem system = (CCQuadParticleSystem) CCQuadParticleSystem.particleWithFile("Particles/SpinningPeas.plist");//得到一个粒子效果从文件强制转换为粒子系统
system.setTexture(CCTextureCache.sharedTextureCache().addImage("particles.png"), CGRect.make(0,0,32,32));//添加纹理
addChild(system, 10);//同理
emitter = system;
index = 0;
schedule("updateQuads", 2);//更新
}
public void updateQuads(float dt) {//被更新的那个方法
index = (index + 1) % 4;//0-3循环
CGRect rect = CGRect.make(index*32, 0,32,32);//制作一个区域
CCQuadParticleSystem system = (CCQuadParticleSystem) emitter;
system.setTexture(emitter.getTexture(), rect);//生成一个粒子系统
}
@Override
public String title()
{
return "Issue 870. SubRect";
}
@Override
public String subtitle()
{
return "Every 2 seconds the particle should change";
}
}
}