diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2024-07-12 23:07:39 +0200 |
|---|---|---|
| committer | Florian Fischer <florian.fischer@muhq.space> | 2024-07-12 23:13:11 +0200 |
| commit | 3b632e8a598bfcd75fd88d13e6d575996d98cf8b (patch) | |
| tree | 347b11cba6bbb7358ab1940c01a6f812a100814f | |
| download | spaceinvaders-3b632e8a598bfcd75fd88d13e6d575996d98cf8b.tar.gz spaceinvaders-3b632e8a598bfcd75fd88d13e6d575996d98cf8b.zip | |
initial commit
| -rw-r--r-- | .editorconfig | 15 | ||||
| -rw-r--r-- | .gitignore | 3 | ||||
| -rw-r--r-- | Alien.java | 77 | ||||
| -rw-r--r-- | Laser.java | 11 | ||||
| -rw-r--r-- | Lazer.java | 11 | ||||
| -rw-r--r-- | MyWorld.java | 106 | ||||
| -rw-r--r-- | Projektil.java | 29 | ||||
| -rw-r--r-- | README.TXT | 14 | ||||
| -rw-r--r-- | Raumschiff.java | 72 | ||||
| -rw-r--r-- | Readme.md | 35 | ||||
| -rw-r--r-- | Schild.java | 27 | ||||
| -rw-r--r-- | images/Shuttle.png | bin | 0 -> 2415 bytes | |||
| -rw-r--r-- | images/alien1.png | bin | 0 -> 914 bytes | |||
| -rw-r--r-- | images/alien2.png | bin | 0 -> 586 bytes | |||
| -rw-r--r-- | images/laser.png | bin | 0 -> 113 bytes | |||
| -rw-r--r-- | images/laser2.png | bin | 0 -> 599 bytes | |||
| -rw-r--r-- | images/shieldpart.png | bin | 0 -> 154 bytes | |||
| -rw-r--r-- | project.greenfoot | 113 | ||||
| -rw-r--r-- | soundindex.list | 2 | ||||
| -rw-r--r-- | sounds/EnergyGun.wav | bin | 0 -> 23084 bytes | |||
| -rw-r--r-- | sounds/Explosion.wav | bin | 0 -> 39336 bytes |
21 files changed, 515 insertions, 0 deletions
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 + + \ + + +## 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 <https://www.gnu.org/licenses/>. + +### 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 Binary files differnew file mode 100644 index 0000000..5e7a9b0 --- /dev/null +++ b/images/Shuttle.png diff --git a/images/alien1.png b/images/alien1.png Binary files differnew file mode 100644 index 0000000..48619ed --- /dev/null +++ b/images/alien1.png diff --git a/images/alien2.png b/images/alien2.png Binary files differnew file mode 100644 index 0000000..1e81957 --- /dev/null +++ b/images/alien2.png diff --git a/images/laser.png b/images/laser.png Binary files differnew file mode 100644 index 0000000..c707ce8 --- /dev/null +++ b/images/laser.png diff --git a/images/laser2.png b/images/laser2.png Binary files differnew file mode 100644 index 0000000..cefeddd --- /dev/null +++ b/images/laser2.png diff --git a/images/shieldpart.png b/images/shieldpart.png Binary files differnew file mode 100644 index 0000000..77b412b --- /dev/null +++ b/images/shieldpart.png 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 Binary files differnew file mode 100644 index 0000000..9199043 --- /dev/null +++ b/sounds/EnergyGun.wav diff --git a/sounds/Explosion.wav b/sounds/Explosion.wav Binary files differnew file mode 100644 index 0000000..632ee5c --- /dev/null +++ b/sounds/Explosion.wav |
