1
0
Fork 0

Compare commits

..

No commits in common. "master" and "A4.1RC" have entirely different histories.

15 changed files with 81 additions and 430 deletions

View File

@ -3,13 +3,8 @@
- Einführung in die Programmierung WS19/20 - Einführung in die Programmierung WS19/20
- Programmieren des Spieles "Breakout" basierend auf dem Framework des Instituts - Programmieren des Spieles "Breakout" basierend auf dem Framework des Instituts
# alte Gruppe (bis inkl. 3.) # Gruppe
Gruppennummer: 175 Gruppennummer: 175
Gruppenmitglieder Gruppenmitglieder
- [Ruben Meyer](mailto:ruben.meyer@student.uni-luebeck.de) - [Ruben Meyer](mailto:ruben.meyer@student.uni-luebeck.de)
- [Moritz Henseleit](mailto:moritz.henseleit@student.uni-luebeck.de) - [Moritz Henseleit](mailto:moritz.henseleit@student.uni-luebeck.de)
# neue Gruppe (ab inkl. 4.)
Gruppennummer: 262
Gruppenmitglieder:
- [Ruben Meyer](mailto:ruben.meyer@student.uni-luebeck.de)

View File

@ -1,7 +1,7 @@
#!/usr/bin/env zsh #!/usr/bin/env zsh
# project prefix # project prefix
PREFIX="262-BreakOutA" PREFIX="175-BreakOutA"
# get versioning # get versioning
echo -n "Type your tag version for '$PREFIX' (like (2.1) followed by [ENTER] for ${PREFIX}2.1): " echo -n "Type your tag version for '$PREFIX' (like (2.1) followed by [ENTER] for ${PREFIX}2.1): "

View File

