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 { private final String USAGE = "------------------------------\n" + "Simple version of Flappy Bird\n" + "Press SPACE to jump!\n" + "------------------------------\n"; private final Bird _bird; private final List _drawables; 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); _bird = new Bird(this); Welt welt = new Welt(this); long lastNanos, elapsed; lastNanos = System.nanoTime(); while (true) { elapsed = System.nanoTime() - lastNanos; lastNanos = System.nanoTime(); _bird.update(elapsed * 1e-6d); welt.update(elapsed * 1e-6d); if (welt.checkCollision(_bird.getRect())) { welt.reset(); } TurtleWelt.globaleWelt.bildschirmEinfaerben(255, 255, 255); for (var d : _drawables) { d.draw(turtle, elapsed * 1e-6d); } // 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) {} } } } public void addDrawable(Drawable d) { _drawables.add(d); } public void keyPressed(KeyEvent e) { if (e.getKeyChar() == ' ') { _bird.jump(); } } public void keyReleased(KeyEvent e) {} public void keyTyped(KeyEvent e) {} }