Problem mit Energiebalken!

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Benutzeravatar
Furymars
Süßwasserpirat
Süßwasserpirat
Beiträge: 485
Registriert: 13.06.2006, 20:45
Wohnort: Adventure Treff

Problem mit Energiebalken!

Beitrag von Furymars »

Hallo Community,

ich hänge seit heute an einem Problem mit einem Energiebalken, die immer um 1 abgezogen werden soll wenn man den Gegner (Buhmann im Skript) berührt jedoch passiert nichts wenn ich den Skript in der repeatly execute des jeweiligen Raumes einsetze.

Code: Alles auswählen

int ene = 10;

if (ene == 10 ) {
SetGUIBackgroundPic(3,15);
}

if (GetGlobalInt(ene) == 9) {
SetGUIBackgroundPic(3,14);
}

if (GetGlobalInt(ene) == 8) {
SetGUIBackgroundPic(3,13);
}

if (GetGlobalInt(ene) == 7) {
SetGUIBackgroundPic(3,12);
}

if (GetGlobalInt(ene) == 6) {
SetGUIBackgroundPic(3,11);
}

if (GetGlobalInt(ene) == 5) {
SetGUIBackgroundPic(3,10);
}

if (GetGlobalInt(ene) == 4 ) {
SetGUIBackgroundPic(3,9 );
}

if (GetGlobalInt(ene) == 3 ) {
SetGUIBackgroundPic(3, 8);
}

if (GetGlobalInt(ene) == 2 ) {
SetGUIBackgroundPic(3,7 );
}

if (GetGlobalInt(ene) == 1 ) {
SetGUIBackgroundPic(3, 6 );
}

if (cEgo.IsCollidingWithChar(cBuhmann) == 1) {
  ene-=1;
  }
Wieso verliert der Spielcharacter keine Energie wenn ich ihn nun mit der Tastatur gegen ihn laufe?
Angekündigte Spiele:
MMM : "Nicht ohne meinen Hamster!"
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Problem mit Energiebalken!

Beitrag von KhrisMUC »

Weil Du ene direkt vorher immer wieder auf 10 setzt, 40x pro Sekunde. Außerdem wird nicht ene abgefragt, sondern GlobalInt Nr. 10 (da ene == 10).
Du müsstest z.B. if (ene == 5) .. benutzen.

Code: Alles auswählen

int ene = 10; // außerhalb der Funktion -> behält seinen Wert

function Room_RepExec() {

  if (cEgo.IsCollidingWithChar(cBuhmann)) {
    ene--;
    if (ene > 0) gui[3].BackgroundGraphic = ene + 5;
  }
}
Du siehst, der if-Wust ist unnötig, da der Spriteslot immer um fünf größer als ene ist.
Use gopher repellent on funny little man
Benutzeravatar
Furymars
Süßwasserpirat
Süßwasserpirat
Beiträge: 485
Registriert: 13.06.2006, 20:45
Wohnort: Adventure Treff

Re: Problem mit Energiebalken!

Beitrag von Furymars »

Okay hab den Beitrag nochma komplett überarbeitet wenn ich nu

Code: Alles auswählen

// script for Room: Repeatedly execute

int ene = 10;

function Room_RepExec() {
  
  if (cEgo.IsCollidingWithChar(cBuhmann)) {
    ene--;
    if (ene > 0) gui[3].BackgroundGraphic = ene + 5;
  }
  }
stehen habe, dann sagt der you may have forgotten a closing brace bei der funcion Zeile. Nur wo soll die Klammer hin?
Angekündigte Spiele:
MMM : "Nicht ohne meinen Hamster!"
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Problem mit Energiebalken!

Beitrag von KhrisMUC »

Die } fehlt irgendwo vorher. Sagt er, dass "nested functions" nicht erlaubt sind, oder?
Use gopher repellent on funny little man
Benutzeravatar
Furymars
Süßwasserpirat
Süßwasserpirat
Beiträge: 485
Registriert: 13.06.2006, 20:45
Wohnort: Adventure Treff

Re: Problem mit Energiebalken!

Beitrag von Furymars »

Der sagt "Nested functions not supported (may you have forgotten a closing brace).

Edit: Aber wenn ich nun eine Zeile vorher das } setze erkennt der Skript das ene nichtmehr.
Angekündigte Spiele:
MMM : "Nicht ohne meinen Hamster!"
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Problem mit Energiebalken!

Beitrag von KhrisMUC »

