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.game.GameObject;
import com.gebauz.bauzoid.graphics.sprite.Sprite;
import com.gebauz.bauzoid.graphics.sprite.SpriteInstance;
import com.gebauz.bauzoid.graphics.sprite.SpriteRegion;
import com.gebauz.bauzoid.graphics.sprite.TileBatch;
import com.gebauz.bauzoid.math.Rect;
import com.gebauz.bauzoid.math.Vector4;

public class FrameElement extends GameObject
{
        // TODO: make customizeable cell size
        public static final float CELL_SIZE = 32.0f;
       
        public static final float TOP_OFFSET_ = 18.0f;
        public static final float LEFT_OFFSET_ = 8.0f;
        public static final float RIGHT_OFFSET_ = 8.0f;
        public static final float BOTTOM_OFFSET_ = 12.0f;
       
/*      public static final float TOP_OFFSET = CELL_SIZE-18.0f;
        public static final float LEFT_OFFSET = CELL_SIZE-8.0f;
        public static final float RIGHT_OFFSET = CELL_SIZE-8.0f;
        public static final float BOTTOM_OFFSET = CELL_SIZE-12.0f;*/

       
        public enum FrameRegion
        {
                TOP_LEFT,
                TOP_CENTER,
                TOP_RIGHT,
                MID_LEFT,
                MID_CENTER,
                MID_RIGHT,
                BOTTOM_LEFT,
                BOTTOM_CENTER,
                BOTTOM_RIGHT,
        }
       
        public float x = 0.0f;
        public float y = 0.0f;
        public float w = 0.0f;
        public float h = 0.0f;
       
        public Vector4 color = new Vector4(1, 1, 1, 1);
       
        private Sprite mSprite = null;
        private SpriteInstance[] mSprites = new SpriteInstance[FrameRegion.values().length];
       
        /** Offsets for the frame, i.e. amount of pixels the actual inside-area is in from left/top/right/bottom. */
        private Rect mInnerOffset = null;
       
        private boolean mIncludeMidCenter = false;

        public FrameElement(Game game)
        {
                super(game);
        }

        public void init(String textureFile, boolean includeMidCenter)
        {
                mIncludeMidCenter = includeMidCenter;
               
                mSprite = new Sprite(getGame().getGraphics(), textureFile);
                mSprite.init();
               
                SpriteRegion[] regions = new SpriteRegion[FrameRegion.values().length];
                for (int i = 0; i < regions.length; i++)
                {
                        // offset by 1 to account for the margin between regions
                        Vector4 r = getRegion(FrameRegion.values()[i]);
                        regions[i] = new SpriteRegion(mSprite, i, r.x, r.y, r.z, r.w, true);
                }
                mSprite.setRegions(regions);           
                //mSprite = new AtlasSprite(getGame().getGraphics(), tex, regions);
               
                for (int i = 0; i < regions.length; i++)
                {
                        mSprites[i] = mSprite.createSpriteInstance(i);
                }
               
                if (mInnerOffset == null)
                {
                        mInnerOffset = new Rect(LEFT_OFFSET_, TOP_OFFSET_, RIGHT_OFFSET_, BOTTOM_OFFSET_);
                }
        }
       
        public void exit()
        {
               
        }
       
        public void update(float deltaTime)
        {
               
        }
       
        public void render()
        {
                TileBatch batch = getGraphics().getBatch();
               
                //batch.begin();
               
                if (mIncludeMidCenter)
                        renderMidCenter(batch);
               
                renderTopLeft(batch);
                renderTopCenter(batch);
                renderTopRight(batch);
                renderMidLeft(batch);
                renderMidRight(batch);
                renderBottomLeft(batch);
                renderBottomCenter(batch);
                renderBottomRight(batch);
               
                //batch.end();
        }
       
        public void renderTopLeft(TileBatch batch)
        {              
                SpriteInstance s = mSprites[FrameRegion.TOP_LEFT.ordinal()];
                s.transform.x = x + mInnerOffset.left;
                s.transform.y = y + mInnerOffset.top;
                s.transform.w = CELL_SIZE;
                s.transform.h = CELL_SIZE;
                s.transform.pivotX = s.transform.w;
                s.transform.pivotY = s.transform.h;
                s.color = color;
                //s.render();
                batch.drawSprite(s);
        }
       
