Funktion stoppen bzw. abbrechen ?

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
PsychoF82
Hobby-Archäologe
Hobby-Archäologe
Beiträge: 140
Registriert: 22.09.2005, 23:44
Wohnort: NRW
Kontaktdaten:

Funktion stoppen bzw. abbrechen ?

Beitrag von PsychoF82 »

Kurze Frage... Gibt es einen befehl dafür, um Funktionen abzubrechen?
Ich meine damit, dass der weitere Script eines Hotspots nicht ausgeführt wird und es ganz normal weiter geht.

Zum Beispiel:

Code: Alles auswählen

if (getglobalint(100)==1)
  {
    DisplaySpeech(EGO,"Bei diesem Hotspot breche ich jetzt ab.");
    ----BEFEHL FÜR ABBRECHEN----
  }
.
.
.
----Ganz viele tolle Dinge passieren----
Gibt es bei AGS so etwas? Würde mir so einiges erleichtern 8)
(Unter Basic konnte man ja dann einfach alles mit GOTO ... überspringen :mrgreen: )
[ZENSIERT]
Adventure-Gott
Adventure-Gott
Beiträge: 4575
Registriert: 13.07.2004, 14:04
Wohnort: Da wo muss
Kontaktdaten:

Beitrag von [ZENSIERT] »

return;

Ach nee, dann wird alles danach abgebrochen
Es heißt, Leute mit den originellsten Nicknames schreiben die besten Beiträge

Ausnahmen bestätigen die Regel
_________________
<Problem> Weil du denken kannst.

Zuletzt bearbeitet von [ZENSIERT] am 16.07.1759, 16:19, insgesamt 54743869-mal bearbeitet
PsychoF82
Hobby-Archäologe
Hobby-Archäologe
Beiträge: 140
Registriert: 22.09.2005, 23:44
Wohnort: NRW
Kontaktdaten:

Beitrag von PsychoF82 »

*lol* So einfach? :lol: :lol: :lol:

Hehe danke :wink:


Edit: Okay nach deinem editieren muss ichs auch. Leider doch nicht so leicht...
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7308
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Beitrag von Fightmeyer »

Ich bin mal so frech und mißbrauche den Thread hier, da meine Frage irgendwie auch da reinpaßt.

Alle die sich die, nennen wirs mal Techdemo, zu Zahltag runtergeladen haben, haben sichelrich schon den Headbangenden Herb gesehen. Diese Animation läuft als Endlosschleife. Ich hatte mir das so vorgestellt, daß der user das bei Bedarf mit der Maus beenden kann.

Sieht dann ungefähr so aus:

Code: Alles auswählen

pushed =0;
	
while (pushed==0) {
if ((mouse.IsButtonDown(eMouseLeft)) || (mouse.IsButtonDown(eMouseRight))) {
pushed = 1;
}
cEgo.Animate(1,6,eOnce,eBlock);
}
Funktioniert zwar, ist aber unschön, da man manchmal die Maustaste gedrückt halten muß, bis er es in der nächsten Schleife erkennt.

Gibts ne andere Möglichkeit, den Mausklick abzufragen???

EDIT: Ups! Die ursprüngliche Frage ist ja doch noch nciht abschließend geklärt. Sorry fürs dazwischendrängen..
Zuletzt geändert von Fightmeyer am 21.02.2006, 18:53, insgesamt 1-mal geändert.
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

PsychoF82:
Pack den kompletten zu überspringenden Teil in eine entsprechende if-Abfrage. Mann muss einfach die Struktur von Anfang an entsprechend aufsetzen, dann ist das kein Problem.

Fightmeyer:

Code: Alles auswählen

while (mouse.IsButtonDown(eMouseLeft)==false);
reicht auch.
(Müsste theoretisch reichen, sonst statt ";" halt "{}".)

Dein Skript sollte aber theoretisch auch sofort nach dem Klick abbrechen, da die while-Schleife bestimmt mindestens 1000 mal pro Sekunde durchlaufen wird.

Es gibt IIRC auf blöd auch einen wait_mouse_click-Befehl oder so ähnlich.
Use gopher repellent on funny little man
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7308
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Beitrag von Fightmeyer »

Probier ich mal aus. Danke.

P.S. Wofür steht eigentlich dieses IIRC?
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

if I recall correctly

Hat es funktioniert?
Use gopher repellent on funny little man
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7308
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Beitrag von Fightmeyer »

Es funktioniert genausogut bzw. genausoschlecht wie vorher. Manchmal erkennt er den Mausklick sofort und manchmal erst beim dritten Versuch.

Wie verhält sich das mit dem Cutscene Befehl? Alternativ dazu könnte ich ja vorher einfach ne Cutscene starten und danach das Ende der Cutscene ansetzen. Dann greift doch die Abbruchfunktion von AGS selbst, oder? (Hab noch nie Cutscene benutz.)

