Move states in their own classes

This commit is contained in:
David96 2020-12-31 13:29:21 +01:00
parent c99194fb6c
commit b0ceb684cb
5 changed files with 204 additions and 172 deletions

View File

@ -5,10 +5,10 @@ public class Bird
private final Rectangle _rect;
private double _speed;
public Bird(Manager man)
public Bird(GameScreen game)
{
_rect = new Rectangle(20, 20, 20, 20, "cyan", true);
man.addDrawable(_rect);
game.addDrawable(_rect);
}
public void reset()

49
GameScreen.java Normal file
View File

@ -0,0 +1,49 @@
import java.util.List;
import java.util.ArrayList;
class GameScreen
{
private final List<Drawable> _drawables;
private final Bird _bird;
private final Welt _welt;
public GameScreen()
{
_drawables = new ArrayList<Drawable>();
_bird = new Bird(this);
_welt = new Welt(this);
}
public void update(double elapsed)
{
_bird.update(elapsed);
_welt.update(elapsed);
if (_welt.checkCollision(_bird.getRect()) ||
_bird.getRect().getY() + _bird.getRect().getHeight() > TurtleWelt.HEIGHT)
{
_bird.reset();
_welt.reset();
}
}
public void draw(Turtle turtle, double elapsed)
{
TurtleWelt.globaleWelt.bildschirmEinfaerben(255, 255, 255);
for (var d : _drawables)
{
d.draw(turtle, elapsed);
}
}
public void addDrawable(Drawable d)
{
_drawables.add(d);
}
public void jump()
{
_bird.jump();
}
}

142
IntroScreen.java Normal file
View File

@ -0,0 +1,142 @@
class IntroScreen
{
private boolean _introDrawn;
public IntroScreen() {}
private void goTo(Turtle t, int x, int y)
{
t.hinterlasseKeineSpur();
t.geheZu(x, y);
t.hinterlasseSpur();
}
/*
* Draws Flappy Bird on screen.
* There are surely much nicer ways of doing this but this had the least
* cognitive overhead.
*/
public void draw(Turtle t)
{
if (!_introDrawn)
{
TurtleWelt.globaleWelt.bildschirmEinfaerben(0, 0, 0);
_introDrawn = true;
t.setzeFarbe("gruen");
// F
goTo(t, 100, 100);
t.setzeGeschwindigkeit(1);
t.setzeRichtung(180);
t.geheVor(50);
t.setzeRichtung(90);
t.geheVor(50);
t.setzeRichtung(0);
t.geheVor(40);
t.setzeRichtung(180);
t.geheVor(40);
t.setzeRichtung(90);
t.geheVor(50);
// L
goTo(t, 110, 100);
t.setzeRichtung(90);
t.geheVor(100);
t.setzeRichtung(0);
t.geheVor(50);
// A
goTo(t, 170, 200);
t.setzeRichtung(-90);
t.geheVor(100);
t.setzeRichtung(0);
t.geheVor(50);
t.setzeRichtung(90);
t.geheVor(50);
t.setzeRichtung(180);
t.geheVor(50);
t.geheVor(-50);
t.setzeRichtung(90);
t.geheVor(50);
// PP
goTo(t, 230, 200);
for (int i = 0; i < 2; ++i)
{
t.setzeRichtung(-90);
t.geheVor(100);
t.setzeRichtung(0);
t.geheVor(50);
t.setzeRichtung(90);
t.geheVor(50);
t.setzeRichtung(180);
t.geheVor(50);
goTo(t, 290, 200);
}
// Y
goTo(t, 350, 100);
t.setzeRichtung(90);
t.geheVor(50);
t.setzeRichtung(0);
t.geheVor(25);
t.setzeRichtung(90);
t.geheVor(50);
t.geheVor(-50);
t.setzeRichtung(0);
t.geheVor(25);
t.setzeRichtung(-90);
t.geheVor(50);
t.setzeFarbe("blau");
// B
goTo(t, 50, 210);
t.setzeRichtung(90);
t.geheVor(100);
t.setzeRichtung(0);
t.geheVor(50);
t.setzeRichtung(-90);
t.geheVor(50);
t.setzeRichtung(180);
t.geheVor(50);
t.geheVor(-40);
t.setzeRichtung(-90);
t.geheVor(50);
t.setzeRichtung(180);
t.geheVor(40);
// I
goTo(t, 110, 210);
t.setzeRichtung(90);
t.geheVor(100);
// R
goTo(t, 170, 310);
t.setzeRichtung(-90);
t.geheVor(100);
t.setzeRichtung(0);
t.geheVor(40);
t.setzeRichtung(90);
t.geheVor(50);
t.setzeRichtung(180);
t.geheVor(40);
t.geheVor(-50);
t.setzeRichtung(90);
t.geheVor(50);
// D
goTo(t, 235, 210);
t.geheVor(100);
t.setzeRichtung(0);
t.geheVor(-5);
t.geheVor(50);
t.setzeRichtung(-90);
t.geheVor(100);
t.setzeRichtung(180);
t.geheVor(50);
t.setzeGeschwindigkeit(10);
}
}
}

View File