        public void renderTopCenter(TileBatch batch)
        {              
                SpriteInstance s = mSprites[FrameRegion.TOP_CENTER.ordinal()];
                s.transform.x = x + mInnerOffset.left;
                s.transform.y = y + mInnerOffset.top;
                s.transform.w = w - mInnerOffset.left - mInnerOffset.right;
                s.transform.h = CELL_SIZE;
                s.transform.pivotX = 0;
                s.transform.pivotY = s.transform.h;
                s.color = color;
                //s.render();
                batch.drawSprite(s);
        }
       
        public void renderTopRight(TileBatch batch)
        {
                SpriteInstance s = mSprites[FrameRegion.TOP_RIGHT.ordinal()];
                s.transform.x = x + w - mInnerOffset.right;
                s.transform.y = y + mInnerOffset.top;
                s.transform.w = CELL_SIZE;
                s.transform.h = CELL_SIZE;
                s.transform.pivotX = 0;
                s.transform.pivotY = s.transform.h;
                s.color = color;
                //s.render();
                batch.drawSprite(s);
        }
       
        public void renderMidLeft(TileBatch batch)
        {
                SpriteInstance s = mSprites[FrameRegion.MID_LEFT.ordinal()];
                s.transform.x = x + mInnerOffset.left;
                s.transform.y = y + mInnerOffset.top;
                s.transform.w = CELL_SIZE;
                s.transform.h = h - mInnerOffset.top - mInnerOffset.bottom;
                s.transform.pivotX = s.transform.w;
                s.transform.pivotY = 0;
                s.color = color;
                //s.render();
                batch.drawSprite(s);
        }
       
        public void renderMidCenter(TileBatch batch)
        {
                SpriteInstance s = mSprites[FrameRegion.MID_CENTER.ordinal()];
                s.transform.x = x + mInnerOffset.left;
                s.transform.y = y + mInnerOffset.top;
                s.transform.w = w - mInnerOffset.left - mInnerOffset.right;
                s.transform.h = h - mInnerOffset.top - mInnerOffset.bottom;
                s.transform.pivotX = 0;
                s.transform.pivotY = 0;
                s.color = color;
                //s.render();
                batch.drawSprite(s);
        }
       
        public void renderMidRight(TileBatch batch)
        {
                SpriteInstance s = mSprites[FrameRegion.MID_RIGHT.ordinal()];
                s.transform.x = x + w - mInnerOffset.right;
                s.transform.y = y + mInnerOffset.top;
                s.transform.w = CELL_SIZE;
                s.transform.h = h - mInnerOffset.top - mInnerOffset.bottom;
                s.transform.pivotX = 0;
                s.transform.pivotY = 0;
                s.color = color;
                //s.render();
                batch.drawSprite(s);
        }
       
        public void renderBottomLeft(TileBatch batch)
        {
                SpriteInstance s = mSprites[FrameRegion.BOTTOM_LEFT.ordinal()];
                s.transform.x = x + mInnerOffset.left;
                s.transform.y = y + h - mInnerOffset.bottom;
                s.transform.w = CELL_SIZE;
                s.transform.h = CELL_SIZE;
                s.transform.pivotX = s.transform.w;
                s.transform.pivotY = 0;
                s.color = color;
                //s.render();
                batch.drawSprite(s);
        }
       
        public void renderBottomCenter(TileBatch batch)
        {
                SpriteInstance s = mSprites[FrameRegion.BOTTOM_CENTER.ordinal()];
                s.transform.x = x + mInnerOffset.left;
                s.transform.y = y + h - mInnerOffset.bottom;
                s.transform.w = w - mInnerOffset.left - mInnerOffset.right;
                s.transform.h = CELL_SIZE;
                s.transform.pivotX = 0;
                s.transform.pivotY = 0;
                s.color = color;
                //s.render();
                batch.drawSprite(s);
        }
       
        public void renderBottomRight(TileBatch batch)
        {
                SpriteInstance s = mSprites[FrameRegion.BOTTOM_RIGHT.ordinal()];
                s.transform.x = x + w - mInnerOffset.right;
                s.transform.y = y + h - mInnerOffset.bottom;
                s.transform.w = CELL_SIZE;
                s.transform.h = CELL_SIZE;
                s.transform.pivotX = 0;
                s.transform.pivotY = 0;
                s.color = color;
                //s.render();
                batch.drawSprite(s);
        }
       
        public Vector4 getRegion(FrameRegion region)
        {
                return new Vector4((region.ordinal() % 3) * 16, (region.ordinal() / 3) * 16, 16, 16);
        }

        public Rect getInnerOffset() { return mInnerOffset; }
        public void setInnerOffset(Rect offset) { mInnerOffset = offset; }
}