From 3b632e8a598bfcd75fd88d13e6d575996d98cf8b Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Fri, 12 Jul 2024 23:07:39 +0200 Subject: initial commit --- .editorconfig | 15 +++++++ .gitignore | 3 ++ Alien.java | 77 ++++++++++++++++++++++++++++++++++ Laser.java | 11 +++++ Lazer.java | 11 +++++ MyWorld.java | 106 ++++++++++++++++++++++++++++++++++++++++++++++ Projektil.java | 29 +++++++++++++ README.TXT | 14 +++++++ Raumschiff.java | 72 ++++++++++++++++++++++++++++++++ Readme.md | 35 ++++++++++++++++ Schild.java | 27 ++++++++++++ images/Shuttle.png | Bin 0 -> 2415 bytes images/alien1.png | Bin 0 -> 914 bytes images/alien2.png | Bin 0 -> 586 bytes images/laser.png | Bin 0 -> 113 bytes images/laser2.png | Bin 0 -> 599 bytes images/shieldpart.png | Bin 0 -> 154 bytes project.greenfoot | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++ soundindex.list | 2 + sounds/EnergyGun.wav | Bin 0 -> 23084 bytes sounds/Explosion.wav | Bin 0 -> 39336 bytes 21 files changed, 515 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 Alien.java create mode 100644 Laser.java create mode 100644 Lazer.java create mode 100644 MyWorld.java create mode 100644 Projektil.java create mode 100644 README.TXT create mode 100644 Raumschiff.java create mode 100644 Readme.md create mode 100644 Schild.java create mode 100644 images/Shuttle.png create mode 100644 images/alien1.png create mode 100644 images/alien2.png create mode 100644 images/laser.png create mode 100644 images/laser2.png create mode 100644 images/shieldpart.png create mode 100644 project.greenfoot create mode 100644 soundindex.list create mode 100644 sounds/EnergyGun.wav create mode 100644 sounds/Explosion.wav diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..0be37bb --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +charset = utf-8 +trim_trailing_whitespace = true +end_of_line = lf +insert_final_newline = true +spelling_language = de_DE + +[*.{md,tex}] +indent_style = space +indent_size = 2 + +[*COMMIT_EDITMSG] +spelling_language = en_US diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..01a8634 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.class +*.ctxt +doc/ diff --git a/Alien.java b/Alien.java new file mode 100644 index 0000000..06775b8 --- /dev/null +++ b/Alien.java @@ -0,0 +1,77 @@ +import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot und MouseInfo) + +/** + * Aliens bewegen sich von links nach rechts bis zum unteren Bildschirmrand. + */ +public class Alien extends Actor +{ + + int geschwindigkeit = 2; + + /** + * Act - tut, was auch immer Alien tun will. Diese Methode wird aufgerufen, + * sobald der 'Act' oder 'Run' Button in der Umgebung angeklickt werden. + */ + public void act() + { + bewegen(); + schiessen(); + pruefeSieg(); + pruefeKollision(); + } + + /** + * Das Alien bewegt sich mit der aktuellen Geschwindigkeit in X-Richtung. + * Falls es einen Rand beruehrt wechselt es in die naechste Zeile und + * invertiert die Geschwindigkeit. + */ + private void bewegen() + { + setLocation((getX() + geschwindigkeit), getY()); + // Das Alien hat einen Seitenrand erreicht + if (getX() == 599 || getX() == 0) + { + geschwindigkeit = geschwindigkeit * -1; + setLocation(getX() + geschwindigkeit, getY() + 36); + } + } + + /** + * Wenn ein Alien den unteren Rand des Bildschirms erreicht, ist das Spiel + * verloren. + */ + private void pruefeSieg() + { + if (getY() >= 590) + { + ((MyWorld)getWorld()).verloren(); + } + } + + /** + * Ueberprueft ob ein Alien von einem Projektil getroffen wurde. + */ + private void pruefeKollision() + { + if (isTouching(Laser.class)) + { + removeTouching(Laser.class); // Projektil wird zerstört + Greenfoot.playSound("Explosion.wav"); + ((MyWorld)getWorld()).erhoehePunkte(50); // Spieler bekommt Punkte + ((MyWorld)getWorld()).reduziereAlienAnzahl(); + getWorld().removeObject(this); // Das Alien selber wird zerstört + } + } + + /** + * Feuert einen Schuss ab mit einer Wahrscheinlichkeit von 0.04%. + */ + private void schiessen() + { + if (Greenfoot.getRandomNumber(10000) <= 4) + { + Lazer lazer = new Lazer(); + getWorld().addObject(lazer, getX(),getY()); + } + } +} diff --git a/Laser.java b/Laser.java new file mode 100644 index 0000000..9dd02ef --- /dev/null +++ b/Laser.java @@ -0,0 +1,11 @@ +import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot und MouseInfo) + +/** + * Projektile des Raumschiffs. + */ +public class Laser extends Projektil +{ + public Laser() { + geschwindigkeit = 6; + } +} diff --git a/Lazer.java b/Lazer.java new file mode 100644 index 0000000..5dbfb1f --- /dev/null +++ b/Lazer.java @@ -0,0 +1,11 @@ +import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) + +/** + * Projektile der Aliens. + */ +public class Lazer extends Projektil +{ + public Lazer() { + geschwindigkeit = -5; + } +} diff --git a/MyWorld.java b/MyWorld.java new file mode 100644 index 0000000..01ac65e --- /dev/null +++ b/MyWorld.java @@ -0,0 +1,106 @@ +import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot und MouseInfo) + +/** + * Die Klasse MyWorld verwaltet alle Objekte des Spiels. + * + * @author Michael Arnot + * @author Florian Fischer + * @version 2024-06-14 + */ +public class MyWorld extends World +{ + int alienAnzahl = 0; + int punkte = 0; + int zeit = 0; + + /** + * Konstruktor für Objekte der Klasse MyWorld + * + */ + public MyWorld() + { + // Erstellt eine neue Welt mit 600x400 Zellen und einer Zell-Groesse von 1x1 Pixeln. + super(600, 600, 1); + getBackground().setColor(Color.BLACK); + getBackground().fill(); + level1(); + } + + public void act() + { + zeit++; + + showText("Zeit", 500, 20); + showText("" + zeit/50, 500, 40); + + if (alienAnzahl == 0) + { + gewonnen(); + } + + showText("Punkte", 100, 20); + showText("" + punkte, 100, 40); + } + + public void reduziereAlienAnzahl() + { + alienAnzahl--; + } + + public void erhoehePunkte(int p) + { + punkte = punkte + p; + } + + /** + * Bereite die Welt fuer den Programmstart vor. + * Das heisst: Erzeuge die Anfangs-Objekte und fuege sie der Welt hinzu. + */ + private void level1() + { + Raumschiff raumschiff = new Raumschiff(); + addObject(raumschiff, 300,565); + + for (int zeile = 0; zeile < 5; zeile++) + { + for (int spalte = 0; spalte < 10; spalte++) + { + addObject(new Alien(), 148 + spalte*36, 50 + zeile*36); + alienAnzahl++; + } + } + } + + private void erzeugeSchilde() { + for (int m = 0; m < 4; m++) + { + for (int r = 0; r < 12; r++) + { + for (int f = 0; f < 2; f++) + { + addObject(new Schild(), 80 + 60 * f + 126 * m, 470 + 4*r); + addObject(new Schild(), 85 + 50 * f + 126 * m, 465 + 4*r); + } + for (int f = 0; f<10; f++) + { + addObject(new Schild(), 90 + 5 * f + 126 * m, 460 + 4*r); + } + } + } + } + + private void gewonnen() + { + showText("V I C T O R Y", 300, 300); + Greenfoot.stop(); + } + + /* + * Der Spieler hat verloren und die "Aliens" haben den Planeten erreicht + */ + public void verloren() + { + showText("G A M E O V E R", 300, 300); + Greenfoot.stop(); + } +} diff --git a/Projektil.java b/Projektil.java new file mode 100644 index 0000000..8d73aec --- /dev/null +++ b/Projektil.java @@ -0,0 +1,29 @@ +import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) +/** + * Oberklasse aller Projektile im Spiel. + * + * Ein Projektil bewegt sich mit seiner aktuellen Geschwindigkeit nach unten. + * + */ +public class Projektil extends Actor +{ + int geschwindigkeit = 1; + + /** + * Act - bewegt das Projektil. Diese Methode wird aufgerufen, + * sobald der 'Act' oder 'Run' Button in der Umgebung angeklickt werden. + */ + public void act() + { + bewegen(); + } + + private void bewegen() + { + setLocation(getX(), getY() - geschwindigkeit); + if (getY() == 0 || getY() == 599) + { + getWorld().removeObject(this); + } + } +} diff --git a/README.TXT b/README.TXT new file mode 100644 index 0000000..4b8fadd --- /dev/null +++ b/README.TXT @@ -0,0 +1,14 @@ +------------------------------------------------------------------------ +Dies ist die README-Datei des Projekts. Hier sollten Sie Ihr Projekt +beschreiben. +Erzählen Sie dem Leser (jemand, der nichts über dieses Projekt weiss), +alles, was er/sie wissen muss. Üblicherweise sollte der Kommentar +zumindest die folgenden Angaben umfassen: +------------------------------------------------------------------------ + +PROJEKTBEZEICHNUNG: +PROJEKTZWECK: +VERSION oder DATUM: +WIE IST DAS PROJEKT ZU STARTEN: +AUTOR(EN): +BENUTZERHINWEISE: diff --git a/Raumschiff.java b/Raumschiff.java new file mode 100644 index 0000000..4a06e60 --- /dev/null +++ b/Raumschiff.java @@ -0,0 +1,72 @@ +import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot und MouseInfo) +import java.util.List; + +/** + * Das Raumschiff, das die Welt vor den Alien schuetzen soll. + */ +public class Raumschiff extends Actor +{ + boolean leertasteGedrueckt = false; + + /** + * Act - stellt das Verhalten des Raumschiffs dar. Diese Methode wird aufgerufen, + * sobald der 'Act' oder 'Run' Button in der Umgebung angeklickt werden. + */ + public void act() + { + pruefeTastatur(); + pruefeKollision(); + } + + /** + * Reagiert auf die Pfeiltasten. + */ + public void pruefeTastatur() + { + if (Greenfoot.isKeyDown("left")) + { + setLocation(getX() - 3, getY()); + } + + if (Greenfoot.isKeyDown("right")) + { + setLocation(getX() + 3, getY()); + } + + if (Greenfoot.isKeyDown("space")) + { + if (leertasteGedrueckt == false) + { + schiessen(); + leertasteGedrueckt = true; + } + } + else + { + leertasteGedrueckt = false; + } + } + + /** + * Das Raumschiff schiesst einen Laserschuss + */ + public void schiessen() + { + Greenfoot.playSound("EnergyGun.wav"); + Laser laser = new Laser(); + getWorld().addObject(laser, getX(),getY()); + } + + /** + * Ueberprueft ob das Raumschiff von einem Alien getroffen wurde. + */ + private void pruefeKollision() + { + if (isTouching(Lazer.class)) + { + removeTouching(Lazer.class); + ((MyWorld)getWorld()).verloren(); + getWorld().removeObject(this); + } + } +} diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..15b1d41 --- /dev/null +++ b/Readme.md @@ -0,0 +1,35 @@ +# Space Invaders - educational Greenfoot project + +![Der Screenshot ein Raumschiff am unteren Bildschirmrand, das auf eine Horde Aliens schießt.](https://schule.muhq.space/material/spaceinvaders/screenshot.jpg) \ + + +## Unterrichtsmaterial + +Passendes Unterrichtsmaterial ist verfügbar unter [https://schule.muhq.space/material/spaceinvaders](https://schule.muhq.space/material/spaceinvaders). + +## Requirements + +* Java +* [Greenfoot](https://www.greenfoot.org/door) + +## License + +Das Spiel basierte urspruenglich auf einer Version von Michael Arnot vom IKS +Neumuenster jeglicher Code wuerde aber nahezu vollkommen neu geschrieben. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +### Sprites + +The used [sprites](https://opengameart.org/content/assets-for-a-space-invader-like-game) created by [Clear_code](https://opengameart.org/users/clearcode) are licensed under the terms of [**CC BY 4.0**](https://creativecommons.org/licenses/by/4.0/). diff --git a/Schild.java b/Schild.java new file mode 100644 index 0000000..2438356 --- /dev/null +++ b/Schild.java @@ -0,0 +1,27 @@ +import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot und MouseInfo) + +/** + * Ein Schild blockt Projektile und wird danach zerstoert. + */ +public class Schild extends Actor +{ + /** + * Act - prueft ob das Schild etwas anderes beruehrt. Diese Methode wird aufgerufen, + * sobald der 'Act' oder 'Run' Button in der Umgebung angeklickt werden. + */ + public void act() + { + pruefeKollision(); + } + + private void pruefeKollision() + { + if (isTouching(Lazer.class) || isTouching(Laser.class)) + { + removeTouching(Laser.class); + removeTouching(Lazer.class); + removeTouching(Schild.class); + getWorld().removeObject(this); // Zerstoere das Schild selbst + } + } +} diff --git a/images/Shuttle.png b/images/Shuttle.png new file mode 100644 index 0000000..5e7a9b0 Binary files /dev/null and b/images/Shuttle.png differ diff --git a/images/alien1.png b/images/alien1.png new file mode 100644 index 0000000..48619ed Binary files /dev/null and b/images/alien1.png differ diff --git a/images/alien2.png b/images/alien2.png new file mode 100644 index 0000000..1e81957 Binary files /dev/null and b/images/alien2.png differ diff --git a/images/laser.png b/images/laser.png new file mode 100644 index 0000000..c707ce8 Binary files /dev/null and b/images/laser.png differ diff --git a/images/laser2.png b/images/laser2.png new file mode 100644 index 0000000..cefeddd Binary files /dev/null and b/images/laser2.png differ diff --git a/images/shieldpart.png b/images/shieldpart.png new file mode 100644 index 0000000..77b412b Binary files /dev/null and b/images/shieldpart.png differ diff --git a/project.greenfoot b/project.greenfoot new file mode 100644 index 0000000..d39bed9 --- /dev/null +++ b/project.greenfoot @@ -0,0 +1,113 @@ +#Greenfoot project file +class.Alien.image=alien1.png +class.Laser.image=laser.png +class.Raumschiff.image=Shuttle.png +class.Schild.image=shieldpart.png +dependency1.from=MyWorld +dependency1.to=Raumschiff +dependency1.type=UsesDependency +dependency10.from=Schild +dependency10.to=Lazer +dependency10.type=UsesDependency +dependency11.from=Schild +dependency11.to=Laser +dependency11.type=UsesDependency +dependency2.from=MyWorld +dependency2.to=Alien +dependency2.type=UsesDependency +dependency3.from=MyWorld +dependency3.to=Schild +dependency3.type=UsesDependency +dependency4.from=Alien +dependency4.to=MyWorld +dependency4.type=UsesDependency +dependency5.from=Alien +dependency5.to=Lazer +dependency5.type=UsesDependency +dependency6.from=Alien +dependency6.to=Laser +dependency6.type=UsesDependency +dependency7.from=Raumschiff +dependency7.to=Laser +dependency7.type=UsesDependency +dependency8.from=Raumschiff +dependency8.to=MyWorld +dependency8.type=UsesDependency +dependency9.from=Raumschiff +dependency9.to=Lazer +dependency9.type=UsesDependency +editor.fx.0.height=0 +editor.fx.0.width=0 +editor.fx.0.x=0 +editor.fx.0.y=0 +height=1049 +package.numDependencies=11 +package.numTargets=7 +project.charset=UTF-8 +publish.hasSource=false +publish.locked=true +publish.longDesc= +publish.shortDesc= +publish.tags= +publish.title= +publish.url= +readme.height=60 +readme.name=@README +readme.width=49 +readme.x=10 +readme.y=10 +simulation.speed=52 +target1.height=50 +target1.name=Alien +target1.showInterface=false +target1.type=ClassTarget +target1.width=80 +target1.x=0 +target1.y=0 +target2.height=50 +target2.name=Laser +target2.showInterface=false +target2.type=ClassTarget +target2.width=80 +target2.x=0 +target2.y=0 +target3.height=70 +target3.name=Projektil +target3.showInterface=false +target3.type=ClassTarget +target3.width=120 +target3.x=0 +target3.y=0 +target4.height=70 +target4.name=Lazer +target4.showInterface=false +target4.type=ClassTarget +target4.width=120 +target4.x=0 +target4.y=0 +target5.height=50 +target5.name=Raumschiff +target5.showInterface=false +target5.type=ClassTarget +target5.width=100 +target5.x=0 +target5.y=0 +target6.height=50 +target6.name=MyWorld +target6.showInterface=false +target6.type=ClassTarget +target6.width=80 +target6.x=0 +target6.y=0 +target7.height=70 +target7.name=Schild +target7.showInterface=false +target7.type=ClassTarget +target7.width=120 +target7.x=0 +target7.y=0 +version=3.1.0 +width=954 +world.lastInstantiated=MyWorld +xPosition=2883 +yPosition=3 diff --git a/soundindex.list b/soundindex.list new file mode 100644 index 0000000..5044c4e --- /dev/null +++ b/soundindex.list @@ -0,0 +1,2 @@ +EnergyGun.wav +Explosion.wav diff --git a/sounds/EnergyGun.wav b/sounds/EnergyGun.wav new file mode 100644 index 0000000..9199043 Binary files /dev/null and b/sounds/EnergyGun.wav differ diff --git a/sounds/Explosion.wav b/sounds/Explosion.wav new file mode 100644 index 0000000..632ee5c Binary files /dev/null and b/sounds/Explosion.wav differ -- cgit v1.2.3