@ -1,35 +1,33 @@
{ {
"field" : [ "field" : [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 3, 0, 1, 0, 0, 0, 1, 2, 1, 0, 0, 0, 1, 0, 3, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0], [0, 0, 2, 0, 2, 2, 2, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 3, 3, 3, 3, 2, 1, 2, 3, 3, 3, 3, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0], [0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 3, 3, 0, 0, 0],
[0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
],
"maxLives" : 5 "maxLives" : 5
} }

View File

@ -1,33 +0,0 @@
{
"field" : [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 2, 0, 2, 2, 2, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0],
[0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0],
[0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 3, 3, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
"maxLives" : 5
}

View File

@ -1,33 +0,0 @@
{
"field" : [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 1, 1, 1, 0, 0, 2, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, 3, 0, 0],
[0, 1, 0, 0, 1, 1, 0, 2, 2, 2, 2, 0, 3, 3, 0, 3, 3, 0, 0, 3, 3, 0],
[0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 3, 3, 0, 0, 3, 0, 0, 3, 3, 0],
[0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0],
[0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0],
[0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 2, 0, 0, 3, 0, 0, 3, 0, 3, 3, 0, 0],
[0, 1, 0, 0, 0, 1, 0, 0, 2, 2, 0, 0, 0, 3, 0, 0, 3, 0, 3, 0, 0, 0],
[0, 1, 0, 0, 0, 1, 0, 2, 2, 0, 0, 0, 0, 3, 0, 3, 3, 0, 3, 0, 0, 0],
[0, 1, 1, 1, 1, 1, 0, 2, 0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 3, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 3, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
"maxLives" : 5
}

View File

@ -1,7 +1,5 @@
package break_out; package break_out;
import break_out.model.Position;
import java.awt.Color; import java.awt.Color;
/** /**
@ -79,51 +77,21 @@ public class Constants {
/** /**
* The background color for the field * The background color for the field
*/ */
public static final Color COLOR_GAME_BACKGROUND = new Color(64, 45, 61); public static final Color COLOR_GAME_BACKGROUND = new Color(33, 97, 138);
/** /**
* The default component color * The default component color
*/ */
public static final Color COLOR_COMPONENT = new Color(191, 105, 145); public static final Color COLOR_COMPONENT = new Color(200, 200, 200);
/** /**
* The component color for the bottom paddle * The component color for the bottom paddle
*/ */
public static final Color COLOR_PADDLE_BOTTOM = new Color(242, 173, 148); public static final Color COLOR_PADDLE_BOTTOM = new Color(226, 215, 73);
/** /**
* The component color for the top paddle * The component color for the top paddle
*/ */
public static final Color COLOR_PADDLE_TOP = new Color(242, 196, 141); public static final Color COLOR_PADDLE_TOP = new Color(140, 226, 165);
/**
* The component color for the text
*/
public static final Color COLOR_TEXT = new Color(0, 0, 0);
/**
* The component color for the scoreboard
*/
public static final Color COLOR_SCOREBOARD = new Color(140, 140, 140, 144);
/**
* The padding / offset of the scoreboard to the inner text elements
*/
public static final int SCOREBOARD_OFFSET = 15;
/**
* The string for the score on the scoreboard
*/
public static final String SCOREBOARD_SCORE = "Score: ";
/**
* The string for the lives on the scoreboard
*/
public static final String SCOREBOARD_LIVES = "Lives: ";
/**
* The position for the scoreboards midpoint (bottom center)
*/
public static final Position SCOREBOARD_MIDPOINT = new Position(SCREEN_WIDTH*5/6, SCREEN_HEIGHT);
} }

View File

@ -136,7 +136,7 @@ public class Controller implements ActionListener, KeyListener {
case KeyEvent.VK_ESCAPE: case KeyEvent.VK_ESCAPE:
// exit current level // exit current level
game.getLevel().setFinished(true); game.getLevel().setFinished(true);
toStartScreen(game.getLevel().getScore()); toStartScreen();
break; break;
} }
@ -161,14 +161,10 @@ public class Controller implements ActionListener, KeyListener {
/** /**
* This method switches the view to the StartScreen view. * This method switches the view to the StartScreen view.
* @param score The player score
*/ */
public void toStartScreen(int score) { public void toStartScreen() {
view.showScreen(StartScreen.class.getName()); view.showScreen(StartScreen.class.getName());
view.getStartScreen().requestFocusInWindow(); view.getStartScreen().requestFocusInWindow();
view.getStartScreen().addScore(score);
view.getStartScreen().repaint();
} }
/** /**

View File

@ -28,11 +28,6 @@ public class Ball implements IBall {
*/ */
private boolean hitsPaddle; private boolean hitsPaddle;
/**
* The balls lost state for upper and lower borders
*/
private boolean isLost;
/** /**
* The balls color with default component color * The balls color with default component color
*/ */
@ -49,12 +44,12 @@ public class Ball implements IBall {
*/ */
public Ball() { public Ball() {
this.position = new Position(0, 0); this.position = new Position(0, 0);
this.direction = new Vector2D(Constants.BALL_SPEED, Constants.BALL_SPEED);
this.direction.rescale();
// reset direction // start at bottom-center
resetDirection(); this.position.setX((Constants.SCREEN_WIDTH - Constants.BALL_DIAMETER) / 2.0);
this.position.setY(Constants.SCREEN_HEIGHT - Constants.BALL_DIAMETER - Constants.PADDLE_HEIGHT);
// reset position to bottom-center
resetPosition();
} }
/** /**
@ -98,7 +93,8 @@ public class Ball implements IBall {
Random random = new Random(); Random random = new Random();
// random hue without blue colors to prevent ghosting // random hue without blue colors to prevent ghosting
float hue = (random.nextInt(200)+50) / 360f; // 65 <~ 170/255
float hue = (random.nextInt(65)) / 100f;
// saturation between 0.5 and 0.7 // saturation between 0.5 and 0.7
float saturation = (random.nextInt(2000) + 5000) / 10000f; float saturation = (random.nextInt(2000) + 5000) / 10000f;
@ -151,12 +147,14 @@ public class Ball implements IBall {
// reacts on top border // reacts on top border
if (this.position.getY() <= 0) { if (this.position.getY() <= 0) {
isLost = true; this.position.setY(0);
this.direction.setDy(-(this.direction.getDy()));
} }
// reacts on bottom border (+Diameter because of hitbox) // reacts on bottom border (+Diameter because of hitbox)
if (this.position.getY() >= Constants.SCREEN_HEIGHT - Constants.BALL_DIAMETER) { if (this.position.getY() >= Constants.SCREEN_HEIGHT - Constants.BALL_DIAMETER) {
isLost = true; this.position.setY(Constants.SCREEN_HEIGHT - Constants.BALL_DIAMETER);
this.direction.setDy(-(this.direction.getDy()));
} }
} }
@ -371,37 +369,4 @@ public class Ball implements IBall {
} }
/**
* The getter for balls lost state
* @return balls lost state
*/
public boolean isLost() {
return isLost;
}
/**
* The setter for balls lost state
* @param lost balls lost state
*/
public void setLost(boolean lost) {
isLost = lost;
}
/**
* resets balls position
*/
public void resetPosition() {
// start at bottom-center
position.setX((Constants.SCREEN_WIDTH - Constants.BALL_DIAMETER) / 2.0);
position.setY(Constants.SCREEN_HEIGHT - Constants.BALL_DIAMETER - Constants.PADDLE_HEIGHT);
}
/**
* resets balls direction
*/
public void resetDirection() {
direction = new Vector2D(Constants.BALL_SPEED, Constants.BALL_SPEED);
direction.rescale();
}
} }

