LibGDX – Akcje aktora i refactor
Odcinek, w którym zrobiliśmy mały refactor inita w screenach i dodaliśmy akcje aktora.
Kod źródłowy odcinka: https://github.com/JavaDevMatt/tutorialclicker/tree/tut4
Klasa Player
package pl.javadevmatt.tutorialclicker.entities; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.math.Interpolation; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.scenes.scene2d.Action; import com.badlogic.gdx.scenes.scene2d.actions.Actions; import com.badlogic.gdx.scenes.scene2d.ui.Image; public class Player extends Image{ private final static int WIDHT = 77; private final static int HEIGHT = 152; private final static int STARTING_X = 200; private final static int STARTING_Y = 300; public Player(){ super(new Texture("badlogic.jpg")); this.setOrigin(WIDHT / 2, HEIGHT / 2); this.setSize(WIDHT, HEIGHT); // starting position this.setPosition(STARTING_X, STARTING_Y); } public void reactOnClick() { int xMoveAmmount = MathUtils.random(-130, 130); int yMoveAmmount = 10; float moveActionTime = 0.30f; Action moveAction = Actions.sequence( Actions.moveBy(xMoveAmmount, yMoveAmmount, moveActionTime, Interpolation.circleOut), Actions.moveBy(-xMoveAmmount, -yMoveAmmount, moveActionTime, Interpolation.circle) ); int xGrowAmmount = MathUtils.random(-30, 100); int yGrowAmmount = 20; float growActionTime = 0.2f; Action growAction = Actions.sequence( Actions.sizeBy(xGrowAmmount, yGrowAmmount, growActionTime, Interpolation.circleOut), Actions.sizeBy(-xGrowAmmount, -yGrowAmmount, growActionTime, Interpolation.circle) ); this.addAction(moveAction); this.addAction(growAction); if(this.getHeight() > 170){ this.addAction(Actions.rotateBy(MathUtils.randomSign() * 360, 0.4f)); } } }
Klasa GameplayScreen
package pl.javadevmatt.tutorialclicker.screens; import pl.javadevmatt.tutorialclicker.TutorialClickerGame; import pl.javadevmatt.tutorialclicker.entities.Player; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.ui.Button; import com.badlogic.gdx.scenes.scene2d.ui.Button.ButtonStyle; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; public class GameplayScreen extends AbstractScreen{ private Player player; private Button playerButton; public GameplayScreen(TutorialClickerGame game) { super(game); } @Override protected void init() { initPlayer(); initPlayerButton(); } private void initPlayerButton() { playerButton = new Button(new ButtonStyle()); playerButton.setWidth(460); playerButton.setHeight(360); playerButton.setX(10); playerButton.setY(170); playerButton.setDebug(true); stage.addActor(playerButton); playerButton.addListener(new ClickListener(){ @Override public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { player.reactOnClick(); return super.touchDown(event, x, y, pointer, button); } }); } private void initPlayer() { player = new Player(); stage.addActor(player); } @Override public void render(float delta) { super.render(delta); update(); spriteBatch.begin(); stage.draw(); spriteBatch.end(); } private void update() { stage.act(); } }
Klasa AbstractScreen
package pl.javadevmatt.tutorialclicker.screens; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Screen; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.utils.viewport.StretchViewport; import pl.javadevmatt.tutorialclicker.TutorialClickerGame; public abstract class AbstractScreen implements Screen{ protected TutorialClickerGame game; protected Stage stage; private OrthographicCamera camera; protected SpriteBatch spriteBatch; public AbstractScreen(TutorialClickerGame game){ this.game = game; createCamera(); stage = new Stage(new StretchViewport(TutorialClickerGame.WIDTH, TutorialClickerGame.HEIGHT, camera)); spriteBatch = new SpriteBatch(); Gdx.input.setInputProcessor(stage); init(); } protected abstract void init(); private void createCamera() { camera = new OrthographicCamera(); camera.setToOrtho(false, TutorialClickerGame.WIDTH, TutorialClickerGame.HEIGHT); camera.update(); } @Override public void render(float delta) { clearScreen(); camera.update(); spriteBatch.setProjectionMatrix(camera.combined); } @Override public void show() {} private void clearScreen() { Gdx.gl.glClearColor(0, 0, 0, 0); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); } @Override public void resume() { game.setPaused(false); } @Override public void pause() { game.setPaused(true); } @Override public void hide() {} @Override public void dispose() { game.dispose(); } @Override public void resize(int width, int height) { } }