Nicht irgendwo, Du musst schon die richtige Stelle finden.
Allerdings müsste es theoretisch klappen, wenn Du die } in die Zeile vor "int ene = 10;" setzt.

Ansonsten poste doch mal das komplette Raumskript.
Du kannst übrigens mit dem Cursor zu einer Klammer gehen und Ctrl-B drücken, um das Pendant zu sehen.
Use gopher repellent on funny little man
Benutzeravatar
Furymars
Süßwasserpirat
Süßwasserpirat
Beiträge: 485
Registriert: 13.06.2006, 20:45
Wohnort: Adventure Treff

Re: Problem mit Energiebalken!

Beitrag von Furymars »

Ich habe es nun so:

Code: Alles auswählen

}
int ene = 10;

function Room_RepExecute() {
  if (cEgo.IsCollidingWithChar(cBuhmann)) {
    ene--;
    if (ene > 0) gui[3].BackgroundGraphic = ene + 5;
  }
  
  }
Also Fehler zeigt der nun nichtmehr an aber im Spiel funktioniert das nicht so wie ich haben will.
Der Gui bleibt die ganze Zeit grau und hat keine einzige Farbe (Spriteslot 6 - 15);
Angekündigte Spiele:
MMM : "Nicht ohne meinen Hamster!"
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Problem mit Energiebalken!

Beitrag von KhrisMUC »

Das Problem ist, dass RepExec 40x pro Sekunde ausgeführt wird, d.h. sobald sich die Charaktere berühren, dauert es eine Viertelsekunde und ene ist 0.

Ich sehe auch gerade, dass die Funktion bei Dir inzwischen "Room_RepExecute" heißt. Dieser Name muss genau so in der Event-Liste des Raumes eingetragen sein, sonst wird die Funktion überhaupt nicht erst aufgerufen.

Bild
Rechts neben dem blauen Feld muss der Name stehen.
Wenn das Feld leer ist und Du auf den ...-Button klickst, legt AGS die Funktion an; wenn Du ihren Namen dann änderst, fndet AGS die Funktion aber nicht mehr und bringt einen Fehler.

Zurück zum Problem: Überlege Dir, wie lange es dauern soll, bis die Energie leer ist.
Angenommen, nach 10 Sekunden Berührung soll der Balken leer sein, dann musst Du ene am Anfang auf 399 setzen:

Code: Alles auswählen

int ene = 399;

function Room_RepExecute() {
  if (cEgo.IsCollidingWithChar(cBuhmann)) {
    if (ene > 0) {
      ene--;
      gui[3].BackgroundGraphic = ene/40 + 6;
    }
    else {
      // tot
    }
  } 
}
(Alle Zahlen von 399-360 ergeben 9, wenn sie durch 40 geteilt werden, da ints immer abgerundet werden.
359-320 -> 8
319-280 -> 7
usw.
gui[3].BackgroundGraphic springt somit jede Sekunde eins nach unten.)
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Use gopher repellent on funny little man
Benutzeravatar
Furymars
Süßwasserpirat
Süßwasserpirat
Beiträge: 485
Registriert: 13.06.2006, 20:45
Wohnort: Adventure Treff

Re: Problem mit Energiebalken!

Beitrag von Furymars »

Vielen Dank! Danke es funktioniert nun! :D
Ich musste einfach bei repeatly execute room_a durch Room_RepExecute ersetzen, habe den Skript dann so übernommen wie du mir vorgegeben hast und tadaaa!

Edit: Nur mir ist im Skript noch nicht so ganz klar wieso da nun in der letzten Zeile "ene/40 + 6;" stehen soll wenn der Spriteslot um 5 größer immer als der ene int ist.
Angekündigte Spiele:
MMM : "Nicht ohne meinen Hamster!"
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Problem mit Energiebalken!

Beitrag von KhrisMUC »

ene startet bei 399, 399/40+6 = 15
ene geht bis 0, 0/40+6 = 6

399-0 -> 15-6
Use gopher repellent on funny little man
Benutzeravatar
Furymars
Süßwasserpirat
Süßwasserpirat
Beiträge: 485
Registriert: 13.06.2006, 20:45
Wohnort: Adventure Treff

Re: Problem mit Energiebalken!

Beitrag von Furymars »

Okay danke aber noch eine letzte Kleinigkeit.
Wenn die Energie leer ist stirbt der Player nur, wenn der mit Buhmann im Kontakt kommt.
D.h. mit leerer Energie kann der also noch im Raum rumspazieren, ohne das etwas passiert.
Der Player soll als Test einfach nur "H" sagen.