Edit: Ist Blödsinn! Das kommt davon, wenn man in der Hilfe mal irgendwo CUTSCENE aufschnappt. Da hab ich mir wohl Funktionen eingeredet, die gar nciht existieren. :wink:
Benutzeravatar
Sinitrena
Tastatursteuerer
Tastatursteuerer
Beiträge: 678
Registriert: 08.05.2004, 01:01
Wohnort: Frankfurt
Kontaktdaten:

Beitrag von Sinitrena »

Ich hab keine Ahnung, ob das mit IsButtonDown wirklich eine gute Idee ist. Wahrscheinlich geht das auch, aber mein Lösungsvorschlag wäre:
- benutzt stattdessen on_mouse_click event
- und ein Variable zum Abfragen, ob die Maus normal wie immer oder auf spiezielle Weise funktionieren soll

Code: Alles auswählen

function on_mouse_click(int button) // called when a mouse button is clicked. button is either LEFT or RIGHT
  {
  if (button==LEFT) 
    {
  if (normal==1) {
      ProcessClick(mouse.x,mouse.y,GetCursorMode());
      }
  else if (normal==0) {
  pushed=1;
}
}
}
Ich hab das jetzt nicht getestet, aber ich denk es müsste funktionieren. IsButtonDown ist doch eher für Sachen wie "wahrend der Maus-Button gedrückt ist soll sich der Cha bewegen" und nicht um ein einmaliges klicken abzufragen.

Und nebenbei, über ne Cutscene ist es theoretisch auch möglich, vorausgesetzt, du legst eine bestimmte Anzahl an Durchläufen für die Animation fest.

Ich hab mir jetzt deine Demo nicht angesehen und weiß nicht ob das in dem Fall sinnvoll/möglich wäre das auch über eine Idle-Animation zu lösen, bei der die Wartezeit so niedrig wie möglich eingestellt ist.
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7308
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Beitrag von Fightmeyer »

Nur mal so für mich zum Verständnis. Das muß ins Globale Script, oder???

Ich werds morgen mal ausprobieren. Danke für den Tipp.
Benutzeravatar
Sinitrena
Tastatursteuerer
Tastatursteuerer
Beiträge: 678
Registriert: 08.05.2004, 01:01
Wohnort: Frankfurt
Kontaktdaten:

Beitrag von Sinitrena »

Ja, das müsste ins global
Mir ist gerade noch was aufgefallen: Bevor du den Weg komplett änders, versuch mal einfach aus dem eBlock ein eNoBlock bei der Animatione zu machen wenn das nicht deiner Absicht widerspricht, ich denke das könnte auch helfen.
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7308
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Beitrag von Fightmeyer »

Hat leider nicht wirklich funktioniert.

eBlock muß schon rein. Sonst bringt er nen Fehler, daß er die Loops nciht richtig verarbeiten kann.

Und die Variante mit der Code im Global Script funzt leider auch nicht. Da reagiert er überhaupt nicht.

Sieht folgendermaßen aus (Global Script):

Code: Alles auswählen

function on_mouse_click(MouseButton button) {
  // called when a mouse button is clicked. button is either LEFT or RIGHT
  if (IsGamePaused() != 1) {
    // Game is paused, so do nothing (ie. don't allow mouse click)
		if (button == eMouseLeft) {
			if (normal==0) {
				ProcessClick(mouse.x, mouse.y, mouse.Mode );
				}
			else if (normal==1) {
				pushed=1;
		}
			if (button == eMouseRight) {
				mouse.SelectNextMode();
				}
		}
	}

}
und im Rooms script:

Code: Alles auswählen

		normal=1;
		
		while (pushed==0) {
				cEgo.Animate(1,6,eOnce,eBlock);
		}
		
		pushed=0;
		normal=0;
Ich werd wohl wieder zu meinem ursprungscode zurückkehren und die Verzögerung in Kauf nehmen müssen.

Edit: Ich seh gerade, ich hätts auch komplett über die normal-Variable machen können. Hätt nochmal ein bißchen Code gespart, am gesamtergebnis allerdings nichts geändert.
Benutzeravatar
Rocco
Adventure-Treff
Adventure-Treff
Beiträge: 1020
Registriert: 25.11.2003, 16:20
Wohnort: Ronville
Kontaktdaten:

Beitrag von Rocco »

hast du die variablen auch eportiert?
sonst arbeitest du in jedem script mit lokalen variablen, die zwar den selben namen haben, aber sonst keinen bezug zueinander.
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7308
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Beitrag von Fightmeyer »

Ja. Hab ich gemacht. Und natürlich im roomscript importiert. Funzt leider nicht.
strazer
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 35
Registriert: 17.06.2005, 14:22

Beitrag von strazer »

Die Cutscene-Idee war schon richtig, meiner Meinung nach. Probiere es mal so:

Code: Alles auswählen

  StartCutscene(4); // Cutscene starten
  while (game.skipping_cutscene == 0) { // solange Cutscene nicht abgebrochen wird
    player.Animate(1, 6, eOnce, eBlock); // spiele Animation ab
  }
  EndCutscene(); // Ende der Cutscene
Antworten