Final final steps. Improved Sonic img, tried dark mode and neglected, added better sound and animation at the end

This commit is contained in:
2026-07-27 18:11:37 +02:00
parent 3aff0ff5b0
commit ee9fda7690
7 changed files with 137 additions and 105 deletions
+41 -45
View File
@@ -8,73 +8,69 @@ Kleine Indie-Company. Sehr bescheiden. Wir machen. Döner. Revolutionär.
## Story
* unsere Idee: Döner Bude errichten
* Investition kleine Hüte kaufen
* Döner laden aufmachen nach und nach lvln und Geld machen
* Upgrades Arbeiter und mehr DÖNER Mehr kunden
* Cookie clicker like main Story
* und Mini-Spiele um Geld zu verdienen zb Jump n Run
- unsere Idee: Döner Bude errichten
- Investition kleine Hüte kaufen
- Döner laden aufmachen nach und nach lvln und Geld machen
- Upgrades Arbeiter und mehr DÖNER Mehr kunden
- Cookie clicker like main Story
- und Mini-Spiele um Geld zu verdienen zb Jump n Run
## Kollaboration
* Sprache auf Englisch
* erst pullen!!! (IMMER)
* Dateien speichern bevor commit
* um zu commiten (git commit -a -m "-Nachricht-")
* bitte immer bei Nachricht hereinschreiben was geändert wurde
- Sprache auf Englisch
- erst pullen!!! (IMMER)
- Dateien speichern bevor commit
- um zu commiten (git commit -a -m "-Nachricht-")
- bitte immer bei Nachricht hereinschreiben was geändert wurde
## Weiterführende Links
* [Javadocs der Engine Pi](https://engine-pi.github.io/javadocs/pi/package-summary.html)
* [Doku der Engine Pi](https://engine-pi.github.io/engine-pi/)
- [Javadocs der Engine Pi](https://engine-pi.github.io/javadocs/pi/package-summary.html)
- [Doku der Engine Pi](https://engine-pi.github.io/engine-pi/)
## Rahmenbedingungen für das Projekt
* Freiwillige Benotung (mündliche Noten, individuell)
* Abgabetermin des Projekts: Montag, der 27. Juli, 9:25 Uhr
* Game-Engine: engine-pi
* [Anforderungen des Lehrplans](https://www.lehrplanplus.bayern.de/fachlehrplan/gymnasium/12/informatik/grundlegend)
* einfache graphische Benutzeroberflächen
* überprüfen die Funktionalität eines vorgegebenen Softwareprodukts mit unterschiedlichen Testverfahren
* verwenden dabei die zugehörige Dokumentation
* verwenden Versionsverwaltung
* UML-Diagramme
* KI-Verwendung erlaubt
* Lizenz: frei; _wir: GPLv3_
* Anwesenheit zu den Unterrichtszeiten
- Freiwillige Benotung (mündliche Noten, individuell)
- Abgabetermin des Projekts: Montag, der 27. Juli, 9:25 Uhr
- Game-Engine: engine-pi
- [Anforderungen des Lehrplans](https://www.lehrplanplus.bayern.de/fachlehrplan/gymnasium/12/informatik/grundlegend)
- einfache graphische Benutzeroberflächen
- überprüfen die Funktionalität eines vorgegebenen Softwareprodukts mit unterschiedlichen Testverfahren
- verwenden dabei die zugehörige Dokumentation
- verwenden Versionsverwaltung
- UML-Diagramme
- KI-Verwendung erlaubt
- Lizenz: frei; _wir: GPLv3_
- Anwesenheit zu den Unterrichtszeiten
## Einführung Game
### Ziel des Projekts
* Kleiner Dönerladen-Simulator
* Kunde erscheint an der Bude
* Spieler verkauft Döner per Button
* Spieler erhält Geld
* Geld kann für Upgrades ausgegeben werden
* Upgrade erhöht die Anzahl der Kunden
- Kleiner Dönerladen-Simulator
- Kunde erscheint an der Bude
- Spieler verkauft Döner per Button
- Spieler erhält Geld
- Geld kann für Upgrades ausgegeben werden
- Upgrade erhöht die Anzahl der Kunden
### Geplanter Spielablauf
* Kunde erscheint
* Spieler klickt auf „Döner verkaufen“
* Geld erhöht sich
* Kunde verschwindet
* Neuer Kunde erscheint
* Spieler kann Upgrades kaufen
* Mehr Upgrades = mehr Kunden
- Kunde erscheint
- Spieler klickt auf „Döner verkaufen“
- Geld erhöht sich
- Kunde verschwindet
- Neuer Kunde erscheint
- Spieler kann Upgrades kaufen
- Mehr Upgrades = mehr Kunden
### Benötigte Klassen
* GameController
* Customer
* MoneyManager
* UpgradeManager
* UI
### Weitere Ideen
- Minigames (Jump n' Run)
- Startmenu mit versch. Schwierigkeitsgraden, die gespeichert werden
## Credits
+3 -2
View File
@@ -1,6 +1,6 @@
package project;
import project.scenes.LoadingScene;
import project.scenes.GameScene;
import project.utils.Statistics;
import pi.Controller;
import pi.config.ConfigLoader;
@@ -23,7 +23,8 @@ public class Main
public static void main(String[] args)
{
Controller.instantMode(false);
Controller.start(new LoadingScene(), WINDOW_WIDTH, WINDOW_HEIGHT);
Controller.title("Royal Kebab");
Controller.start(new GameScene(), WINDOW_WIDTH, WINDOW_HEIGHT);
try {
Cursor customCursor = Toolkit.getDefaultToolkit().createCustomCursor(
+49 -42
View File
@@ -25,9 +25,10 @@ public class GameScene extends Scene implements FrameListener, MouseClickListene
Image tatli;
Text[] texts;
Image[] ingredients; // array of all ingredients (including the final kebab lol)
static int INGREDIENTS_X = 13;
Image ingredientsOutline;
static int INGREDIENTS_X = 10;
static int INGREDIENTS_X_TRESHOLD = 7;
static int INGREDIENTS_Y = -25;
static int INGREDIENTS_Y = -22;
int[] current_kebab; // used for remembering which ingredients have already been added to the current kebab build
Actor[] customers;
@@ -66,15 +67,44 @@ public class GameScene extends Scene implements FrameListener, MouseClickListene
// initialize ingredients and current_kebab arrays
ingredients = createIngredients();
ingredientsOutline = createIngredientsOutline(ingredients);
current_kebab = new int[ingredients.length-1];
mouse_pressed_on_kebab = false;
// add all actors
// add all actors with correct sorting
add(bg);
add(customers);
add(ingredients);
add(tatli);
add(ingredientsOutline);
add(ingredients);
}
public void sellKebabStatistics(int amount) {
s.kebabSold(s.kebabSold()+amount);
s.money(s.money() + s.kebabPrice());
Main.CONFIG.save();
setKebabSold(texts, s.kebabSold());
setMoney(texts, s.money());
if(s.money() >= 67) {
resetStats();
Controller.transitionToScene(new VictoryScene());
}
}
public void incrementLostCustomers(int amount) {
s.lostCustomers(s.lostCustomers() + amount);
Main.CONFIG.save();
setLostCustomers(texts, s.lostCustomers());
}
public void resetStats() {
s.totalEarned(s.totalEarned() + s.money()-Statistics.STARTER_MONEY);
s.money(Statistics.STARTER_MONEY);
s.kebabPrice(5);
s.kebabSold(0);
s.lostCustomers(0);
Main.CONFIG.save();
}
@Override
@@ -138,15 +168,26 @@ public class GameScene extends Scene implements FrameListener, MouseClickListene
// must be at bottom for previous checks to work
mouse_pressed_on_kebab = false;
}
// Static helper methods
public static Image createIngredientsOutline(Image[] ingredients) {
double ingredients_width = (ingredients[ingredients.length-1].anchor().x()+ingredients[ingredients.length-1].width()) - ingredients[0].anchor().x();
int padding_width = 3;
int padding_height = 2;
Image io = new Image("images/pixui-pack/Buttons/Button_White_Outline (5).png").width(ingredients_width + padding_width*2).height(6 + padding_height*2);
io.center(INGREDIENTS_X - ingredients[0].width()/2 + (ingredients_width)/2, INGREDIENTS_Y);
return io;
}
public static Image[] createIngredients() {
Image[] ingredients = new Image[5];
ingredients[0] = new Image("images/kebab-pack/onion-256x256.png");
ingredients[1] = new Image("images/kebab-pack/meat-256x256.png");
ingredients[2] = new Image("images/kebab-pack/bread-256x256.png");
ingredients[3] = new Image("images/kebab-pack/lettuce-96x96.png");
ingredients[0] = new Image("images/kebab-pack/bread-256x256.png");
ingredients[1] = new Image("images/kebab-pack/lettuce-96x96.png");
ingredients[2] = new Image("images/kebab-pack/onion-256x256.png");
ingredients[3] = new Image("images/kebab-pack/meat-256x256.png");
ingredients[4] = new Image("images/kebab-pack/kebab-128x128.png");
ingredients[4].visible(false);
@@ -229,38 +270,4 @@ public class GameScene extends Scene implements FrameListener, MouseClickListene
public static void setLostCustomers(Text[] texts, int lostCustomers) {
texts[2].content(String.valueOf(lostCustomers));
}
public void sellKebabStatistics(int amount) {
s.kebabSold(s.kebabSold()+amount);
s.money(s.money() + s.kebabPrice());
Main.CONFIG.save();
setKebabSold(texts, s.kebabSold());
setMoney(texts, s.money());
if(s.money() >= 67) {
resetStats();
Controller.transitionToScene(new VictoryScene());
}
}
public void incrementLostCustomers(int amount) {
s.lostCustomers(s.lostCustomers()+amount);
Main.CONFIG.save();
setLostCustomers(texts, s.lostCustomers());
}
public static void saveStats(Text[] texts) {
int money = Integer.parseInt(texts[0].content());
int kebabSold = Integer.parseInt(texts[1].content());
int lostCustomers = Integer.parseInt(texts[2].content());
System.out.println(money);
System.out.println(kebabSold);
System.out.println(lostCustomers);
}
public void resetStats() {
s.money(2);
s.kebabPrice(5);
s.kebabSold(0);
s.lostCustomers(0);
Main.CONFIG.save();
}
}
+41 -3
View File
@@ -7,14 +7,18 @@ import pi.actor.Animation;
import pi.actor.Rectangle;
import pi.actor.Text;
import pi.event.FrameListener;
import pi.event.MouseButton;
import pi.event.MouseClickListener;
import pi.graphics.geom.Vector;
import pi.resources.sound.SoundPlayback;
import project.Main;
import static pi.Controller.fonts;
import java.awt.Font;
public class VictoryScene extends Scene implements FrameListener {
public class VictoryScene extends Scene implements FrameListener, MouseClickListener {
Font font;
boolean faded_out;
Text designer;
@@ -23,9 +27,15 @@ public class VictoryScene extends Scene implements FrameListener {
Rectangle rect;
Actor sixseven;
boolean clicked;
boolean game_over_playing;
public VictoryScene() {
Controller.jukebox.playSound("sounds/reward.mp3");
clicked = false;
game_over_playing = false;
font = fonts.get("fonts/BitcountGridDouble-Regular.ttf");
designer = new Text("Design: Alf");
@@ -40,13 +50,13 @@ public class VictoryScene extends Scene implements FrameListener {
programmer.color("#ffffff");
programmer.font(font);
programmer.height(1.5);
rect = new Rectangle(Main.WINDOW_WIDTH/camera().meter(), Main.WINDOW_HEIGHT/camera().meter());
rect = new Rectangle(Main.WINDOW_WIDTH/camera().meter(), Main.WINDOW_HEIGHT/camera().meter()+5);
rect.color("#4d0000");
designer.center(0, 4);
pr.center(0, 0);
programmer.center(0, -4);
rect.center(0,0);
rect.center(0, 0);
add(designer);
add(pr);
@@ -67,5 +77,33 @@ public class VictoryScene extends Scene implements FrameListener {
public void onFrame(double pastTime)
{
sixseven.center(rect.center());
if(clicked) {
for(SoundPlayback sp : Controller.jukebox.allSounds()) {
if(sp.toString().contains("Mozart") || sp.toString().contains("reward")) {
sp.volume(sp.volume()*0.97);
if(sp.volume() < 0.01) {
if(!game_over_playing) {
Controller.jukebox.playSound("sounds/Game-Over.mp3");
game_over_playing = true;
}
}
};
}
camera().zoomOut(0.01);
if (camera().meter() < 0.5) {
System.exit(0);
};
}
}
@Override
public void onMouseDown(Vector position, MouseButton button)
{
sixseven.visible(false);
rect.visible(false);
clicked = true;
}
}
+3 -13
View File
@@ -3,20 +3,20 @@ package project.utils;
import pi.config.ConfigGroup;
public class Statistics extends ConfigGroup {
public static int STARTER_MONEY = 2;
private int money = 0;
private int kebabPrice = 5;
private int upgradeLevel = 0;
private int kebabSold = 0;
private int workers = 0;
private int lostCustomers = 0;
private int totalEarned = 0;
public Statistics() {
money(2);
money(STARTER_MONEY);
kebabPrice(5);
upgradeLevel(0);
kebabSold(0);
workers(0);
lostCustomers(0);
totalEarned(0);
}
@@ -60,16 +60,6 @@ public class Statistics extends ConfigGroup {
return this;
}
// --- workers ---
public int workers() {
return workers;
}
public Statistics workers(int workers) {
set("workers", workers);
return this;
}
// --- lostCustomers ---
public int lostCustomers() {
return lostCustomers;
Binary file not shown.

Before

Width:  |  Height:  |  Size: 349 KiB

After

Width:  |  Height:  |  Size: 325 KiB

Binary file not shown.