import schule.ngb.zm.Zeichenmaschine; public class Raindrops extends Zeichenmaschine { /** * Zähler für die gefangenen und fallen gelassenen Tropfen. */ int catched = 0, dropped = 0; /** * Startgeschwindigkeit, in der die Tropfen fallen. * * Die Tropfen fallen pro Frame (also ungefähr 60-mal pro Sekunde). */ double drop_speed = 1.0; /** * Objektvariablen für die Positionen der fünf Tropfen. */ double x1 = random(10, 390), y1 = 10; double x2 = random(10, 390), y2 = -60; double x3 = random(10, 390), y3 = -100; double x4 = random(10, 390), y4 = -170; double x5 = random(10, 390), y5 = -230; /** * Wird zu Beginn aufgerufen, um das Spiel zu initialisieren. */ public void setup() { setSize(400, 600); setTitle("ZM: Raindrops"); hideCursor(); drawing.setFontSize(64); } /** * Aktualisiert die Position der Tropfen und prüft, ob die Tropfen mit dem * Eimer oder dem Boden kollidieren. Ist dies der Fall, wird der Tropfen * wieder "nach oben" befördert und der entsprechende Zähler wird um eins * erhöht. Anschließend wird geprüft, ob die Geschwindigkeit erhöht werden * muss, oder ob das Spiel verloren wurde. */ public void update( double delta ) { // Tropfen bewegen y1 += drop_speed; y2 += drop_speed; y3 += drop_speed; y4 += drop_speed; y5 += drop_speed; // Kollision mit Eimer prüfen (Tropfen 1) if( x1 > mouseX-20 && x1 < mouseX+20 && y1 > 520 && y1 < 560 ) { x1 = random(10, 390); y1 = -10; catched += 1; // Nächster Level? if( catched > 0 && catched%10 == 0 ) { drop_speed += 2; } } else if( y1 > 560 ) { x1 = random(10, 390); y1 = -10; dropped += 1; } // Kollision mit Eimer prüfen (Tropfen 2) if( x2 > mouseX-20 && x2 < mouseX+20 && y2 > 520 && y2 < 560 ) { x2 = random(10, 390); y2 = -10; catched += 1; // Nächster Level? if( catched > 0 && catched%10 == 0 ) { drop_speed += 2; } } else if( y2 > 560 ) { x2 = random(10, 390); y2 = -10; dropped += 1; } // Kollision mit Eimer prüfen (Tropfen 3) if( x3 > mouseX-20 && x3 < mouseX+20 && y3 > 520 && y3 < 560 ) { x3 = random(10, 390); y3 = -10; catched += 1; // Nächster Level? if( catched > 0 && catched%10 == 0 ) { drop_speed += 2; } } else if( y3 > 560 ) { x3 = random(10, 390); y3 = -10; dropped += 1; } // Kollision mit Eimer prüfen (Tropfen 4) if( x4 > mouseX-20 && x4 < mouseX+20 && y4 > 520 && y4 < 560 ) { x4 = random(10, 390); y4 = -10; catched += 1; // Nächster Level? if( catched > 0 && catched%10 == 0 ) { drop_speed += 2; } } else if( y4 > 560 ) { x4 = random(10, 390); y4 = -10; dropped += 1; } // Kollision mit Eimer prüfen (Tropfen 5) if( x5 > mouseX-20 && x5 < mouseX+20 && y5 > 520 && y5< 560 ) { x5 = random(10, 390); y5 = -10; catched += 1; // Nächster Level? if( catched > 0 && catched%10 == 0 ) { drop_speed += 2; } } else if( y5 > 560 ) { x5 = random(10, 390); y5 = -10; dropped += 1; } // Game over? if( dropped >= 13 ) { stop(); // Stoppt das Spiel und ruft teardown() auf } } /** * Zeichnet die Spielszene (hintergrund, Eimer, Tropfen, Zähler) */ public void draw() { // Hintergrund blaugrau drawing.clear(129, 174, 206); // Boden zeichnen drawing.setFillColor(0, 144, 81); drawing.noStroke(); drawing.rect(0, height - 40, width, 40, NORTHWEST); // Eimer zeichnen drawing.image("bucket.png", mouseX, 540, 0.25); // Tropfen zeichnen drawing.image("raindrop.png", x1, y1, 0.1); drawing.image("raindrop.png", x2, y2, 0.1); drawing.image("raindrop.png", x3, y3, 0.1); drawing.image("raindrop.png", x4, y4, 0.1); drawing.image("raindrop.png", x5, y5, 0.1); // Punktezähler drawing.setFillColor(0); drawing.text(""+catched, 10, 10, NORTHWEST); drawing.text(""+dropped, 390, 10, NORTHEAST); } /** * Wird nach dem Aufruf von {@code stop()} aufgerufen. */ public void teardown() { // Alles löschen drawing.clear(129, 174, 206); // Text anzeigen (Punkte und Zeit) drawing.setFillColor(33); drawing.setFontSize(64); drawing.text("Game Over!", 200, 300); drawing.setFontSize(32); drawing.text("Punkte: " + catched, 200, 364); drawing.text("Zeit: " + (runtime/1000.0), 200, 396); redraw(); } public static void main( String[] args ) { new Raindrops(); } }