diff --git a/README.md b/README.md index a3c7f07..3de39a3 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/src/main/java/project/Main.java b/src/main/java/project/Main.java index 6adb8d7..1651bdc 100644 --- a/src/main/java/project/Main.java +++ b/src/main/java/project/Main.java @@ -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( diff --git a/src/main/java/project/scenes/GameScene.java b/src/main/java/project/scenes/GameScene.java index 1e489d7..f295a11 100644 --- a/src/main/java/project/scenes/GameScene.java +++ b/src/main/java/project/scenes/GameScene.java @@ -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(); - } } \ No newline at end of file diff --git a/src/main/java/project/scenes/VictoryScene.java b/src/main/java/project/scenes/VictoryScene.java index 53b030f..2ae800d 100644 --- a/src/main/java/project/scenes/VictoryScene.java +++ b/src/main/java/project/scenes/VictoryScene.java @@ -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; } } diff --git a/src/main/java/project/utils/Statistics.java b/src/main/java/project/utils/Statistics.java index 4c1da0e..2c7e59b 100644 --- a/src/main/java/project/utils/Statistics.java +++ b/src/main/java/project/utils/Statistics.java @@ -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; diff --git a/src/main/resources/images/kebab-pack/customer-sonic-on-white.gif b/src/main/resources/images/kebab-pack/customer-sonic-on-white.gif index 8ae7c18..33831d4 100644 Binary files a/src/main/resources/images/kebab-pack/customer-sonic-on-white.gif and b/src/main/resources/images/kebab-pack/customer-sonic-on-white.gif differ diff --git a/src/main/resources/sounds/Game-Over.mp3 b/src/main/resources/sounds/Game-Over.mp3 new file mode 100644 index 0000000..eb0338c Binary files /dev/null and b/src/main/resources/sounds/Game-Over.mp3 differ