Subversion Repositories AndroidProjects

Rev

Blame | Last modification | View Log | RSS feed

package com.gebauz.bauzoid.menu;

import com.gebauz.bauzoid.game.Game;
import com.gebauz.bauzoid.graphics.sprite.Sprite;
import com.gebauz.bauzoid.graphics.sprite.SpriteInstance;
import com.gebauz.bauzoid.math.Rect;
import com.gebauz.bauzoid.math.Vector4;
import com.gebauz.bauzoid.parser.ScanException;
import com.gebauz.bauzoid.parser.Tokenizer;

/** Button that uses a Frame as image.
 *
 * @author chiu
 *
 */

public class SegmentButton extends Button
{
        // Constants========================================================================================


        // Embedded Types===================================================================================

        // Fields===========================================================================================
       
        private String mTextureName = "";
        private String mPushTextureName = "";
        private String mButtonImageName = "";
       
        private FrameElement mImage = null;
        private FrameElement mPushImage = null;
       
        private Sprite mButtonImageSprite = null;
        private SpriteInstance mButtonImage = null;
        private float mButtonImageScale = 1.0f;
        private HorizontalAlign mButtonImageAlignH = HorizontalAlign.CENTER;
        private VerticalAlign mButtonImageAlignV = VerticalAlign.CENTER;
       
        // Methods==========================================================================================

        public SegmentButton(Game game, Menu parent, String name)
        {
                super(game, parent, name);
        }
       
        @Override
        public void init()
        {
                super.init();
               
                mImage = new FrameElement(getParent().getGame());
                mImage.setInnerOffset(new Rect(FrameElement.CELL_SIZE, FrameElement.CELL_SIZE, FrameElement.CELL_SIZE, FrameElement.CELL_SIZE));
                //mImage.init(new Texture(Gdx.files.internal(mTextureName)), true);
                mImage.init(mTextureName, true);
                Frame.setFrameProperties(mImage, this);
               
                if (!mPushTextureName.isEmpty())
                {
                        mPushImage = new FrameElement(getParent().getGame());
                        if (mPushImage != null)
                        {
                                mPushImage.setInnerOffset(new Rect(FrameElement.CELL_SIZE, FrameElement.CELL_SIZE, FrameElement.CELL_SIZE, FrameElement.CELL_SIZE));
                                mPushImage.init(mPushTextureName, true);
                                //mPushImage.init(new Texture(Gdx.files.internal(mPushTextureName)), true);
                                Frame.setFrameProperties(mPushImage, this);
                        }
                }
               
                if (!mButtonImageName.isEmpty())
                {
                        //mButtonImage = new Sprite(getParent().getGame().getGraphics(), new Texture(Gdx.files.internal(mButtonImageName)));
                        mButtonImageSprite = new Sprite(getGame().getGraphics(), mButtonImageName);
                        mButtonImageSprite.init();
                        mButtonImage = mButtonImageSprite.createSpriteInstance(0);
                }
        }
       
        @Override
        public void exit()
        {
                if (mImage != null)
                {
                        mImage.exit();
                        mImage = null;
                }
               
                if (mPushImage != null)
                {
                        mPushImage.exit();
                        mPushImage = null;
                }
               
                if (mButtonImageSprite != null)
                {
                        mButtonImageSprite.dispose();
                        mButtonImageSprite = null;
                }
                mButtonImage = null;
               
                super.exit();
        }
       
        @Override
        public void update(float deltaTime)
        {
                super.update(deltaTime);
               
                mImage.update(deltaTime);              
                Frame.setFrameProperties(mImage, this);
                if (mPushImage != null)
                {
                        Frame.setFrameProperties(mPushImage, this);
                        mPushImage.update(deltaTime);
                }
               
                if (mButtonImage != null)
                {
                        // treat like text
                        float w = getRight() - getLeft();
                        float h = getBottom() - getTop();                      
                       
                        mButtonImage.transform.x = getLeft();
                        mButtonImage.transform.y = getTop();
                        mButtonImage.transform.w = mButtonImageSprite.getTextureWidth() * mButtonImageScale;
                        mButtonImage.transform.h = mButtonImageSprite.getTextureHeight() * mButtonImageScale;
                        mButtonImage.transform.pivotX = 0;
                        mButtonImage.transform.pivotY = 0;
                       
                        if (mButtonImageAlignH == HorizontalAlign.RIGHT)
                        {
                                mButtonImage.transform.x = getRight();
                                mButtonImage.transform.pivotX = mButtonImage.transform.w;
                        }
                        else if (mButtonImageAlignH == HorizontalAlign.CENTER)
                        {
                                mButtonImage.transform.x = getLeft() + w/2;
                                mButtonImage.transform.pivotX = mButtonImage.transform.w/2;
                        }
                       
                        if (mButtonImageAlignV == VerticalAlign.BOTTOM)
                        {
                                mButtonImage.transform.y = getBottom();
                                mButtonImage.transform.pivotY = mButtonImage.transform.h;
                        }                      
                        else if (mButtonImageAlignV == VerticalAlign.CENTER)
                        {
                                mButtonImage.transform.y = getTop() + h/2;
                                mButtonImage.transform.pivotY = mButtonImage.transform.h/2;
                        }
                       
                        if (isButtonDown())
                        {
                                mButtonImage.transform.x += getPushOffset().x;
                                mButtonImage.transform.y += getPushOffset().y;
                        }
                }
        }
       
        @Override
        public void render()
        {
                if (isButtonDown() && (mPushImage != null))
                        mPushImage.render();
                else
                        mImage.render();

                if (mButtonImage != null)
                {
                        float oldAlpha = mButtonImage.alpha;
                        mButtonImage.alpha *= getParent().getFadeAlpha();
                       
                        if (getTextElement().isShadow())
                        {                      
                                Vector4 oldColor = mButtonImage.color;
                                mButtonImage.color = getTextElement().getShadowColor();
                                mButtonImage.transform.x += getTextElement().getShadowOffset().x;
                                mButtonImage.transform.y += getTextElement().getShadowOffset().y;
                                mButtonImage.render();
                                mButtonImage.transform.x -= getTextElement().getShadowOffset().x;
                                mButtonImage.transform.y -= getTextElement().getShadowOffset().y;
                                mButtonImage.color = oldColor;
                        }
                       

                        mButtonImage.render();
                        mButtonImage.alpha = oldAlpha;
                }

                super.render();
        }
       
        public boolean parseLine(String identifier, Tokenizer tokenizer) throws ScanException  
        {
                if (identifier.equalsIgnoreCase("texture"))
                {
                        mTextureName = MenuUtil.parseString(tokenizer);
                }
                else if (identifier.equalsIgnoreCase("pushTexture"))
                {
                        mPushTextureName = MenuUtil.parseString(tokenizer);
                }
                else if (identifier.equalsIgnoreCase("buttonImage"))
                {
                        mButtonImageName = MenuUtil.parseString(tokenizer);
                }
                else if (identifier.equalsIgnoreCase("buttonImageScale"))
                {
                        mButtonImageScale = MenuUtil.parseNumber(tokenizer);
                }
                else if (identifier.equalsIgnoreCase("buttonImageAlign"))
                {
                        mButtonImageAlignH = MenuUtil.stringToHorizontalAlignment(tokenizer.readIdentifier());
                        tokenizer.readToken(",");
                        mButtonImageAlignV = MenuUtil.stringToVerticalAlignment(tokenizer.readIdentifier());
                        tokenizer.readToken(";");
                }
                else
                {
                        return super.parseLine(identifier, tokenizer);
                }              
                return true;
        }
       
        // Getters/Setters==================================================================================

}