mirror of
https://github.com/jneug/zeichenmaschine.git
synced 2026-04-14 14:43:33 +02:00
Nicht OOP Version von Raindrops als Beispiel ergänzt.
This commit is contained in:
14
examples/zm_raindrops/README.TXT
Normal file
14
examples/zm_raindrops/README.TXT
Normal file
@@ -0,0 +1,14 @@
|
||||
# Zeichenmaschine: Raindrops
|
||||
|
||||
Raindrops ist ein einfaches Spiel, bei dem Regentropfen vom Himmel fallen,
|
||||
die von der Spieler:in mit einem Eimer aufgefangen werden müssen.
|
||||
|
||||
Das Spiel wird nach und nach schwerer (mehr Tropfen, höheres Tempo), bis die
|
||||
Spieler:in zu viele Tropfen fallen gelassen hat.
|
||||
|
||||
Diese Variante des Spiels ist mit dem DrawingLayer implementiert.
|
||||
Eine objektorientierte Version ist im Beispielprojekt zm_raindrops_oop zu finden.
|
||||
|
||||
## Quellen
|
||||
- raindrop.png by @lagartoflojo (https://openclipart.org/detail/4063/water-drop)
|
||||
- bucket.png
|
||||
182
examples/zm_raindrops/Raindrops.java
Normal file
182
examples/zm_raindrops/Raindrops.java
Normal file
@@ -0,0 +1,182 @@
|
||||
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");
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
}
|
||||
BIN
examples/zm_raindrops/bucket.png
Normal file
BIN
examples/zm_raindrops/bucket.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 64 KiB |
32
examples/zm_raindrops/package.bluej
Normal file
32
examples/zm_raindrops/package.bluej
Normal file
@@ -0,0 +1,32 @@
|
||||
#BlueJ package file
|
||||
editor.fx.0.height=728
|
||||
editor.fx.0.width=1037
|
||||
editor.fx.0.x=95
|
||||
editor.fx.0.y=53
|
||||
objectbench.height=94
|
||||
objectbench.width=776
|
||||
package.divider.horizontal=0.6
|
||||
package.divider.vertical=0.8305369127516778
|
||||
package.editor.height=488
|
||||
package.editor.width=661
|
||||
package.editor.x=374
|
||||
package.editor.y=158
|
||||
package.frame.height=660
|
||||
package.frame.width=800
|
||||
package.numDependencies=0
|
||||
package.numTargets=1
|
||||
package.showExtends=true
|
||||
package.showUses=true
|
||||
project.charset=UTF-8
|
||||
readme.height=60
|
||||
readme.name=@README
|
||||
readme.width=48
|
||||
readme.x=10
|
||||
readme.y=10
|
||||
target1.height=70
|
||||
target1.name=Raindrops
|
||||
target1.showInterface=false
|
||||
target1.type=ClassTarget
|
||||
target1.width=120
|
||||
target1.x=70
|
||||
target1.y=10
|
||||
BIN
examples/zm_raindrops/raindrop.png
Normal file
BIN
examples/zm_raindrops/raindrop.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 44 KiB |
Reference in New Issue
Block a user