import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.awt.event.KeyListener; import java.awt.event.KeyEvent; import javax.swing.JFrame; class Manager implements KeyListener { enum States { INTRO, GAME } private final String USAGE = "------------------------------\n" + "Simple version of Flappy Bird\n" + "Press SPACE to jump!\n" + "------------------------------\n"; private final List _drawables; private Bird _bird; private Welt _welt; private States _state; private boolean _introDrawn; public Manager() { _drawables = new ArrayList(); Turtle turtle = new Turtle(); turtle.setzeGeschwindigkeit(10); JFrame fieldValue = new JFrame(); // Modifying Turtle.java is forbidden so use reflection to get the JFrame and add // a KeyListener lol try { Field frameField = TurtleWelt.class.getDeclaredField("_frame"); frameField.setAccessible(true); fieldValue = (JFrame) frameField.get(TurtleWelt.globaleWelt); fieldValue.addKeyListener(this); } catch (Exception ex) { System.out.println("Reflection hack failed"); System.exit(-1); } System.out.print(USAGE); //startGame(); _state = States.INTRO; long lastNanos, elapsed; long total = 0; lastNanos = System.nanoTime(); while (true) { elapsed = System.nanoTime() - lastNanos; total += elapsed; lastNanos = System.nanoTime(); switch (_state) { case GAME: updateGame(elapsed * 1e-6d); drawGame(turtle, elapsed * 1e-6d); break; case INTRO: drawIntro(turtle); // Start game after 4 seconds if (total > 4e9) { startGame(); } break; } // Try to achieve approximately 60 FPS (1000ms / 60 FPS = 16.666ms) int missingMs = (int)(16 - (System.nanoTime() - lastNanos) * 1e-6d); if (missingMs > 0) { try { Thread.sleep(missingMs); } catch (Exception e) {} } } } 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(); } else if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { System.exit(0); } } public void keyReleased(KeyEvent e) {} public void keyTyped(KeyEvent e) {} }