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) {
}
}
