# Tower Defense mit Gamegrid von aplu



## Gurmor (24. Feb 2012)

Hallo

Ich versuche gerade ein Tower Defense mit Gamegrid von aplu zu programmieren.
GameGrid

Aber es kommt immer bei isinGrid und bei getLocation eine Fehlermeldung, das ein Actor nicht teil von gamegrid ist.

(kann ich irgendwo bilder hochladen ohne mich anzumelden?)

Jedenfalls sieht der Problemmachende Code so aus:


```
for (int i = 0; i<2;i++){	
			
			if (ziel.isInGrid()&&this.isInGrid()){
			setDirection(this.getLocation().getCompassDirectionTo(ziel.getLocation()));
			}
			move();
		
			if(map.isActorColliding(this, ziel)){					
             System.out.print("Hit");
				
				ziel.leben = (ziel.leben-schaden);
				this.removeSelf();				
			}
		}
```

Das befindet sich in der act-Methode des Pfeils.
Der Peil soll verschwinden, wenn es das Ziel trifft.

edit: java ist so s******e XD, ich lerne schon seit einem jahr und kann noch gar nichts.

edit2:
hier habt ihr mehr code:

Creep-Klasse
Darauf schiesst der Turm.


```
public class Creep extends Actor{
	int reihenfolge;
	int leben = 300;											// Leben des Monsters.
	
	public void act(){
		if (leben <= 0){									// Wenn das Leben null oder weniger ist...
			this.removeSelf();									// Entfernt den Actor aus dem Gamegrid.
		} else {
			move();												// Bewegt den Actor. Eine Bewegung nach rechts ist Standard.
			if (getLocation().x>800 || getLocation().x<0){		// Wenn sich das Monster bei einer x-Koordinate ausserhalb des Gamegrids befindet...
				turn(180);										// Verändert die Bewegrichtung um 180 Grad.
			}
		}
	}
	
	// Das ist der Konstruktor der Creep-Klasse.
	public Creep(int reihenfolge){
		super(true, "L:/Einf/Bilder/Creep.gif");
		this.reihenfolge = reihenfolge;
		// Führt den Konstruktor der Actor-Klasse aus, dem die Drehbarkeit der GIF-Datei und die GIF-Datei übergeben wird.
	}

	public Creep() {
		super(true, "L:/Einf/Bilder/Creep.gif");
	}
}
```

Turm Klasse

```
public class Tower extends Actor {
	Creep ziel;											// Das Ziel des Turms.
	int schaden = 1;									// Schaden, der der Turm machen kann.
	int abschussfrequenz;								// Frequenz, mit der der Turm Pfeile abschiesst.
	Map map;											// Das dem Turm zugehörige Gamegrid.
	
	// Das ist der Kontruktor der Tower-Klasse.
	public Tower (Map map, Creep ziel){
		super(true,"L:/Einf/Bilder/Turm.gif");			
		// Führt den Konstruktor der Actor-Klasse aus, dem die Drehbarkeit der GIF-Datei und die GIF-Datei übergeben wird.
		this.map = map;									
		// Weisst dem zu erstellenden Objekt das Gamegrid, das dem Konstruktor als Argument übergebene Gamegrid zu.
		this.ziel = ziel;								
		// Weisst dem Ziel des zu erstellenden Objekts, das dem Konstruktor als Argument übergebene Ziel zu.
	}
	
	public void act (){
		if (nbCycles % 10 == 0){										// Wenn die Simulationsschritte durch 10 teilbar sind...
			try {
				if (ziel==null){
					ziel = map.monster.get(map.monster.indexOf(ziel)+1);
					map.addActor(new Pfeil(map,ziel, schaden),getLocation());
				} else {
					map.addActor(new Pfeil(map,ziel, schaden),getLocation());
				}
				// Fügt dem Gamegrid einen neuen Pfeil hinzu, dem der Schaden und das Ziel des Turmes übergeben wird
				// Der Pfeil wird an der Stelle platziert, an der sich der Turm befindet.
			} catch (Exception e){
				
			}
		}
	}
}
```

Pfeil Klasse