View File

@ -36,7 +36,7 @@ public class Game {
/** /**
* The last levelnumber * The last levelnumber
*/ */
private int maxLevel = 3; private int maxLevel = 1;
/** /**
* The total score of the game * The total score of the game
@ -114,7 +114,7 @@ public class Game {
controller.toPlayground(); controller.toPlayground();
} else { } else {
// tells the controller to switch to the startScreen of the game // tells the controller to switch to the startScreen of the game
controller.toStartScreen(level.getScore()); controller.toStartScreen();
} }

View File

@ -17,7 +17,4 @@ public interface IBall {
// Exercise 4 // Exercise 4
public boolean hitsStone(ArrayList<Stone> stones); public boolean hitsStone(ArrayList<Stone> stones);
public Stone getHitStone(); public Stone getHitStone();
// Exercise 5
public boolean isLost();
} }

View File

@ -42,7 +42,7 @@ public class Level extends Thread implements ILevel {
/** /**
* Flag that shows if the level was finished * Flag that shows if the level was finished
*/ */
private boolean finished = false; private boolean levelFinished = false;
/** /**
* The paddles of the level * The paddles of the level
@ -73,7 +73,13 @@ public class Level extends Thread implements ILevel {
this.score = score; this.score = score;
this.ball = new Ball(); this.ball = new Ball();
resetPaddles(); // calc paddle positions
Position posPaddleTop = new Position((Constants.SCREEN_WIDTH - Constants.PADDLE_WIDTH) / 2.0, 0);
Position posPaddleBottom = new Position((Constants.SCREEN_WIDTH - Constants.PADDLE_WIDTH) / 2.0, Constants.SCREEN_HEIGHT - Constants.PADDLE_HEIGHT);
// set paddles
this.paddleTop = new Paddle(posPaddleTop);
this.paddleBottom = new Paddle(posPaddleBottom);
// set paddles color // set paddles color
this.paddleTop.setColor(Constants.COLOR_PADDLE_TOP); this.paddleTop.setColor(Constants.COLOR_PADDLE_TOP);
@ -121,7 +127,7 @@ public class Level extends Thread implements ILevel {
game.notifyObservers(); game.notifyObservers();
// endless loop // endless loop
while (!finished) { while (!levelFinished) {
// if ballWasStarted is true, the ball is moving // if ballWasStarted is true, the ball is moving
if (ballWasStarted()) { if (ballWasStarted()) {
@ -131,11 +137,6 @@ public class Level extends Thread implements ILevel {
// Call here the balls method for reacting on the borders of the playground // Call here the balls method for reacting on the borders of the playground
getBall().reactOnBorder(); getBall().reactOnBorder();
// Call here the balls method for reacting on lost ball state
if(getBall().isLost()) {
decreaseLives();
}
// if ball hits paddle (top|bottom), reflect ball // if ball hits paddle (top|bottom), reflect ball
if(getBall().hitsPaddle(paddleTop)) getBall().reflectOnPaddle(paddleTop); if(getBall().hitsPaddle(paddleTop)) getBall().reflectOnPaddle(paddleTop);
if(getBall().hitsPaddle(paddleBottom)) getBall().reflectOnPaddle(paddleBottom); if(getBall().hitsPaddle(paddleBottom)) getBall().reflectOnPaddle(paddleBottom);
@ -154,13 +155,13 @@ public class Level extends Thread implements ILevel {
// Call here the balls method for reacting on stones of the playground // Call here the balls method for reacting on stones of the playground
if(getBall().hitsStone(getStones())) { if(getBall().hitsStone(getStones())) {
updateStonesAndScore(); updateStonesAndScore();
//System.out.println("count: "+stones.size()); System.out.println("count: "+stones.size());
} }
// if all stones are broken, go to next level // if all stones are broken, go to next level
if(allStonesBroken()) { if(allStonesBroken()) {
// next level // next level
//System.out.println("next level"); System.out.println("next level");
} }
// update paddles position // update paddles position
@ -188,18 +189,16 @@ public class Level extends Thread implements ILevel {
*/ */
private void loadLevelData(int levelnr) { private void loadLevelData(int levelnr) {
JSONReader reader = new JSONReader(String.format("res/Level%s.json", levelnr)); JSONReader reader = new JSONReader(String.format("res/Level%s.json", levelnr));
int[][] stoneTypes = reader.getStones2DArray(); int[][] stoneArray = reader.getStones2DArray();
// life counter
lifeCounter = reader.getLifeCounter(); lifeCounter = reader.getLifeCounter();
// clear stones list, not needed but could cause problems when not done // clear stones list, not needed but could cause problems when not done
stones.clear(); stones.clear();
// foreach column // foreach column
for(int y = 0; y < stoneTypes.length; y++) { for(int y = 0; y < stoneArray.length; y++) {
// foreach element in column x // foreach element in column x
for(int x = 0; x < stoneTypes[y].length; x++) { for(int x = 0; x < stoneArray[y].length; x++) {
Position tempPos = new Position(-1, -1); Position tempPos = new Position(-1, -1);
// position calculation, equivalent to grid calculation in "view.Field" // position calculation, equivalent to grid calculation in "view.Field"
@ -209,7 +208,7 @@ public class Level extends Thread implements ILevel {
tempPos.setX(blockWidth * x); tempPos.setX(blockWidth * x);
tempPos.setY(blockHeight * y); tempPos.setY(blockHeight * y);
Stone tempStone = new Stone(stoneTypes[y][x], tempPos); Stone tempStone = new Stone(stoneArray[y][x], tempPos);
// add stone to list // add stone to list
if(tempStone.getType() != 0) if(tempStone.getType() != 0)
@ -241,7 +240,7 @@ public class Level extends Thread implements ILevel {
* @param finished game state * @param finished game state
*/ */
public void setFinished(boolean finished) { public void setFinished(boolean finished) {
this.finished = finished; this.levelFinished = finished;
} }
/** /**
@ -259,24 +258,13 @@ public class Level extends Thread implements ILevel {
* The updater for the levels stones and the player score * The updater for the levels stones and the player score
*/ */
private void updateStonesAndScore() { private void updateStonesAndScore() {
// hit stone
Stone stone = getBall().getHitStone(); Stone stone = getBall().getHitStone();
// add value to score
score += stone.getValue(); score += stone.getValue();
// set new type
stone.setType(stone.getType()-1); stone.setType(stone.getType()-1);
// stones type is 0? remove it!
if(stone.getType() == 0) { if(stone.getType() == 0) {
stones.remove(stone); stones.remove(stone);
} }
if(allStonesBroken()) {
setFinished(true);
nextLevel();
}
} }
/** /**
@ -284,66 +272,8 @@ public class Level extends Thread implements ILevel {
* @return true when all stones are broken * @return true when all stones are broken
*/ */
private boolean allStonesBroken() { private boolean allStonesBroken() {
return stones.isEmpty(); if(stones.isEmpty()) return true;
} else return false;
/**
* decreases the lives and interact to the new count
*/
private void decreaseLives() {
lifeCounter--;
// reset paddles to center pos
if(lifeCounter > 0) {
resetPaddles();
getBall().resetPosition();
getBall().resetDirection();
getBall().setLost(false);
stopBall();
// level failed
} else {
setFinished(true);
game.getController().toStartScreen(getScore());
}
}
/**
* resets paddles position and or init them
*/
private void resetPaddles() {
// calc paddle positions
Position posPaddleTop = new Position((Constants.SCREEN_WIDTH - Constants.PADDLE_WIDTH) / 2.0, 0);
Position posPaddleBottom = new Position((Constants.SCREEN_WIDTH - Constants.PADDLE_WIDTH) / 2.0, Constants.SCREEN_HEIGHT - Constants.PADDLE_HEIGHT);
// resets top paddle
if(paddleTop == null) paddleTop = new Paddle(posPaddleTop);
else paddleTop.setPosition(posPaddleTop);
// resets bottom paddle
if(paddleBottom == null) paddleBottom = new Paddle(posPaddleBottom);
else paddleBottom.setPosition(posPaddleBottom);
}
/**
* The getter for levels score
* @return the score
*/
public int getScore() {
return score;
}
/**
* The getter for levels lives
* @return the life counter
*/
public int getLives() {
return lifeCounter;
}
/**
* switch to next level
*/
public void nextLevel() {
game.createLevel(++levelnr, score);
} }
} }

View File

@ -136,10 +136,9 @@ public class Paddle implements IPaddle {
* @param direction The paddles new direction * @param direction The paddles new direction
*/ */
public void setDirection(int direction) { public void setDirection(int direction) {
// normalization not needed
// normalize to valid values // normalize to valid values
//if(direction > 0) direction = 1; if(direction > 0) direction = 1;
//if(direction < 0) direction = -1; if(direction < 0) direction = -1;
this.direction = direction; this.direction = direction;
} }

View File

@ -112,10 +112,10 @@ public class Stone implements IStone {
* @param type The stones new type * @param type The stones new type
*/ */
public void setType(int type) { public void setType(int type) {
// type not in range
// set the type; no verification needed; if(type > 3) { type = 0; }
setValue(type);
this.type = type; this.type = type;
switch(type) { switch(type) {
// multi-case, hacky, but dont care // multi-case, hacky, but dont care
case 0: case 0:
@ -127,18 +127,15 @@ public class Stone implements IStone {
break; break;
case 1: case 1:
// stone type one // stone type one
setColor(new Color(77, 80, 140)); setColor(Color.CYAN);
setValue(1);
break; break;
case 2: case 2:
// stone type two // stone type two
setColor(new Color(242, 191, 94)); setColor(Color.WHITE);
setValue(2);
break; break;
case 3: case 3:
// stone type three // stone type three
setColor(new Color(242, 80, 65)); setColor(Color.BLUE);
setValue(3);
break; break;
} }
} }

View File

@ -1,15 +1,11 @@
package break_out.view; package break_out.view;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.Dimension;
import java.awt.RenderingHints; import java.awt.RenderingHints;
import java.awt.Font;
import java.awt.font.TextAttribute;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JPanel; import javax.swing.JPanel;
@ -118,9 +114,6 @@ public class Field extends JPanel {
// Calls the method for drawing the top paddle // Calls the method for drawing the top paddle
drawPaddleTop(g2); drawPaddleTop(g2);
// Calls the method for drawing the scoreboard
drawScoreboard(g2);
} }
/** /**
@ -256,96 +249,4 @@ public class Field extends JPanel {
} }
} }
/**
* Draws the scoreboard with score and lives
* @param g2
*/
private void drawScoreboard(Graphics2D g2) {
Font currentFont = g2.getFont();
// source: <a href="https://stackoverflow.com/questions/18249592/"> Stackoverflow Question - 18249592 </a>
Map<TextAttribute, Object> attributes = new HashMap<>();
attributes.put(TextAttribute.FAMILY, currentFont.getFamily());
attributes.put(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD);
attributes.put(TextAttribute.SIZE, (int) (currentFont.getSize() * 1.8));
Font myFont = Font.getFont(attributes);
g2.setFont(myFont);
// temporarily save default component color to draw text and background in specific color
Color temp = g2.getColor();
// draw background in specific color
g2.setColor(Constants.COLOR_SCOREBOARD);
// bottom centered mid-point
int midX = (int) Constants.SCOREBOARD_MIDPOINT.getX();
int midY = (int) Constants.SCOREBOARD_MIDPOINT.getY();
int offset = Constants.SCOREBOARD_OFFSET;
// calculate rendered string width
int scoreWidth = g2.getFontMetrics().stringWidth(Constants.SCOREBOARD_SCORE + view.getGame().getLevel().getScore());
int lifeWidth = g2.getFontMetrics().stringWidth(Constants.SCOREBOARD_LIVES + view.getGame().getLevel().getLives());
int maxWidth = Math.max(scoreWidth, lifeWidth); // max width
int fontSize = g2.getFontMetrics().getHeight(); // font size
// fillRoundRect(x, y, width, height, arcWidth, arcHeight)
g2.fillRoundRect((midX)-offset-maxWidth/2, midY-2*offset-3*fontSize, maxWidth+2*offset, 2*(fontSize+offset), 5, 5);
// draw text in specific color (sharing g2 object and therefore also color)
g2.setColor(Constants.COLOR_TEXT);
// draw score and lives
drawScore(g2);
drawLives(g2);
// reset color and font
g2.setColor(temp);
g2.setFont(currentFont);
}
/**
* Draws the score
*
* @param g2 The graphics object
*/
private void drawScore(Graphics2D g2) {
int score = view.getGame().getLevel().getScore();
int fontSize = g2.getFontMetrics().getHeight(); // font size
// bottom centered mid-point
int x = (int) Constants.SCOREBOARD_MIDPOINT.getX();
int y = (int) Constants.SCOREBOARD_MIDPOINT.getY()-(int)((3.0/2.0)*fontSize);
String str = Constants.SCOREBOARD_SCORE+score;
x -= g2.getFontMetrics().stringWidth(str)/2; // because x is middle position on x axis
// draw string
g2.drawString(str, x, y);
}
/**
* Draws the life counter
*
* @param g2 The graphics object
*/
private void drawLives(Graphics2D g2) {
int lives = view.getGame().getLevel().getLives();
int fontSize = g2.getFontMetrics().getHeight(); // font size
// bottom centered mid-point
int x = (int) Constants.SCOREBOARD_MIDPOINT.getX();
int y = (int) Constants.SCOREBOARD_MIDPOINT.getY()-3*fontSize;
String str = Constants.SCOREBOARD_LIVES+lives;
x -= g2.getFontMetrics().stringWidth(str)/2; // because x is middle position on x axis
// draw string
g2.drawString(str, x, y);
}
} }

View File

@ -51,11 +51,6 @@ public class StartScreen extends JPanel {
*/ */
private JLabel error; private JLabel error;
/**
* The scoreMenu
*/
private SectionPanel scoreMenu;
/** /**
* The constructor needs a view * The constructor needs a view
@ -130,16 +125,16 @@ public class StartScreen extends JPanel {
*/ */
private void initializeScoreMenu() { private void initializeScoreMenu() {
// The layout // The layout
scoreMenu = new SectionPanel(Color.WHITE); SectionPanel scoreMenu = new SectionPanel(Color.WHITE);
scoreMenu.shady = false; scoreMenu.shady = false;
scoreMenu.setLayout(new MigLayout("", "10[center, grow, fill]10", scoreMenu.setLayout(new MigLayout("", "10[center, grow, fill]10",
"5[center]5")); "5[center]5"));
// adding the components to the layout // adding the compoenents to the layout
JLabel headline = new JLabel("Scores"); JLabel headline = new JLabel("Scores");
headline.setFont(new Font("Sans-serif", Font.PLAIN, 16)); headline.setFont(new Font("Sans-serif", Font.PLAIN, 16));
headline.setHorizontalAlignment(SwingConstants.CENTER); headline.setHorizontalAlignment(SwingConstants.CENTER);
scoreMenu.add(headline, "cell 0 0, gaptop 5, wrap"); scoreMenu.add(headline, "cell 0 0, gaptop 5");
add(scoreMenu, "cell 1 0, gapleft 5"); add(scoreMenu, "cell 1 0, gapleft 5");
} }
@ -205,28 +200,4 @@ public class StartScreen extends JPanel {
error.setText(""); error.setText("");
} }
/**
* Adds a score to the scoreboard
* @param score
*/
public void addScore(int score) {
// adding the components to the layout
// name
JLabel lName = new JLabel(getPlayersName());
lName.setFont(new Font("Sans-serif", Font.PLAIN, 16));
lName.setHorizontalAlignment(SwingConstants.CENTER);
scoreMenu.add(lName, "gaptop 5");
// spacing
JLabel space = new JLabel();
scoreMenu.add(space);
// score
JLabel lScore = new JLabel(String.valueOf(score));
lScore.setFont(new Font("Sans-serif", Font.PLAIN, 16));
lScore.setHorizontalAlignment(SwingConstants.CENTER);
scoreMenu.add(lScore, "gaptop 5, wrap");
}
} }