import processing.sound.*; //Deklariert die Variabeln für die Bilder PImage hintergrund; PImage Spielfigur; PImage Figuroutline; PImage Meteorit, Ufo, Planet; //Ladet die Geräusche SoundFile jump; SoundFile kollision; //Setzt das Position der Figur int figurX = 200; int figurY = 500; //Setzt die haupt Y Variabel int y; int score = 0; float speed = 4; int phase = 0; // 0: Anfang 1: Anleitung 2: Spiel 3: Endzustand Boolean isJumping = false; int figurAcc = 0; //Deklariert eine Liste für die X Positione der Hindernisse FloatList hindernisseX; int anzahlHindernisse= 4; //Anzahl Hindernisse void setup() { size(1300, 800); //Ladet die Geräusche jump = new SoundFile(this, "jump.wav"); kollision = new SoundFile(this, "kollision.wav"); //Ladet die Bilder hintergrund = loadImage("Galaxie.png"); Spielfigur = loadImage("figur.png"); Figuroutline = loadImage("figurOutline.png"); Meteorit = loadImage("meteorit.png"); Ufo = loadImage("ufo.png"); Planet = loadImage("planet.png"); //Erstellt eine neue Liste aus Floats hindernisseX = new FloatList(); //Geht durch die Liste der Hindernisse und erstellt neue X Koordinaten aus zufällige Zahlen + die Breite des Bildschirms for (int i = 0; i<=anzahlHindernisse; i++) { if (i == 0) { hindernisseX.push(width + random(0, 200)); } else { hindernisseX.push(hindernisseX.max() + width + random(0, 200)); } } //Initialisiert die haupt Y Variabel y = 500+Spielfigur.height/2; //Stellt es so dass die Bilder und Texte Koordinaten die Mitte des Objektes sind imageMode(CENTER); textAlign(CENTER); } void draw() { //Entscheidet welche Funktion aktuell rennen soll if (phase == 0) anfang(); else if(phase == 1) anleitung(); else if (phase == 2) spiel(); else if (phase == 3) end(); } void keyPressed() { //Schaut die aktuelle Phase an und entscheidet welche Tasten machen was if (phase == 0) { if (key == 'e') { phase = 1; } else if(key == ' ') { phase = 2; } } if(phase == 1) { if(key == ' ') { phase = 2; } } if (phase == 2) { if (!isJumping && key == ' ') { jump.play(); isJumping = true; figurAcc -= 25; } } if (phase == 3) { if (key == ' ') { //Ist einfach eine Hardreset sodass man es neuspielen kann hindernisseX = new FloatList(); for (int i = 0; i<=anzahlHindernisse; i++) { if (i == 0) { hindernisseX.push(width + random(0, 200)); } else { hindernisseX.push(hindernisseX.max() + width + random(0, 200)); } } speed = 4; phase = 0; score = 0; } } } void anfang() { background(hintergrund); textSize(100); fill(200, 50, 50); text("Fireball", width/2, 200); textSize(40); fill(255); text("Drücke die Leertaste um das Spiel zu beginnen", width/2, 450); text("Drücke E um die Anleitung zu sehen", width/2, 600); } void anleitung() { background(hintergrund); text("Drücke die Leertaste um zu beginnen", width/2, 200); textSize(40); fill(255); text("Drücke die Leertaste um zu Springen", width/2, 400); text("und den ausserirdischen Objekten auszuweichen.", width/2, 500); } void spiel() { noStroke(); background(hintergrund); fill(25); //Den Grundbau was der Figur drauf rollt rect(0, 500+Spielfigur.height/2, width, height-figurY); push(); //Speichert die aktuelle Zeichensphase sodass man es später mit pop wieder herstellen kann translate(figurX, figurY); //Setzt die 0, 0 Koordinaten auf den von der Figur rotate(frameCount%360 / (PI * 2)); //Rotiert die Figur mit den Rest der frameCount dividiert mit 360 und dividiert es durch 2*PI image(Spielfigur, 0, 0); pop(); //Stellt die vorherige Zeichensphase wieder an die mit push gespeichert worden ist figurY += figurAcc; //Falls die Y Koordinate der Figur über oder gleich 500 ist, soll die Figur wieder an die Y Koordinate von 500 gesetzt werden //die Acceleration wird zu 0 gestellt und die isJumping Boolean wird zu false gestellt if (figurY >= 500) { figurY = 500; figurAcc = 0; isJumping = false; } else { //Falls nicht, wird "Gravität" an die Figur gestellt und es bekommt eine Outline figurAcc += 1; image(Figuroutline, figurX, figurY - figurAcc); } //Stellt die Bilder der Meteoriten auf dem Bildschrim und schaut ob einen von denen die Figur trifft for (int i = 0; i<2; i++) { image(Meteorit, hindernisseX.get(i), y-Meteorit.height/2-50); collision(hindernisseX.get(i), y-Meteorit.height/2-50, Meteorit.height); } //Stellt die Bilder der Ufo auf dem Bildschrim und schaut ob einen von denen die Figur trifft for (int i = 2; i<4; i++) { image(Ufo, hindernisseX.get(i), y-Ufo.height/2-50); collision(hindernisseX.get(i), y-Ufo.height/2-50, Ufo.height); } //Macht push(); //Speichert die aktuelle Zeichensphase sodass man es später mit pop wieder herstellen kann translate(hindernisseX.get(4), y-Planet.height/2-50); //Setzt die 0, 0 Koordinaten auf den von der Figur rotate(frameCount%360 / PI); //Rotiert die Figur mit den Rest der frameCount dividiert mit 360 und dividiert es durch PI image(Planet, 0, 0); pop(); //Stellt die vorherige Zeichensphase wieder an die mit push gespeichert worden ist collision(hindernisseX.get(4), y-Planet.height/2-50, Planet.width); speed *= 1.0005; //addiert die Geschwindigkeit an der X Position der einzelne Hindernisse for (int i = 0; i<=anzahlHindernisse; i++) { hindernisseX.add(i, -speed); //Falls der X Position der Hinderniss under -100 ist, wird die Score mit 1 erhöhert und der X Position wird erneut gestellt if (hindernisseX.get(i) < -100) { score++; println(i); hindernisseX.set(i, width + hindernisseX.max()+random(-200, 200)); } } fill(255); text(score, 40, 40); } void collision(float x, float y, int distance) { //Benutzt Pythagoras um zu sehen ob der Figur und der Hinderniss sich anfassen if (dist(figurX, figurY, x, y) < distance) { //Falls ja setzt es die Phase zu 3 kollision.play(); phase = 3; } } void end() { background(hintergrund); textSize(100); fill(200, 100, 100); text("GAME OVER", width/2, 300); textSize(50); fill(255); text("Score: " + score, width/2, 500); text("Drücke die Leertaste um erneut zu spielen", width/2, 600); }