aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2024-07-12 23:07:39 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2024-07-12 23:13:11 +0200
commit3b632e8a598bfcd75fd88d13e6d575996d98cf8b (patch)
tree347b11cba6bbb7358ab1940c01a6f812a100814f
downloadspaceinvaders-3b632e8a598bfcd75fd88d13e6d575996d98cf8b.tar.gz
spaceinvaders-3b632e8a598bfcd75fd88d13e6d575996d98cf8b.zip
initial commit
-rw-r--r--.editorconfig15
-rw-r--r--.gitignore3
-rw-r--r--Alien.java77
-rw-r--r--Laser.java11
-rw-r--r--Lazer.java11
-rw-r--r--MyWorld.java106
-rw-r--r--Projektil.java29
-rw-r--r--README.TXT14
-rw-r--r--Raumschiff.java72
-rw-r--r--Readme.md35
-rw-r--r--Schild.java27
-rw-r--r--images/Shuttle.pngbin0 -> 2415 bytes
-rw-r--r--images/alien1.pngbin0 -> 914 bytes
-rw-r--r--images/alien2.pngbin0 -> 586 bytes
-rw-r--r--images/laser.pngbin0 -> 113 bytes
-rw-r--r--images/laser2.pngbin0 -> 599 bytes
-rw-r--r--images/shieldpart.pngbin0 -> 154 bytes
-rw-r--r--project.greenfoot113
-rw-r--r--soundindex.list2
-rw-r--r--sounds/EnergyGun.wavbin0 -> 23084 bytes
-rw-r--r--sounds/Explosion.wavbin0 -> 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
+
+![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 <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
new file mode 100644
index 0000000..5e7a9b0
--- /dev/null
+++ b/images/Shuttle.png
Binary files differ
diff --git a/images/alien1.png b/images/alien1.png
new file mode 100644
index 0000000..48619ed
--- /dev/null
+++ b/images/alien1.png
Binary files differ
diff --git a/images/alien2.png b/images/alien2.png
new file mode 100644
index 0000000..1e81957
--- /dev/null
+++ b/images/alien2.png
Binary files differ
diff --git a/images/laser.png b/images/laser.png
new file mode 100644
index 0000000..c707ce8
--- /dev/null
+++ b/images/laser.png
Binary files differ
diff --git a/images/laser2.png b/images/laser2.png
new file mode 100644
index 0000000..cefeddd
--- /dev/null
+++ b/images/laser2.png
Binary files differ
diff --git a/images/shieldpart.png b/images/shieldpart.png
new file mode 100644
index 0000000..77b412b
--- /dev/null
+++ b/images/shieldpart.png
Binary files 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
--- /dev/null
+++ b/sounds/EnergyGun.wav
Binary files differ
diff --git a/sounds/Explosion.wav b/sounds/Explosion.wav
new file mode 100644
index 0000000..632ee5c
--- /dev/null
+++ b/sounds/Explosion.wav
Binary files differ