```
public class Pfeil extends Actor{
	Map map;
	Creep ziel;													// Ziel des Pfeils.
	int schaden = 1;											// Schaden des Pfeils.
	int flächenschadenradius = 0;								// Radius des Flächenschadens.
	
	public void act(){
		//if (!(this.isRemoved())){
		for (int i = 0; i<2;i++){								// For-Schleife mit 2 Iterationen.
			//if (ziel.isRemoved()){
				//ziel = map.monster.get((map.monster.indexOf(ziel))+1);
			//}
			if (ziel.isInGrid()&&this.isInGrid()){
			setDirection(this.getLocation().getCompassDirectionTo(ziel.getLocation()));
			}
			move();
		
			if(map.isActorColliding(this, ziel)){				// Wenn sich der Pfeil an der gleichen Position wie sein Ziel befindet...					System.out.print("Hit");
				
				ziel.leben = (ziel.leben-schaden);					// Verringert das Leben des Ziels um den Schadenswert.
				this.removeSelf();									// Entfernt den Actor aus dem Gamegrid.
			}
		// Ändert die Bewegrichtung in die Richtung des Ziels.
		}
		//}
	}
	
	// Das ist der Kontruktor der Pfeil-Klasse.
	public Pfeil(Map map, Creep ziel, int schaden) {
		super (true, "L:/Einf/Bilder/Pfeil.gif");		
		// Führt den Konstruktor der Actor-Klasse aus, dem die Drehbarkeit der GIF-Datei und die GIF-Datei übergeben wird.
		this.ziel = ziel;								
		// Weisst dem Ziel des Objekts, das dem Konstruktor als Argument übergebene Ziel zu.
		this.map = map;
		this.schaden = schaden;							
		// Weisst dem Schaden des zu erstellenden Objekts, den dem Konstruktor als Argument übergebene Schaden zu.
	}
```

Sry für die vielen Kommentäre. Ist etwas übertrieben


----------



## Fu3L (24. Feb 2012)

Da fehlt zu viel. Zumindest ein wenig mehr drumrum und die Klasse zu der Ziel gehört, dürften nötig sein. 
Ich hab dieses GameGrid zwar noch nie genutzt ,denke aber, dass auch jemand, ders kennt, das so nicht beantworten könnte.
Die genaue Fehlermeldung wäre auch gut.



> edit: java ist so s******e XD, ich lerne schon seit einem jahr und kann noch gar nichts



Den Kommentar verkneife ich mir^^


----------



## Gurmor (24. Feb 2012)

hab aktualisiert.


----------



## Fu3L (24. Feb 2012)

Vermutung:


```
public void act(){
        //if (!(this.isRemoved())){
        for (int i = 0; i<2;i++){                               // For-Schleife mit 2 Iterationen.
            //if (ziel.isRemoved()){
                //ziel = map.monster.get((map.monster.indexOf(ziel))+1);
            //}
            if (ziel.isInGrid()&&this.isInGrid()){
            setDirection(this.getLocation().getCompassDirectionTo(ziel.getLocation()));
            }
            move();
        
            if(map.isActorColliding(this, ziel)){               // Wenn sich der Pfeil an der gleichen Position wie sein Ziel befindet...                   System.out.print("Hit");
                
                ziel.leben = (ziel.leben-schaden);                  // Verringert das Leben des Ziels um den Schadenswert.
                this.removeSelf();                                  // Entfernt den Actor aus dem Gamegrid.
            }
        // Ändert die Bewegrichtung in die Richtung des Ziels.
        }
        //}
    }
```

Du entfernst den Pfeil (this) vom Spielfeld und dann lässt du das ganze nochma mit dem gleichen Pfeil durchführen ( // For-Schleife mit 2 Iterationen.), der dann ja nicht mehr Teil des Spielfeldes ist. Würde den Wortlaut der Fehlermeldung erklären.


----------



## Gurmor (25. Feb 2012)

ok, funktioniert mit break;


----------



## MrBig (27. Feb 2012)

Aha, ein TU Darmstadt Student ;-) tzzz


----------



## Firephoenix (27. Feb 2012)

MrBig hat gesagt.:


> Aha, ein TU Darmstadt Student ;-) tzzz



Hoffentlich nicht - Am 24. um 16 Uhr war nämlich Abgabe ^^


----------



## MrBig (27. Feb 2012)

Firephoenix hat gesagt.:


> Hoffentlich nicht - Am 24. um 16 Uhr war nämlich Abgabe ^^



Wer eis vielleicht lebt er in einer gegend in der sich die Erde langsamer dreht :lol:
Ne Spass bei Seite, dann wäre es in der Tat zu spät.... wenn am 24. Abgabe war.:autsch:


----------



## Gurmor (27. Feb 2012)

LOL, ich bin schweizer :bae:
wäre lustig


----------



## Gurmor (29. Feb 2012)

Neues Problem:
Meine Monster sind Kreise. Im Moment haben sie einfach ein Sprite-Bild, das so aussieht wie ein Kreis.

Ich würde nun gerne machen, dass die Monster, wenn sie Leben verlieren, die Farbe ändern. Dazu möchte ich nicht viele Sprites erstellen, sondern die Farbe berechnen lassen.
Die Farbe soll von grün linear zu rot werden.

Ich finde aber in der Dokumentation zu Gamegrid keinen Konstruktor für Graphics, nur welche mit Sprites.
Ist es nun unmöglich?


```
public Creep(int reihenfolge){
		super(true, "E:/Einf/Bilder/Creep.gif");
		this.reihenfolge = reihenfolge;
	}
```


----------



## Gurmor (29. Feb 2012)

wie lösch ich diesen post?


----------

