# SpaceInvaders 101



## seking01 (13. Dez 2010)

hi,

ich brauche mal hilfe beim Space Invaders Tutorial 101 von Kevin Glass (Space Invaders 101 - An Accelerated Java 2D Tutorial | Coke And Code - Java Games and Games Development) .

Wir müssen für die Uni ein Space Invaders Spiel nachbauen..und das ganze nach 3 Vorlesungen Java in denen nur Grundkentnisse vermittelt wurden.
Ich hab mich nun hingesetzt und versucht mir alle Kentnisse anzueignen...aber beim SpriteStore fängts dann an zu scheitern.
Es gibt ja sicherlich eine einfachere, nciht so Ressourcen schonende Methode die Sprites in das Programm einzufügen...ich schaffs aber einfach nicht. Hat jemand ne Lösung, Idee, Anregung, Hinweis wie ich das angehen kann?

Vielen Dank!


----------



## SlaterB (13. Dez 2010)

der Code ist doch schon fertig, welche Person auf diesem Planeten soll dann noch 'ich schaffs nicht' sinnvoll beantworten?


----------



## seking01 (13. Dez 2010)

Ich hab mich absolut dumm ausgedrückt merke ich gerade.

Ich möchte das gesamte Projekt nicht einfach kopieren sondern schon nachbauen... allerdings ohne diesen SpriteStore mit einer anderen, von mir aus schlechteren möglichkeit, die Grafiken einzubauen.

Bei Projektabgabe kann ich ja schlecht den Code 1zu1 kopiert abgeben.. und da mir das mit dem SpriteStore absolut unklar ist... wollte ich eine einfachere Methode.

Der Rest des Tutorials ist eigentlich nicht so schwer zu verstehen für mich


----------



## SlaterB (13. Dez 2010)

der Store speichert die Bilder, so dass sie bei jedem Anfragen nicht wieder neu von der Festplatte geladen werden,
wenn du nur eine Handvoll Bilder hast, dann reichen auch ganz normale Variablen, schon ist der Store überflüssig,

Alternative zu Bildern von der Festplatte ist wohl nur selber malen, paintComponent, Graphics, drawLine, bekannt?


----------



## seking01 (13. Dez 2010)

Ganz normale Variablen klingt gut.. ( Es soltlen schon gif`s sein.)
Meinst du das so, das ich für jedes meiner Bilder die ich verwnden möchte, eine Image Variable anlege und diese dann, je nachdem was gezeichnet wird, aufrufe?


----------



## SlaterB (13. Dez 2010)

ja


----------



## seking01 (13. Dez 2010)

Danke schonmal für deine Hilfe Anhaltspunkte.

Du scheinst dich mit dem Programme twas auszukennen.... ich probiere die geschichte gerade, klappt aber (natürlich) nicht so wie ich es gedacht habe.

ich dachte an folgendes vorgehen:
1. SpriteSotre löschen
Als nächstes habe ich den Konstruktor der Klasse Sprite geändert in

```
public Sprite(Image image, String ref) {
this.image = Toolkit.getDefaultToolkit().getImage(ref);}
```

Meine Idee dahinter ist, dass er so den Pfad des Bildes direkt über die Klasse Sprite bekommt.
Ist der Gedanke korrekt?


----------



## SlaterB (13. Dez 2010)

ich denke schon,

wieso gehst du nicht gleich einen Schritt weiter und setzt es so um und siehst es laufen oder nennst auftretende Probleme?
meine Anzahl Antworten sind begrenzt


----------



## seking01 (13. Dez 2010)

Naja, ich hab keine Idee wie ich das ganze nun der Entity Klasse mitteile...


bei 

```
public Entity(String ref,int x,int y) {
		this.sprite = SpriteStore.get().getSprite(ref);  // <<< muss gegen x ausgetauscht werden
		this.x = x;
		this.y = y;
		
	}
```


Da steh ich grad aufm Schlauch...


----------



## SlaterB (13. Dez 2010)

statt String ist der Parameter dann Sprite oder Image, je nachdem wie du es gern hättest,

wer immer der Aufrufer ist, muss dann halt dafür sorgen, dass er das Sprite-Objekt hat

z.B. bei
> ship = new ShipEntity(this,"sprites/ship.gif",370,550);
in Game lautet es nun
> ship = new ShipEntity(this,this.shipSprite,370,550);

und die Variable/ das Klassenattribut shipSprite muss dann eben vorher irgendwann angelegt worden sein


----------



## seking01 (13. Dez 2010)

Danke danke, ich glaub ich habs verstanden, klappen tuts aber noch nciht soo ganz 

ich hab nun folgende Änderungen vollzogen:

Game.class
Drei Sprite Objekte erstellt je eins für ship, alien und shot

```
Sprite shipSprite = new Sprite("sprites/ship.gif");
Sprite alienSprite = new Sprite("sprites/alien.gif");
Sprite shotSprite = new Sprite("sprites/shot.gif");
```


Der Aufruf des Schiffes / der Aliens mit neuem Parameter Sprote anstatt String

```
private void initEntities() {
		// create the player ship and place it roughly in the center of the screen
		ship = new ShipEntity(this,this.shipSprite,370,550);
		entities.add(ship);
		
		// create a block of aliens (5 rows, by 12 aliens, spaced evenly)
		alienCount = 0;
		for (int row=0;row<5;row++) {
			for (int x=0;x<12;x++) {
				Entity alien = new AlienEntity(this,this.alienSprite,100+(x*50),(50)+row*30);
				entities.add(alien);
				alienCount++;
			}
		}
```

Der Konstruktor in der Entity/ShipEntity/AlienEntity Klasse nun ebenfalls mit Sprite anstatt String.

```
public Entity(Sprite sprite,int x,int y) {
		this.sprite = sprite;
		this.x = x;
		this.y = y;
		
	}
```


```
public ShipEntity(Game game,Sprite sprite,int x,int y) {
		super(sprite,x,y);
		
		this.game = game;
	}
```


```
public AlienEntity(Game game,Sprite sprite,int x,int y) {
		super(sprite,x,y);
		
		this.game = game;
		dx = -moveSpeed;
	}
```

Das Programm funktioniert ohne Fehlermeldung, aber es werden keine Grafiken angezeigt... 

Ist ein offensichtlicher Fehler / falsches Denken zu erkennen?


----------



## SlaterB (13. Dez 2010)

möglich ist, dass es keine Bilder auf der Festplatte gibt, der Pfad dorthin falsch ist oder die Bilder nicht angezeigt werden können,

versuche erstmal eine einfache GUI zu erstellen dir ein Bild anzeigt


----------



## seking01 (13. Dez 2010)

Hm habs hinbekommen!

Er hat tatsächlich die Bilder nicht gefunden...jetzt mit der neuen Methode funktioniert es nur, wenn ich den absoluten Pfad der Bilddateien angebe, warum auch immer...


----------



## SlaterB (13. Dez 2010)

System.out.println(new File("sprites/ship.gif").getAbsolutePath());
zeigt dir an, was Java aus dem relativen Pfad macht


----------

