package org.test.towerdefense; import loon.LTexture; import loon.LTextures; import loon.action.sprite.SpriteBatch; import loon.action.sprite.SpriteBatch.SpriteEffects; import loon.action.sprite.painting.DrawableGameComponent; import loon.action.sprite.painting.IGameComponent; import loon.canvas.LColor; import loon.geom.RectBox; import loon.geom.Vector2f; import loon.utils.MathUtils; import loon.utils.timer.GameTime; public class AnimatedSprite extends DrawableGameComponent implements IGameComponent { private int animationSpeedRatioCounter; private int columnCount; private MainGame game; private float scale; private int spriteCount; private int spriteIndex; private LTexture texture; public AnimatedSprite(MainGame game, String textureFile, Vector2f drawPosition, int columnCount, int spriteCount, int spriteWidth, int spriteHeight, float scale) { super(game); this.setTextureFile(textureFile); this.setDrawPosition(drawPosition.cpy()); this.setSpriteWidth(spriteWidth); this.setSpriteHeight(spriteHeight); this.spriteCount = spriteCount; this.columnCount = columnCount; this.scale = scale; this.setObeyGameOpacity(true); this.setRotation(0f); this.setVerticalTextureOffset(0); this.setLayerDepth(1); this.setOnlyPlayOnceFeature(false); this.game = game; this.setAnimationSpeedRatio(1); this.setOnlyAnimateIfGameStateStarted(true); } public final RectBox CentralCollisionArea() { return new RectBox((int) this.getDrawPosition().x, (int) this.getDrawPosition().y, this.getSpriteWidth(), this.getSpriteHeight()); } private RectBox rect = new RectBox(); @Override public void draw(SpriteBatch batch, GameTime gameTime) { if (this.getOnlyPlayOnceFeature()) { if (!this.getPlayNow()) { this.spriteIndex = 0; } else if (this.spriteIndex == (this.spriteCount - 1)) { this.spriteIndex = 0; this.setPlayNow(false); } } int num = (this.spriteIndex - (this.spriteIndex % this.columnCount)) / this.columnCount; int num2 = this.spriteIndex % this.columnCount; rect.setBounds( num2 * this.getSpriteWidth(), (num * this.getSpriteHeight()) + this.getVerticalTextureOffset(), this.getSpriteWidth(), this.getSpriteHeight()); LColor color = (this.getObeyGameOpacity() && (this.game .getGameplayScreen() != null)) ? this.game.getGameplayScreen() .getGameOpacity() : LColor.white; batch.draw(this.texture, this.getDrawPosition(), rect, color, MathUtils.toDegrees(this.getRotation()), this.getOrigin(), this.scale, SpriteEffects.None); if (!this.getOnlyAnimateIfGameStateStarted() || (GameplayScreen.getGameState() == GameState.Started)) { if ((this.getAnimationSpeedRatio() == 1) || ((this.getAnimationSpeedRatio() > 1) && (this.animationSpeedRatioCounter == (this .getAnimationSpeedRatio() - 1)))) { this.spriteIndex++; if (this.getAnimationSpeedRatio() > 1) { this.animationSpeedRatioCounter = 0; } } this.animationSpeedRatioCounter++; } if (this.spriteIndex >= this.spriteCount) { this.spriteIndex = 0; } super.draw(batch, gameTime); } @Override protected void loadContent() { super.loadContent(); this.texture = LTextures.loadTexture(this.getTextureFile()); } private int privateAnimationSpeedRatio; public final int getAnimationSpeedRatio() { return privateAnimationSpeedRatio; } public final void setAnimationSpeedRatio(int value) { privateAnimationSpeedRatio = value; } private Vector2f privateDrawPosition = new Vector2f(); public final Vector2f getDrawPosition() { return privateDrawPosition; } public final void setDrawPosition(Vector2f value) { privateDrawPosition.set(value); } public final void addDrawPosition(Vector2f value) { privateDrawPosition.addSelf(value); } private int privateLayerDepth; public final int getLayerDepth() { return privateLayerDepth; } public final void setLayerDepth(int value) { privateLayerDepth = value; } private boolean privateObeyGameOpacity; public final boolean getObeyGameOpacity() { return privateObeyGameOpacity; } public final void setObeyGameOpacity(boolean value) { privateObeyGameOpacity = value; } private boolean privateOnlyAnimateIfGameStateStarted; public final boolean getOnlyAnimateIfGameStateStarted() { return privateOnlyAnimateIfGameStateStarted; } public final void setOnlyAnimateIfGameStateStarted(boolean value) { privateOnlyAnimateIfGameStateStarted = value; } private boolean privateOnlyPlayOnceFeature; public final boolean getOnlyPlayOnceFeature() { return privateOnlyPlayOnceFeature; } public final void setOnlyPlayOnceFeature(boolean value) { privateOnlyPlayOnceFeature = value; } private Vector2f privateOrigin = new Vector2f(); public final Vector2f getOrigin() { return privateOrigin; } public final void setOrigin(Vector2f value) { privateOrigin = value; } private boolean privatePlayNow; public final boolean getPlayNow() { return privatePlayNow; } public final void setPlayNow(boolean value) { privatePlayNow = value; } private float privateRotation; public final float getRotation() { return privateRotation; } public final void setRotation(float value) { privateRotation = value; } private int privateSpriteHeight; public final int getSpriteHeight() { return privateSpriteHeight; } public final void setSpriteHeight(int value) { privateSpriteHeight = value; } private int privateSpriteWidth; public final int getSpriteWidth() { return privateSpriteWidth; } public final void setSpriteWidth(int value) { privateSpriteWidth = value; } private String privateTextureFile; public final String getTextureFile() { return privateTextureFile; } public final void setTextureFile(String value) { privateTextureFile = value; } private int privateVerticalTextureOffset; public final int getVerticalTextureOffset() { return privateVerticalTextureOffset; } public final void setVerticalTextureOffset(int value) { privateVerticalTextureOffset = value; } }