Hallo,
die Spielstruktur ist so nicht ganz optimal. Deswegen muss man da ein bisschen rumbasteln, damit es funktioniert. Günstiger wäre ein stärker objektorientierter Ansatz. Auch die Verwaltung der Karte in einem zweidimensionalen Array wäre besser geeignet.
wie kann ich erreichen, dass die katze nicht mehr über die wassersteine drüberläuft, sondern nicht vorbei kann an ihnen (ich dachte boolean-funktion, die anzeigt ob auf dem nächsten feld ein stein liegt und dann abhängig davon tastatur-befehle (pfeiltasten) zulässt oder nicht. ich weiß aber nicht, wie ich das im code wo unterbringe…)
Als erstes sollte man da das potentielle Ziel ermitteln (im keyPressed):
int zielX, zielY;
if (keyCode == UP) {
zielY=yPosK-groesseFelder;
zielX = xPosK;
} else if (keyCode == DOWN) {
zielY=yPosK+groesseFelder;
zielX = xPosK;
} else if (keyCode == LEFT) {
zielX=xPosK -groesseFelder;
zielY = yPosK;
} else if (keyCode == RIGHT) {
zielX=xPosK+groesseFelder;
zielY = yPosK
}
Und dann kann man anfangen, zu prüfen, ob das ein gültiger Schritt ist. Wenn auf dem Ziel kein Wasserstein liegen soll, dann sollten wir das prüfen:
boolean zielIstWasserstein = false;
for(Wasser w : Wasser) {
//die getter müssen noch in der Wasserklasse eingefügt werden
if(w.getX() == zielX && w.getY() == zielY) {
zielIstWasserstein = true;
break;
}
}
Und wenn danach alles ok ist, können wir laufen:
if(!zielIstWasserstein) {
xPosK = zielX;
yPosK = zielY;
}
wie mache ich, dass die bombe - nachdem sie abgelegt wurde, nach drei sekunden verschwindet und alle steine direkt neben ihr auch löscht?
Processing hat sicher auch eine update-Methode oder etwas ähnliches. Wenn nicht, dann tut es zur Not auch die draw-Methode.
Merke dir in einer Variablen die Zeit, wann die Bombe gelegt wurde. Wenn beim Update dann aktuelleZeit - bombenLegeZeit >= 3 Sekunden ist, dann entferne die Bombe und lösche die Steine. Raussuchen müsstest du die Steine wie oben bei den Wassersteinen. Nur dass du jetzt einen Bereich absuchst. Löschen könntest du die Steine z.B. indem du den Eintrag im Array auf null setzt oder ein Feld in der Steinklasse auf false, damit du siehst, dass der Stein deaktiviert ist. Das Nullsetzen bringt ein paar Probleme mit sich. Ein Set oder List wäre sowieso besser geeignet. Oder wie gesagt ein zweidimensionales Array für die gesamte Karte.
wie kann ich verhindern, dass meine spielfigur über die ränder hinaus wandern kann?
Prüfe in keyPressed außerdem noch, ob das Ziel im Spielfeld liegt. Also:
bool zielInSpielfeld = zielX \>= 0 && zielX = 0 && zielY
> wie kann ich einen munitionszähler einbauen, der die abgelegten bomben herunterzählt und dann nach drei bomben kein bombenlegen mehr zulässt?
Führe einfach eine weitere Variable ein, die du mit 3 initialisierst. Beim Bombenlegen prüfst du außerdem, ob der Zähler \> 0 ist. Und zählst ihn dann herunter. Wenn du willst, kannst du ihn in draw() noch anzeigen (soweit ich weiß musst du dafür erst einen Font erzeugen, mit dem du den Text dann darstellen kannst).
> wie füge ich ein endframe ein? (you won!)
Merke dir in einer Variablen, ob das Spiel läuft, gewonnen oder verloren ist. In draw() prüfe dann diese Variable und zeichne dann nur das entsprechende. Also wenn das Spiel läuft, zeichne so, wie es aktuell ist. Wenn das Spiel gewonnen ist, zeichne diesen Frame usw.
Nico