package org.andengine.examples; import org.andengine.engine.camera.Camera; import org.andengine.engine.options.EngineOptions; import org.andengine.engine.options.ScreenOrientation; import org.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy; import org.andengine.entity.modifier.CardinalSplineMoveModifier; import org.andengine.entity.modifier.CardinalSplineMoveModifier.CardinalSplineMoveModifierConfig; import org.andengine.entity.modifier.DelayModifier; import org.andengine.entity.modifier.LoopEntityModifier; import org.andengine.entity.modifier.ParallelEntityModifier; import org.andengine.entity.modifier.RotationModifier; import org.andengine.entity.modifier.SequenceEntityModifier; import org.andengine.entity.primitive.Rectangle; import org.andengine.entity.scene.Scene; import org.andengine.entity.scene.background.Background; import org.andengine.entity.util.FPSLogger; import org.andengine.ui.activity.SimpleBaseGameActivity; import org.andengine.util.math.MathUtils; import org.andengine.util.modifier.ease.EaseLinear; import android.opengl.GLES20; /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga * * @author Nicolas Gramlich * @since 11:54:51 - 03.04.2010 */ public class CardinalSplineMoveModifierExample extends SimpleBaseGameActivity { // =========================================================== // Constants // =========================================================== private static final int CAMERA_WIDTH = 720; private static final int CAMERA_HEIGHT = 480; private static final int COUNT = 400; private static final float DURATION = 4; private static final float SIZE = 25; private static final float[] CONTROLPOINT_1_XS = { 2 * (CAMERA_WIDTH / 4), 1 * (CAMERA_WIDTH / 4), 1.5f * (CAMERA_WIDTH / 4), 2 * (CAMERA_WIDTH / 4) }; private static final float[] CONTROLPOINT_2_XS = { 2 * (CAMERA_WIDTH / 4), 3 * (CAMERA_WIDTH / 4), 2.5f * (CAMERA_WIDTH / 4), 2 * (CAMERA_WIDTH / 4) }; private static final float[] CONTROLPOINT_YS = { 3.5f * (CAMERA_HEIGHT / 4), 2 * (CAMERA_HEIGHT / 4), 1 * (CAMERA_HEIGHT / 4), 1.5f * (CAMERA_HEIGHT / 4), }; // =========================================================== // Fields // =========================================================== // =========================================================== // Constructors // =========================================================== // =========================================================== // Getter & Setter // =========================================================== // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== @Override public EngineOptions onCreateEngineOptions() { final Camera camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT); return new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera); } @Override public void onCreateResources() { } @Override public Scene onCreateScene() { this.mEngine.registerUpdateHandler(new FPSLogger()); final Scene scene = new Scene(); scene.setBackground(new Background(0, 0, 0)); for(int i = 0; i < COUNT; i++) { final float tension = MathUtils.random(-0.5f, 0.5f); this.addRectangleWithTension(scene, tension, MathUtils.random(0, DURATION * 2f)); } return scene; } private void addRectangleWithTension(final Scene pScene, final float pTension, float pDelay) { final Rectangle rectangle = new Rectangle(-SIZE, -SIZE, SIZE, SIZE, this.getVertexBufferObjectManager()); rectangle.setBlendFunction(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE); if(pTension < 0) { rectangle.setColor(1 - pTension, 0, 0, 0.5f); } else { rectangle.setColor(pTension, 0, 0, 0.5f); } final CardinalSplineMoveModifierConfig catmullRomMoveModifierConfig1 = new CardinalSplineMoveModifierConfig(CardinalSplineMoveModifierExample.CONTROLPOINT_1_XS.length, pTension); final CardinalSplineMoveModifierConfig catmullRomMoveModifierConfig2 = new CardinalSplineMoveModifierConfig(CardinalSplineMoveModifierExample.CONTROLPOINT_1_XS.length, pTension); for(int i = 0; i < CardinalSplineMoveModifierExample.CONTROLPOINT_1_XS.length; i++) { catmullRomMoveModifierConfig1.setControlPoint(i, CardinalSplineMoveModifierExample.CONTROLPOINT_1_XS[i] - SIZE / 2, CardinalSplineMoveModifierExample.CONTROLPOINT_YS[i] - SIZE / 2); catmullRomMoveModifierConfig2.setControlPoint(i, CardinalSplineMoveModifierExample.CONTROLPOINT_2_XS[i] - SIZE / 2, CardinalSplineMoveModifierExample.CONTROLPOINT_YS[i] - SIZE / 2); } rectangle.registerEntityModifier( new SequenceEntityModifier( new DelayModifier(pDelay), new LoopEntityModifier( new SequenceEntityModifier( new ParallelEntityModifier( new CardinalSplineMoveModifier(CardinalSplineMoveModifierExample.DURATION, catmullRomMoveModifierConfig1, EaseLinear.getInstance()), new RotationModifier(CardinalSplineMoveModifierExample.DURATION, -45, -315) ), new ParallelEntityModifier( new CardinalSplineMoveModifier(CardinalSplineMoveModifierExample.DURATION, catmullRomMoveModifierConfig2, EaseLinear.getInstance()), new RotationModifier(CardinalSplineMoveModifierExample.DURATION, 45, 315) ) ) ) ) ); pScene.attachChild(rectangle); } // =========================================================== // Methods // =========================================================== // =========================================================== // Inner and Anonymous Classes // =========================================================== }