Home | History | Annotate | Download | only in tests
      1 /*******************************************************************************
      2  * Copyright 2011 See AUTHORS file.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *   http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  ******************************************************************************/
     16 
     17 package com.badlogic.gdx.tests;
     18 
     19 import com.badlogic.gdx.Gdx;
     20 import com.badlogic.gdx.Input;
     21 import com.badlogic.gdx.InputProcessor;
     22 import com.badlogic.gdx.graphics.GL20;
     23 import com.badlogic.gdx.graphics.g2d.ParticleEffect;
     24 import com.badlogic.gdx.graphics.g2d.ParticleEmitter;
     25 import com.badlogic.gdx.graphics.g2d.SpriteBatch;
     26 import com.badlogic.gdx.tests.utils.GdxTest;
     27 import com.badlogic.gdx.utils.Array;
     28 
     29 public class ParticleEmitterTest extends GdxTest {
     30 	private SpriteBatch spriteBatch;
     31 	ParticleEffect effect;
     32 	int emitterIndex;
     33 	Array<ParticleEmitter> emitters;
     34 	int particleCount = 10;
     35 	float fpsCounter;
     36 	InputProcessor inputProcessor;
     37 
     38 	@Override
     39 	public void create () {
     40 		spriteBatch = new SpriteBatch();
     41 
     42 		effect = new ParticleEffect();
     43 		effect.load(Gdx.files.internal("data/test.p"), Gdx.files.internal("data"));
     44 		effect.setPosition(Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() / 2);
     45 		// Of course, a ParticleEffect is normally just used, without messing around with its emitters.
     46 		emitters = new Array(effect.getEmitters());
     47 		effect.getEmitters().clear();
     48 		effect.getEmitters().add(emitters.get(0));
     49 
     50 		inputProcessor = new InputProcessor() {
     51 			public boolean touchUp (int x, int y, int pointer, int button) {
     52 				return false;
     53 			}
     54 
     55 			public boolean touchDragged (int x, int y, int pointer) {
     56 				effect.setPosition(x, Gdx.graphics.getHeight() - y);
     57 				return false;
     58 			}
     59 
     60 			public boolean touchDown (int x, int y, int pointer, int newParam) {
     61 				// effect.setPosition(x, Gdx.graphics.getHeight() - y);
     62 				ParticleEmitter emitter = emitters.get(emitterIndex);
     63 				particleCount += 100;
     64 				System.out.println(particleCount);
     65 				particleCount = Math.max(0, particleCount);
     66 				if (particleCount > emitter.getMaxParticleCount()) emitter.setMaxParticleCount(particleCount * 2);
     67 				emitter.getEmission().setHigh(particleCount / emitter.getLife().getHighMax() * 1000);
     68 				effect.getEmitters().clear();
     69 				effect.getEmitters().add(emitter);
     70 				return false;
     71 			}
     72 
     73 			public boolean keyUp (int keycode) {
     74 				return false;
     75 			}
     76 
     77 			public boolean keyTyped (char character) {
     78 				return false;
     79 			}
     80 
     81 			public boolean keyDown (int keycode) {
     82 				ParticleEmitter emitter = emitters.get(emitterIndex);
     83 				if (keycode == Input.Keys.DPAD_UP)
     84 					particleCount += 5;
     85 				else if (keycode == Input.Keys.DPAD_DOWN)
     86 					particleCount -= 5;
     87 				else if (keycode == Input.Keys.SPACE) {
     88 					emitterIndex = (emitterIndex + 1) % emitters.size;
     89 					emitter = emitters.get(emitterIndex);
     90 
     91 					// if we've previously stopped the emitter reset it
     92 					if (emitter.isComplete()) emitter.reset();
     93 					particleCount = (int)(emitter.getEmission().getHighMax() * emitter.getLife().getHighMax() / 1000f);
     94 				} else if (keycode == Input.Keys.ENTER) {
     95 					emitter = emitters.get(emitterIndex);
     96 					if (emitter.isComplete())
     97 						emitter.reset();
     98 					else
     99 						emitter.allowCompletion();
    100 				} else
    101 					return false;
    102 				particleCount = Math.max(0, particleCount);
    103 				if (particleCount > emitter.getMaxParticleCount()) emitter.setMaxParticleCount(particleCount * 2);
    104 				emitter.getEmission().setHigh(particleCount / emitter.getLife().getHighMax() * 1000);
    105 				effect.getEmitters().clear();
    106 				effect.getEmitters().add(emitter);
    107 				return false;
    108 			}
    109 
    110 			@Override
    111 			public boolean mouseMoved (int x, int y) {
    112 				return false;
    113 			}
    114 
    115 			@Override
    116 			public boolean scrolled (int amount) {
    117 				return false;
    118 			}
    119 		};
    120 
    121 		Gdx.input.setInputProcessor(inputProcessor);
    122 	}
    123 
    124 	@Override
    125 	public void dispose () {
    126 		spriteBatch.dispose();
    127 		effect.dispose();
    128 	}
    129 
    130 	public void render () {
    131 		spriteBatch.getProjectionMatrix().setToOrtho2D(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    132 		float delta = Gdx.graphics.getDeltaTime();
    133 		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    134 		spriteBatch.begin();
    135 		effect.draw(spriteBatch, delta);
    136 		spriteBatch.end();
    137 		fpsCounter += delta;
    138 		if (fpsCounter > 3) {
    139 			fpsCounter = 0;
    140 			int activeCount = emitters.get(emitterIndex).getActiveCount();
    141 			Gdx.app.log("libgdx", activeCount + "/" + particleCount + " particles, FPS: " + Gdx.graphics.getFramesPerSecond());
    142 		}
    143 	}
    144 
    145 	public boolean needsGL20 () {
    146 		return false;
    147 	}
    148 }
    149