Hello, I have the following code:
package cat.xtec.ioc.screens;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.GlyphLayout;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.scenes.scene2d.Action;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.actions.Actions;
import com.badlogic.gdx.scenes.scene2d.actions.SequenceAction;
import com.badlogic.gdx.utils.viewport.Viewport;
import java.util.ArrayList;
import cat.xtec.ioc.helpers.AssetManager;
import cat.xtec.ioc.helpers.InputHandler;
import cat.xtec.ioc.objects.Asteroid;
import cat.xtec.ioc.objects.ScrollHandler;
import cat.xtec.ioc.objects.Spacecraft;
import cat.xtec.ioc.utils.Settings;
public class GameScreen implements Screen {
// Els estats del joc
public enum GameState {
READY, RUNNING, GAMEOVER , PAUSE
}
private GameState currentState;
// Objectes necessaris
private Stage stage;
private Spacecraft spacecraft;
private ScrollHandler scrollHandler;
// Encarregats de dibuixar elements per pantalla
private ShapeRenderer shapeRenderer;
private Batch batch;
// Per controlar l'animació de l'explosió
private float explosionTime = 0;
// Preparem el textLayout per escriure text
private GlyphLayout textLayout;
public GameScreen(Batch prevBatch, Viewport prevViewport) {
// Iniciem la música
AssetManager.music.play();
// Creem el ShapeRenderer
shapeRenderer = new ShapeRenderer();
// Creem l'stage i assginem el viewport
stage = new Stage(prevViewport, prevBatch);
batch = stage.getBatch();
// Creem la nau i la resta d'objectes
spacecraft = new Spacecraft(Settings.SPACECRAFT_STARTX, Settings.SPACECRAFT_STARTY, Settings.SPACECRAFT_WIDTH, Settings.SPACECRAFT_HEIGHT);
scrollHandler = new ScrollHandler();
// Afegim els actors a l'stage
stage.addActor(scrollHandler);
stage.addActor(spacecraft);
// Donem nom a l'Actor
spacecraft.setName("spacecraft");
// Iniciem el GlyphLayout
textLayout = new GlyphLayout();
textLayout.setText(AssetManager.font, "Are you\nready?");
currentState = GameState.READY;
// Assignem com a gestor d'entrada la classe InputHandler
Gdx.input.setInputProcessor(new InputHandler(this));
}
private void drawElements() {
// Recollim les propietats del Batch de l'Stage
shapeRenderer.setProjectionMatrix(batch.getProjectionMatrix());
// Inicialitzem el shaperenderer
shapeRenderer.begin(ShapeRenderer.ShapeType.Line);
// Definim el color (verd)
shapeRenderer.setColor(new Color(0, 1, 0, 1));
// Pintem la nau
shapeRenderer.rect(spacecraft.getX(), spacecraft.getY(), spacecraft.getWidth(), spacecraft.getHeight());
// Recollim tots els Asteroid
ArrayList<Asteroid> asteroids = scrollHandler.getAsteroids();
Asteroid asteroid;
for (int i = 0; i < asteroids.size(); i++) {
asteroid = asteroids.get(i);
switch (i) {
case 0:
shapeRenderer.setColor(1, 0, 0, 1);
break;
case 1:
shapeRenderer.setColor(0, 0, 1, 1);
break;
case 2:
shapeRenderer.setColor(1, 1, 0, 1);
break;
default:
shapeRenderer.setColor(1, 1, 1, 1);
break;
}
shapeRenderer.circle(asteroid.getX() + asteroid.getWidth() / 2, asteroid.getY() + asteroid.getWidth() / 2, asteroid.getWidth() / 2);
}
shapeRenderer.end();
}
@Override
public void show() {
}
@Override
public void render(float delta) {
// Dibuixem tots els actors de l'stage
stage.draw();
// Depenent de l'estat del joc farem unes accions o unes altres
switch (currentState) {
case GAMEOVER:
updateGameOver(delta);
break;
case RUNNING:
updateRunning(delta);
break;
case READY:
updateReady();
break;
//TODO UBIQUEM LA PAUSA DE TAL FORMA QUE SIGUI UNA OPCIÓ
case PAUSE:
updatePause(delta);
}
//drawElements();
}
private void updateReady() {
// Dibuixem el text al centre de la pantalla
batch.begin();
AssetManager.font.draw(batch, textLayout, (Settings.GAME_WIDTH / 2) - textLayout.width / 2, (Settings.GAME_HEIGHT / 2) - textLayout.height / 2);
//stage.addActor(textLbl);
batch.end();
}
// TODO EXERCICI 2
// Creem la pantalla PAUSE
private void updatePause( float delta) {
SequenceAction actions = Actions.sequence(Actions.run(new Runnable() {
@Override
public void run() {
spacecraft.setVisible(true);
spacecraft.setVisible(false);
}
}),Actions.delay(.2f),Actions.run(new Runnable() {
@Override
public void run() {
spacecraft.setVisible(false);
spacecraft.setVisible(true);
}
}), Actions.delay(0.f));
Action myAction = Actions.forever(actions);
stage.addAction(myAction);
textLayout.setText(AssetManager.font,"Pause");
if(Gdx.input.isKeyPressed(Input.Keys.SPACE)){
currentState = GameState.READY;
} }
private void updateRunning(float delta) {
stage.act(delta);
if (scrollHandler.collides(spacecraft)) {
// Si hi ha hagut col·lisió: Reproduïm l'explosió i posem l'estat a GameOver
AssetManager.explosionSound.play();
stage.getRoot().findActor("spacecraft").remove();
textLayout.setText(AssetManager.font, "Game Over :'(");
currentState = GameState.GAMEOVER;
// TODO EXERCICI 2 he trobat aquesta forma de pausar.. Si dono al SPACE.. vaig a la pantalla updatePause
}else if (Gdx.input.isKeyJustPressed(Input.Keys.SPACE)){
currentState = GameState.PAUSE;
}
}
private void updateGameOver(float delta) {
stage.act(delta);
batch.begin();
AssetManager.font.draw(batch, textLayout, (Settings.GAME_WIDTH - textLayout.width) / 2, (Settings.GAME_HEIGHT - textLayout.height) / 2);
// Si hi ha hagut col·lisió: Reproduïm l'explosió i posem l'estat a GameOver
batch.draw(AssetManager.explosionAnim.getKeyFrame(explosionTime, false), (spacecraft.getX() + spacecraft.getWidth() / 2) - 32, spacecraft.getY() + spacecraft.getHeight() / 2 - 32, 64, 64);
batch.end();
explosionTime += delta;
}
public void reset() {
// Posem el text d'inici
textLayout.setText(AssetManager.font, "Are you\nready?");
// Cridem als restart dels elements.
spacecraft.reset();
scrollHandler.reset();
// Posem l'estat a 'Ready'
currentState = GameState.READY;
// Afegim la nau a l'stage
stage.addActor(spacecraft);
// Posem a 0 les variables per controlar el temps jugat i l'animació de l'explosió
explosionTime = 0.0f;
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void hide() {
}
@Override
public void dispose() {
}
public Spacecraft getSpacecraft() {
return spacecraft;
}
public Stage getStage() {
return stage;
}
public ScrollHandler getScrollHandler() {
return scrollHandler;
}
public GameState getCurrentState() {
return currentState;
}
public void setCurrentState(GameState currentState) {
this.currentState = currentState;
}
}
I have the problem with the following part of the code:
SequenceAction actions = Actions.sequence(Actions.run(new Runnable() {
@Override
public void run() {
spacecraft.setVisible(true);
spacecraft.setVisible(false);
}
}),Actions.delay(.2f),Actions.run(new Runnable() {
@Override
public void run() {
spacecraft.setVisible(false);
spacecraft.setVisible(true);
}
}), Actions.delay(0.f));
Action myAction = Actions.forever(actions);
stage.addAction(myAction);
textLayout.setText(AssetManager.font,"Pause");
if(Gdx.input.isKeyPressed(Input.Keys.SPACE)){
currentState = GameState.READY;
Basically I need the objects that are paused to blink, I have managed to do it but only when it is in play. I need you to do it but when the screen is paused that is updatePause ()
thanks!