@ -17,15 +17,11 @@ class Manager implements KeyListener
"Simple version of Flappy Bird\n" +
"Press SPACE to jump!\n" +
"------------------------------\n";
private final List<Drawable> _drawables;
private Bird _bird;
private Welt _welt;
private final GameScreen _game;
private States _state;
private boolean _introDrawn;
public Manager()
{
_drawables = new ArrayList<Drawable>();
Turtle turtle = new Turtle();
turtle.setzeGeschwindigkeit(10);
@ -50,7 +46,8 @@ class Manager implements KeyListener
System.out.print(USAGE);
//startGame();
IntroScreen intro = new IntroScreen();
_game = new GameScreen();
_state = States.INTRO;
long lastNanos, elapsed;
@ -65,13 +62,13 @@ class Manager implements KeyListener
switch (_state)
{
case GAME:
updateGame(elapsed * 1e-6d);
drawGame(turtle, elapsed * 1e-6d);
_game.update(elapsed * 1e-6d);
_game.draw(turtle, elapsed * 1e-6d);
break;
case INTRO:
drawIntro(turtle);
// Start game after 4 seconds
if (total > 4e9)
intro.draw(turtle);
// Start game after 3 seconds
if (total > 3e9)
{
startGame();
}
@ -90,172 +87,16 @@ class Manager implements KeyListener
}
}
private void goTo(Turtle t, int x, int y)
{
t.hinterlasseKeineSpur();
t.geheZu(x, y);
t.hinterlasseSpur();
}
private void drawIntro(Turtle t)
{
if (!_introDrawn)
{
_introDrawn = true;
// F
goTo(t, 100, 100);
t.setzeGeschwindigkeit(1);
t.setzeRichtung(180);
t.geheVor(50);
t.setzeRichtung(90);
t.geheVor(50);
t.setzeRichtung(0);
t.geheVor(40);
t.setzeRichtung(180);
t.geheVor(40);
t.setzeRichtung(90);
t.geheVor(50);
// L
goTo(t, 110, 100);
t.setzeRichtung(90);
t.geheVor(100);
t.setzeRichtung(0);
t.geheVor(50);
// A
goTo(t, 170, 200);
t.setzeRichtung(-90);
t.geheVor(100);
t.setzeRichtung(0);
t.geheVor(50);
t.setzeRichtung(90);
t.geheVor(50);
t.setzeRichtung(180);
t.geheVor(50);
t.geheVor(-50);
t.setzeRichtung(90);
t.geheVor(50);
// PP
goTo(t, 230, 200);
for (int i = 0; i < 2; ++i)
{
t.setzeRichtung(-90);
t.geheVor(100);
t.setzeRichtung(0);
t.geheVor(50);
t.setzeRichtung(90);
t.geheVor(50);
t.setzeRichtung(180);
t.geheVor(50);
goTo(t, 290, 200);
}
// Y
goTo(t, 350, 100);
t.setzeRichtung(90);
t.geheVor(50);
t.setzeRichtung(0);
t.geheVor(25);
t.setzeRichtung(90);
t.geheVor(50);
t.geheVor(-50);
t.setzeRichtung(0);
t.geheVor(25);
t.setzeRichtung(-90);
t.geheVor(50);
// B
goTo(t, 50, 210);
t.setzeRichtung(90);
t.geheVor(100);
t.setzeRichtung(0);
t.geheVor(50);
t.setzeRichtung(-90);
t.geheVor(50);
t.setzeRichtung(180);
t.geheVor(50);
t.geheVor(-40);
t.setzeRichtung(-90);
t.geheVor(50);
t.setzeRichtung(180);
t.geheVor(40);
// I
goTo(t, 110, 210);
t.setzeRichtung(90);
t.geheVor(100);
// R
goTo(t, 170, 310);
t.setzeRichtung(-90);
t.geheVor(100);
t.setzeRichtung(0);
t.geheVor(40);
t.setzeRichtung(90);
t.geheVor(50);
t.setzeRichtung(180);
t.geheVor(40);
t.geheVor(-50);
t.setzeRichtung(90);
t.geheVor(50);
// D
goTo(t, 235, 210);
t.geheVor(100);
t.setzeRichtung(0);
t.geheVor(-5);
t.geheVor(50);
t.setzeRichtung(-90);
t.geheVor(100);
t.setzeRichtung(180);
t.geheVor(50);
t.setzeGeschwindigkeit(10);
}
}
private void startGame()
{
_state = States.GAME;
_bird = new Bird(this);
_welt = new Welt(this);
}
private void updateGame(double elapsed)
{
_bird.update(elapsed);
_welt.update(elapsed);
if (_welt.checkCollision(_bird.getRect()) ||
_bird.getRect().getY() + _bird.getRect().getHeight() > TurtleWelt.HEIGHT)
{
_bird.reset();
_welt.reset();
}
}
private void drawGame(Turtle turtle, double elapsed)
{
TurtleWelt.globaleWelt.bildschirmEinfaerben(255, 255, 255);
for (var d : _drawables)
{
d.draw(turtle, elapsed);
}
}
public void addDrawable(Drawable d)
{
_drawables.add(d);
}
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_SPACE)
{
_bird.jump();
_game.jump();
}
else if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
{

View File

@ -9,9 +9,9 @@ class Welt implements Drawable
private double _acc = 2;
private final Random _random;
public Welt(Manager manager)
public Welt(GameScreen game)
{
manager.addDrawable(this);
game.addDrawable(this);
_random = new Random();
_obstacles = new ArrayList<Rectangle>();
reset();