package org.andengine.entity.text; import org.andengine.engine.camera.Camera; import org.andengine.entity.text.exception.OutOfCharactersException; import org.andengine.opengl.font.IFont; import org.andengine.opengl.util.GLState; import org.andengine.opengl.vbo.VertexBufferObjectManager; import org.andengine.util.HorizontalAlign; import android.opengl.GLES20; /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 10:02:04 - 05.05.2010 */ public class TickerText extends Text { // =========================================================== // Constants // =========================================================== // =========================================================== // Fields // =========================================================== private final TickerTextOptions mTickerTextOptions; private int mCharactersVisible; private float mSecondsElapsed; private float mDuration; // =========================================================== // Constructors // =========================================================== public TickerText(final float pX, final float pY, final IFont pFont, final String pText, final TickerTextOptions pTickerTextOptions, final VertexBufferObjectManager pVertexBufferObjectManager) { super(pX, pY, pFont, pText, pTickerTextOptions, pVertexBufferObjectManager); this.mTickerTextOptions = pTickerTextOptions; this.mDuration = this.mCharactersToDraw * this.mTickerTextOptions.mCharactersPerSecond; } // =========================================================== // Getter & Setter // =========================================================== @Override public TickerTextOptions getTextOptions() { return (TickerTextOptions) super.getTextOptions(); } public boolean isReverse() { return this.getTextOptions().mReverse; } public void setReverse(final boolean pReverse) { this.mTickerTextOptions.mReverse = pReverse; } public float getCharactersPerSecond() { return this.mTickerTextOptions.mCharactersPerSecond; } public void setCharactersPerSecond(final float pCharactersPerSecond) { this.mTickerTextOptions.mCharactersPerSecond = pCharactersPerSecond; this.mDuration = this.mCharactersToDraw * pCharactersPerSecond; } public int getCharactersVisible() { return this.mCharactersVisible; } @Override public void setText(CharSequence pText) throws OutOfCharactersException { super.setText(pText); if(this.mTickerTextOptions != null) { this.mDuration = this.mCharactersToDraw * this.mTickerTextOptions.mCharactersPerSecond; } } // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== @Override protected void onManagedUpdate(final float pSecondsElapsed) { super.onManagedUpdate(pSecondsElapsed); if(this.mTickerTextOptions.mReverse) { if(this.mCharactersVisible < this.mCharactersToDraw) { this.mSecondsElapsed = Math.max(0, this.mSecondsElapsed - pSecondsElapsed); this.mCharactersVisible = (int) (this.mSecondsElapsed * this.mTickerTextOptions.mCharactersPerSecond); } } else { if(this.mCharactersVisible < this.mCharactersToDraw) { this.mSecondsElapsed = Math.min(this.mDuration, this.mSecondsElapsed + pSecondsElapsed); this.mCharactersVisible = (int) (this.mSecondsElapsed * this.mTickerTextOptions.mCharactersPerSecond); } } } @Override protected void draw(final GLState pGLState, final Camera pCamera) { this.mTextVertexBufferObject.draw(GLES20.GL_TRIANGLES, this.mCharactersVisible * Text.VERTICES_PER_LETTER); } @Override public void reset() { super.reset(); this.mCharactersVisible = 0; this.mSecondsElapsed = 0; } // =========================================================== // Methods // =========================================================== // =========================================================== // Inner and Anonymous Classes // =========================================================== public static class TickerTextOptions extends TextOptions { // =========================================================== // Constants // =========================================================== // =========================================================== // Fields // =========================================================== /* package */ float mCharactersPerSecond; /* package */ boolean mReverse; // =========================================================== // Constructors // =========================================================== public TickerTextOptions() { } public TickerTextOptions(final float pCharactersPerSecond) { this(pCharactersPerSecond, false); } public TickerTextOptions(final float pCharactersPerSecond, final boolean pReverse) { this(HorizontalAlign.LEFT, pCharactersPerSecond, pReverse); } public TickerTextOptions(final HorizontalAlign pHorizontalAlign, final float pCharactersPerSecond) { this(AutoWrap.NONE, 0, pHorizontalAlign, Text.LEADING_DEFAULT, pCharactersPerSecond, false); } public TickerTextOptions(final HorizontalAlign pHorizontalAlign, final float pCharactersPerSecond, final boolean pReverse) { this(AutoWrap.NONE, 0, pHorizontalAlign, Text.LEADING_DEFAULT, pCharactersPerSecond, pReverse); } public TickerTextOptions(final AutoWrap pAutoWrap, final float pAutoWrapWidth, final HorizontalAlign pHorizontalAlign, final float pCharactersPerSecond) { this(pAutoWrap, pAutoWrapWidth, pHorizontalAlign, Text.LEADING_DEFAULT, pCharactersPerSecond, false); } public TickerTextOptions(final AutoWrap pAutoWrap, final float pAutoWrapWidth, final HorizontalAlign pHorizontalAlign, final float pLeading, final float pCharactersPerSecond) { this(pAutoWrap, pAutoWrapWidth, pHorizontalAlign, pLeading, pCharactersPerSecond, false); } public TickerTextOptions(final AutoWrap pAutoWrap, final float pAutoWrapWidth, final HorizontalAlign pHorizontalAlign, final float pLeading, final float pCharactersPerSecond, final boolean pReverse) { super(pAutoWrap, pAutoWrapWidth, pHorizontalAlign, pLeading); this.mCharactersPerSecond = pCharactersPerSecond; this.mReverse = pReverse; } // =========================================================== // Getter & Setter // =========================================================== public float getCharactersPerSecond() { return this.mCharactersPerSecond; } public void setCharactersPerSecond(final float pCharactersPerSecond) { this.mCharactersPerSecond = pCharactersPerSecond; } public boolean isReverse() { return this.mReverse; } public void setReverse(final boolean pReverse) { this.mReverse = pReverse; } // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== // =========================================================== // Methods // =========================================================== // =========================================================== // Inner and Anonymous Classes // =========================================================== } }