Brauche dringend hilfe bei game mit processing

Hey ihr Lieben! ich habe ein paar dringende fragen beim programmieren mit processing: ich muss bis 19.2.2014 ein spiel programmieren und bin am verzweifeln. hier meine fragen zu meinem spiel (link!)

  • 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…)

  • wie mache ich, dass die bombe - nachdem sie abgelegt wurde, nach drei sekunden verschwindet und alle steine direkt neben ihr auch löscht?

  • wie kann ich verhindern, dass meine spielfigur über die ränder hinaus wandern kann?

  • wie kann ich einen munitionszähler einbauen, der die abgelegten bomben herunterzählt und dann nach drei bomben kein bombenlegen mehr zulässt?

  • wie füge ich ein endframe ein? (you won!)

hier der link zum game: https://drive.google.com/file/d/0B7wjgICUO_oFMnRvNzF… ich wär für JEDEN klitzekleinen tipp DANKBAR!!! ich bin wirklich am verzweifeln und ihr seid meine letzte chance, mein semesterprojekt vielleicht doch noch zu retten… danke, ihr lieben

Hallo LiWa,

kannst du vielleicht mal dein Projekt exportieren und auf FielUpload o.ä zum Download zur Verfügung stellen (am besten noch in welcher IDE du entwickelst).

Freundliche Grüße,

Robin

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

Hallo,

also grundsätzlich erstmal brauchst du für jedes Spiel eine Spielschleife, also eine Funktion die bei jedem Frame aufgerufen wird und in der so Dinge wie z.b. auch dein Bombentimer hochgezählt werden, Eingaben verarbeitet werden und so weiter.
Bei einem hardwarebasierten Spiel kommt dann hier auch noch die Zeichenschleife für die Objekte.

Hier gibt es dann auch eine Struktur die sich Deltatime nennt, diese stellt die Zeit zwischen zwei Frames dar und kann auch unter anderem für deinen Bombentimer oder animationen hergenommen werden (die Katze die sich von Feld zu Feld bewegt)

Dies ist eine sehr vereinfachte Darstellung eines je nach Platform und Hardware API hopch komplexen Mechanismus.

Generell solltest du dir auch bei einem nicht OOP basierten Spiel über die Datenhaltung gedanken machen, etwa in Form einer Liste/Array. Hier hinterlegst du z.b. welche Felder besetzt sind, mit einem einfachen integer Index kannst du z.b. feststellen auf welchem Feld welches Spielobjekt liegt (0 für frei, 1 für stein, 2 für bombe, 3 für katze …)
Ich denke deine Sprache unterstützt auch 2-dimensionale felder, dann ist es sogar noch einfacher ein Spielfeld darzustellen von [0,0] obere linke Ecke bis [n,n] untere rechte Ecke.
Du kannst dann anhand der Eingabe deiner Spieler prüfen, ob sich in der Richtung noch ein Feld befindet und ob dieses belegt ist.

Anschließend bleibt dann nurnoch eine Variable anzulegen, am besten ein boolscher Typ, in der du festhältst, ob das Spiel noch aktiv ist oder Spieler bereits verloren hat.
Wenn die Variable auf wahr (der Spieler hat Verloren) steht, unterbrichst du deine Spielschleife einfach nachdem diese betreten wurde und zeigst davor eben dein „Verloren-Frame“ an.

Solltest du weitere Fragen haben können wir dir sicherlich helfen.
Grüße