mirror of
https://inf.pirckheimer-gymnasium.de/kebab/kebab
synced 2026-08-26 16:31:23 +00:00
Final final steps. Improved Sonic img, tried dark mode and neglected, added better sound and animation at the end
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
@@ -139,14 +169,25 @@ public class GameScene extends Scene implements FrameListener, MouseClickListene
|
||||
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();
|
||||
}
|
||||
}
|
||||
@@ -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,7 +50,7 @@ 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);
|
||||
@@ -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,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.
Reference in New Issue
Block a user