Skip to content

Commit a0421bd

Browse files
author
Marcel Kaufmann
committed
Level 5 A 3
1 parent b2fcc7f commit a0421bd

File tree

5 files changed

+132
-0
lines changed

5 files changed

+132
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Catcher {
2+
PShape c;
3+
float yPos;
4+
float xPos;
5+
float catcherWidth;
6+
float catcherHeight;
7+
8+
public Catcher( ) {
9+
catcherWidth = gameWidth/8;
10+
catcherHeight = gameHeight/100;
11+
rectMode(CENTER);
12+
fill(255);
13+
c = createShape(RECT, 0, 0, catcherWidth, catcherHeight);
14+
yPos = gameHeight-(gameHeight/8);
15+
xPos = gameWidth/2;
16+
}
17+
18+
void draw() {
19+
xPos = playerPosX;
20+
shape(c, xPos, yPos);
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
float playerPosX;
2+
float gameHeight;
3+
float gameWidth;
4+
Game game;
5+
6+
void setup() {
7+
size(400, 640);
8+
//fullScreen(P2D);
9+
gameWidth = width;
10+
gameHeight = height;
11+
game = new Game();
12+
}
13+
14+
void draw() {
15+
background(50);
16+
if (mousePressed) {
17+
playerPosX = mouseX;
18+
}
19+
game.execute();
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Coin {
2+
PShape c;
3+
float xPos;
4+
float yPos;
5+
float coinWidth;
6+
float coinHeigth;
7+
8+
public Coin() {
9+
ellipseMode(CENTER);
10+
init();
11+
}
12+
13+
void init( ) {
14+
coinWidth = gameHeight/50;
15+
coinHeigth = gameHeight/50;
16+
xPos = random(coinWidth, (gameWidth-1)-coinWidth);
17+
yPos = -coinHeigth;
18+
c = createShape(ELLIPSE, 0, 0, coinWidth, coinHeigth);
19+
c.setFill(color(255, 255, 0));
20+
}
21+
22+
void display( ) {
23+
shape(c, xPos, -coinWidth);
24+
c.translate(0, 2);
25+
yPos += 2;
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import java.util.Stack;
2+
3+
class Game {
4+
int lives;
5+
ArrayList<Coin> coinListInGame = new ArrayList<Coin>();
6+
Stack<Coin> waitingStack = new Stack();
7+
8+
Catcher catcher;
9+
10+
int interval = 1000;
11+
int savedTime = millis();
12+
13+
public Game () {
14+
lives = 5;
15+
catcher = new Catcher();
16+
}
17+
18+
19+
void execute() {
20+
catcher.draw();
21+
if (isTimeForNextOne()) {
22+
if (waitingStack.empty()) {
23+
waitingStack.push(new Coin());
24+
}
25+
Coin newCoin = waitingStack.pop();
26+
coinListInGame.add(newCoin);
27+
}
28+
29+
for (int i = 0; i < coinListInGame.size(); i++) {
30+
Coin currentCoin = coinListInGame.get(i);
31+
boolean isOut = isInOutZone(currentCoin);
32+
if (isOut) {
33+
coinListInGame.remove(currentCoin);
34+
currentCoin.init();
35+
waitingStack.push(currentCoin);
36+
lives --;
37+
} else {
38+
currentCoin.display();
39+
}
40+
}
41+
}
42+
43+
boolean isInOutZone(Coin coin) {
44+
return coin.yPos + coin.coinHeigth/2 >= gameHeight-1;
45+
}
46+
47+
boolean isTimeForNextOne( ) {
48+
int currentTime = millis();
49+
if (savedTime + interval < currentTime) {
50+
savedTime = currentTime;
51+
return true;
52+
}
53+
return false;
54+
}
55+
}

tutorial/Level5/Processing_Tutorial_Level_#5-CatcherGameTutorial.md

+8
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,13 @@ println("Lives: "+ lives); // Innerhalb der zyklischen Ausführung
3232

3333
[Mögliche Lösung](https://github.com/Flocksserver/CatcherTutorial/blob/master/tutorial/Level5/CatcherTutorialLevel5A2)
3434

35+
### Aufgabe 3
36+
1. Yeah! Wir haben einen dauerhaften Objektregen. Leider ist dieser sehr ineffizient, da der Speicher mit sehr viel Objekten vollgeschrieben wird.
37+
> Exkurs: In Java gibt es den *garbage collector*, der Objekte, die im Speicher existieren aber nicht mehr referenziert sind automatisch entfernt. Durch dein Entfernen der Objekte aus der *ingame*-Liste hast du keinen Zugriff mehr drauf (nicht mehr referenziert). Demnach könnte sich der *garbage collector* um das Entfernen der Objekte kümmern. Bist du also fein raus? Theoretisch ja, praktisch nein! Es ist *guter Stil* effizient zu programmieren, denn der *garbage collector* ist ein Feature der JVM (Java Virtual Machine). Wenn du beispielsweise das nächste mal etwas in C++ programmierst, hilft es dir gleich mit dem scharfen Blick zur Effizienz zu programmieren.
38+
39+
2. Passe deine Implementierung an, sodass das Objekt bei Kollision mit dem unteren Bildschirmrand nicht nur aus der *ingame*-Liste entfernt, sondern gleich wieder dem Stack hinzugefügt wird. Hast du im herunterfallenden Objekt globale Variablen die du wieder zurücksetzen musst? Bestimmt! Erstelle eine Funktion in der Klasse, die alle relevanten Variablen wieder auf den initialen Zustand zurücksetzt.
40+
41+
[Mögliche Lösung](https://github.com/Flocksserver/CatcherTutorial/blob/master/tutorial/Level5/CatcherTutorialLevel5A3)
42+
3543
# Nächstes Level
3644
Hier geht es weiter zum [nächsten Level :arrow_right:](https://github.com/Flocksserver/CatcherTutorial/blob/master/tutorial/Level6/Processing_Tutorial_Level_%236-CatcherGameTutorial.md)

0 commit comments

Comments
 (0)