Code: Alles auswählen

}
int ene = 399;
  
function Room_RepExecute() {
  if (cEgo.IsCollidingWithChar(cBuhmann)) {
   if (ene > 0) {
    ene--;
    gui[3].BackgroundGraphic = ene/40 + 6;
   }
  if (ene==0) {
    player.Say("H");
  }
  }
}
Ich möchte wenn der Player 0 Balken hat direkt im Raum stirbt, ohne das der erst noch einmal Schaden bekommen soll.
Angekündigte Spiele:
MMM : "Nicht ohne meinen Hamster!"
Benutzeravatar
TBI
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 87
Registriert: 30.10.2008, 16:21
Wohnort: Marburg (Hessen)
Kontaktdaten:

Re: Problem mit Energiebalken!

Beitrag von TBI »

Spontan:
Statt:

Code: Alles auswählen

ene--;
könntest Du z.B. schreiben:

Code: Alles auswählen

if(ene-- == 1) player.say("H");
Dafür kannst Du den kompletten if(ene==0)-Block streichen.
Grund: Wenn direkt überprüft wird, ob es der letzte Hitpoint ist, der ihm gezogen wird, stirbt der Player sofort, noch während er den Buhmann berührt. Durch das "--" hinter dem ene wird der letzte HP trotzdem gezogen, allerdings erst nach der Auswertung. Das heißt, wenn ene==1, dann ist ene-- auch == 1, das Dekrementieren (also 1 abziehen) paßiert erst nach der Überprüfung.

Vorschlagend,
/TBI

P.S.: Mir ist grad aufgefallen, daß Du die Balkengraphik ja erst danach aktualisierst. In dem Fall würd ich den letzten if-Block einfach nur direkt hinter den GUI-Befehl setzen, also noch in die große if-Klammer.
A la fin, il y aura seulement de la beauté.
Benutzeravatar
Furymars
Süßwasserpirat
Süßwasserpirat
Beiträge: 485
Registriert: 13.06.2006, 20:45
Wohnort: Adventure Treff

Re: Problem mit Energiebalken!

Beitrag von Furymars »

Jetzt erkennt der den Skript garnicht mehr:

Code: Alles auswählen

  // script for Room: Repeatedly execute
}
int ene = 399;
  
function Room_RepExecute() {
  if (cEgo.IsCollidingWithChar(cBuhmann)) {
   if (ene > 0) {
   if (ene-- == 1) player.Say("H");
    gui[3].BackgroundGraphic = ene/40 + 6;
  }
}
}
Nun kommt die Fehlermeldung :

Failed to save room room1.crm; details below
room1.asc(22): Error (line 22): Parse error in expr near 'ene'

Das ist in der ZEile wo das (ene-- == 1) steht.

PS: Wie fügt man Plugins in AGS 3.0 ein?
Angekündigte Spiele:
MMM : "Nicht ohne meinen Hamster!"
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Problem mit Energiebalken!

Beitrag von KhrisMUC »

Ich bin mir nicht sicher, ob AGS diese Syntax unterstützt (die ich persönlich noch nie mochte).

Bei Grafik 6 ist die Anzeige leer?
Dann so:

Code: Alles auswählen

int ene = 360;
 
function Room_RepExecute() {
  if (cEgo.IsCollidingWithChar(cBuhmann)) {
    if (ene > 0) {
      ene--;
      gui[3].BackgroundGraphic = (ene+39)/40 + 6;
    }
    if (ene==0) {
      player.Say("H");
    }
  }
}
Übrigens: solche grafischen Energiebalken kann man auch AGS zeichnen lassen, d.h. es wäre kein Problem, den Balken nur pixelweise schrumpfen zu lassen, ohne hundert Sprites zu importieren.
Dazu verwendet man einen GUIButton und zeichnet ein DynamicSprite, das man dann als Button-Grafik setzt.
Use gopher repellent on funny little man
Benutzeravatar
Furymars
Süßwasserpirat
Süßwasserpirat
Beiträge: 485
Registriert: 13.06.2006, 20:45
Wohnort: Adventure Treff

Re: Problem mit Energiebalken!

Beitrag von Furymars »

Danke euch nun funktioniert alles so wie ich es auch haben wollte.
Manchmal überfordern mich solche Skripte einfach. :roll:

Danke euch vielmals! :D
Angekündigte Spiele:
MMM : "Nicht ohne meinen Hamster!"
Antworten