package org.test.crazyjumpergles.common; import loon.LTexture; import loon.LTextures; import loon.action.sprite.SpriteBatch; import loon.action.sprite.SpriteBatch.SpriteEffects; import loon.canvas.LColor; import loon.geom.RectBox; import loon.geom.Vector2f; import loon.opengl.BlendState; import loon.utils.RefObject; public class Sprite { protected boolean m_bColorBlend; protected boolean m_bEnableAlphaTest; protected boolean m_bEnableBlending = true; protected LColor m_Color = new LColor(0xff, 0xff, 0xff, 0xff); protected float m_fAlphaTestValue = 0.1f; protected float m_fRotationAngle; protected int m_iFlip; protected Vector2f m_Position = new Vector2f(0f, 0f); protected LTexture m_pTexture; protected RectBox m_rcTexSrcRegion = Tools.MakeInvalidRect(); protected Vector2f m_Size = new Vector2f(100f, 100f); protected String textureName = ""; public Sprite() { } public void AddTexture(LTexture pTexRes) { this.m_pTexture = pTexRes; } public void AddTextureByName(String texname, boolean bAutoLoad) { this.textureName = texname; if (bAutoLoad) { this.AddTexture(LTextures.loadTexture("assets/" + this.textureName + ".png")); } } public final void AddTextureByNamePostfix2Platform(String name, String ext, boolean bAutoLoad) { String texname = name + "." + ext; this.AddTextureByName(texname, bAutoLoad); } public final void AddTextureByNamePostfix3Platform(String name, String ext, boolean bAutoLoad) { String texname = name + "." + ext; this.AddTextureByName(texname, bAutoLoad); } public final void EnableAlphaTest(boolean bEnable) { this.m_bEnableAlphaTest = bEnable; } public final void EnableBlending(boolean bEnable) { this.m_bEnableBlending = bEnable; } public final void EnableColorBlend(boolean bEnable) { this.m_bColorBlend = bEnable; } public final LColor GetColor() { return this.m_Color; } public final float GetColorAlpha() { return this.m_Color.a; } public final int GetFlip() { return this.m_iFlip; } public final float GetHalfSizeX() { return (this.m_Size.x * 0.5f); } public final float GetHalfSizeY() { return (this.m_Size.y * 0.5f); } public final void GetPosition(RefObject<Vector2f> rPos) { rPos.argvalue = this.m_Position; } public final float GetPositionX() { return this.m_Position.x; } public final float GetPositionY() { return this.m_Position.y; } public final float GetRotationAngle() { return this.m_fRotationAngle; } public final void GetSize(RefObject<Float> rX, RefObject<Float> rY) { rX.argvalue = this.m_Size.x; rY.argvalue = this.m_Size.y; } public final float GetSizeX() { return this.m_Size.x; } public final float GetSizeY() { return this.m_Size.y; } public final LTexture GetTexture() { return this.m_pTexture; } public boolean IsLoaded() { return (this.m_pTexture != null); } public void Release() { this.Unload(); } public void Reload() { if (this.textureName.length() > 0) { this.m_pTexture = LTextures.loadTexture("assets/" + this.textureName + ".png"); } } public void Render(SpriteBatch batch) { if (this.m_bEnableBlending) { if (this.m_bColorBlend) { batch.setBlendState(BlendState.Additive); } else { batch.setBlendState(BlendState.NonPremultiplied); } } else { batch.setBlendState(BlendState.NonPremultiplied); } if (!this.IsLoaded()) { this.Reload(); } if (Tools.IsInvalidRect(this.m_rcTexSrcRegion)) { RenderQuad(batch, this.m_Position.x, this.m_Position.y, this.m_Size.x, this.m_Size.y, this.m_fRotationAngle, this.m_pTexture, null, this.m_iFlip, this.m_Color); } else { RenderQuad(batch, this.m_Position.x, this.m_Position.y, this.m_Size.x, this.m_Size.y, this.m_fRotationAngle, this.m_pTexture, this.m_rcTexSrcRegion, this.m_iFlip, this.m_Color); } } public void RenderQuad(SpriteBatch batch, RectBox rcScrDstRect, LTexture pTexture, RectBox pTexSrcRect, int iFlip, LColor color) { float width = rcScrDstRect.width; float height = rcScrDstRect.height; float x = rcScrDstRect.x + (width * 0.5f); float y = rcScrDstRect.y + (height * 0.5f); this.RenderQuad(batch, x, y, width, height, 0f, pTexture, pTexSrcRect, iFlip, color); } public void RenderQuad(SpriteBatch batch, float startX, float startY, float width, float height, LTexture pTexture, RectBox pTexSrcRect, int iFlip, LColor color) { this.RenderQuad(batch, startX + (width * 0.5f), startY + (height * 0.5f), width, height, 0f, pTexture, pTexSrcRect, iFlip, color); } private RectBox rectangle = new RectBox(); private Vector2f origin = new Vector2f(); public void RenderQuad(SpriteBatch batch, float x, float y, float width, float height, float rotation, LTexture pTexture, RectBox pTexSrcRect, int iFlip, LColor color) { SpriteEffects none = SpriteEffects.None; if (iFlip == 1) { none = SpriteEffects.FlipVertically; } else if (iFlip == 2) { none = SpriteEffects.FlipHorizontally; } if (pTexture != null) { if (rotation == 0f) { rectangle.setBounds((x - (width * 0.5f)), (y - (height * 0.5f)), width, height); batch.draw(pTexture, rectangle, pTexSrcRect, color, 0, Vector2f.STATIC_ZERO, none); } else { origin.set((width / 2), (height / 2)); rectangle.setBounds(x, y, width, height); batch.draw(pTexture, rectangle, pTexSrcRect, color, rotation, origin, none); } } else if (rotation == 0f) { batch.fillRect((x - (width * 0.5f)), (y - (height * 0.5f)), width, height); } else { batch.fillRect(x, y, width, height); } } public void Reset() { } public final void SetAlphaTestValue(float fValue) { this.m_fAlphaTestValue = fValue; } public final void SetColor(LColor clr) { this.m_Color = clr; } public final void SetColorAlpha(float fAlpha) { this.m_Color.a = fAlpha; } public final void SetFlip(int iFlip) { this.m_iFlip = iFlip; } public final void SetPosition(float x, float y) { this.m_Position.x = x; this.m_Position.y = y; } public final void SetPositionX(float x) { this.m_Position.x = x; } public final void SetPositionY(float y) { this.m_Position.y = y; } public final void SetRotationAngle(float fAngle) { this.m_fRotationAngle = fAngle; } public final void SetSize(float x, float y) { this.m_Size.x = x; this.m_Size.y = y; } public final void SetTexSrcRegion(int left, int right, int top, int bottom) { this.m_rcTexSrcRegion.x = left; this.m_rcTexSrcRegion.width = right - left; this.m_rcTexSrcRegion.y = top; this.m_rcTexSrcRegion.height = bottom - top; } public final void SetTexSrcRegionF(float left, float right, float top, float bottom) { if (this.m_pTexture != null) { float width = this.m_pTexture.getWidth(); float height = this.m_pTexture.getHeight(); this.SetTexSrcRegion((int) (width * left), (int) (width * right), (int) (height * top), (int) (height * bottom)); } } public void Tick(int deltaMS) { } public void Unload() { if (this.m_pTexture != null) { this.m_pTexture = null; } } public enum EFlip { Flip_No, Flip_Vertical, Flip_Horizontal; public int getValue() { return this.ordinal(); } public static EFlip forValue(int value) { return values()[value]; } } }