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 GameScreen _game; private States _state; public Manager() { 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); IntroScreen intro = new IntroScreen(); _game = new GameScreen(); _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: _game.update(elapsed * 1e-6d); _game.draw(turtle, elapsed * 1e-6d); break; case INTRO: intro.draw(turtle); // Start game after 3 seconds if (total > 3e9) { 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 startGame() { _state = States.GAME; } public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_SPACE) { _game.jump(); } else if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { System.exit(0); } } public void keyReleased(KeyEvent e) {} public void keyTyped(KeyEvent e) {} }