Hauptmenü

Neuigkeiten:

Bitte unterstützt uns und bestellt über diese Links bei Amazon  oder HumbleBumble!

.Walk nach einem Dialog?

Begonnen von cast, 15. Juli 2007, 23:41:11

Vorheriges Thema - Nächstes Thema

Mister L

Zitat von: Bòógieman in 19. Juli 2007, 08:31:50
EDIT: hmm, bin mir jetzt aber nicht sicher, ob die idle-view bei einem NonPlayerCharacter überhaupt funktioniert...  :-\
Ja, das geht auch bei NPCs.

cast

Habe ich auch schon gemacht.
Aber es geht trotzdem nicht.
Ted is red.
See red Ted.

Rocco

also ich hab das mal so gemacht.

wenn der spieler in den raum kommt wo sich der idel character befindet, in den ... players enters room before fadein


// VORSICHT ALTER CODE  ;)
SetCharacterView(JEFF,9);       // Das ist der idle view
AnimateCharacter(JEFF,0,9,1);


wenn er dann angeprochen wird. (talk to character)

ReleaseCharacterView(JEFF);
RunDialog(2);
 

im dialog dann diese zeile

run-script 7

und dort (global script, dialog request) dann wieder dieses

if(xvalue == 7) {
                SetCharacterView(JEFF,9);
    AnimateCharacter(JEFF,0,3,1);
    }


sorry bin jetzt zu faul um das auf neuen code umzuändern, hab das von meinem ersten ags-game Airbreak (gibts übrigens als open source)rauskopiert.

cast

Hi,

ist kein thema, habe es auch schon vorher in der "before fade in" drinn gehabt.
Das einzige was ich nicht hatte, war das mit dem releasecharacterview.

ABER: Es geht immernoch nicht.
Kann ich das als repeadly execute einfügen? Das halt alle halbe sekunde die view beginnt?
Ted is red.
See red Ted.

KhrisMUC

Bin grad zu erledigt, um mich damit genauer auseinander zu setzen, aber eins:

Zitat von: Manual, Dialog.Start()NOTE: The conversation will not start immediately; instead, it will be run when the current script function finishes executing.

Also:
dDialog.Start();
cPenner.ChangeView...
cPenner.Animate...
bringt nix, es wird in dieser Reihenfolge ausgeführt:
cPenner.ChangeView...
cPenner.Animate...
dDialog.Start();
Das Ulkige (oder Traurige) hierbei ist: genau dieser Punkt war der Grund, warum dieser thread überhaupt gestartet wurde.
Und meine Antwort damals:
Zitat3. RunDialog wird am Ende einer Funktion aufgerufen, egal, wo es steht.
Eine einfachere Methode: Zwei RunScript-Actions benutzen, "dDialog.Start()" [...] ans Ende der Ersten, alles, was nach dem Dialog passieren soll, kommt in die Zweite.

Kein Problem. Gern geschehen.

Rocco

Zitat von: cast in 19. Juli 2007, 18:03:30

ABER: Es geht immernoch nicht.
Kann ich das als repeadly execute einfügen? Das halt alle halbe sekunde die view beginnt?
das würde ich nicht empfehlen, wird dann standardmässig 40x pro sekunde gestartet, würde deswegen nicht viel bringen.

hast du am ende von deinem dialog run-script 4?

cast

Zitat von: KhrisMUC in 19. Juli 2007, 18:16:26

cPenner.ChangeView...
cPenner.Animate...
dDialog.Start();


Hey danke, nur ist das jetzt eine endlosschleife, da es ewig geloopt wird, bevor der dialog startet.
Ted is red.
See red Ted.

steve-o-mat

#37
Zitat von: cast in 19. Juli 2007, 19:00:04
Hey danke, nur ist das jetzt eine endlosschleife, da es ewig geloopt wird, bevor der dialog startet.

character[EGO].Animate(3, 1, 0, eBlock, eBackwards);


Hab hier mal das Beispiel aus der Hilfedatei hergenommen...

3 ist die Nummer des Loops, 1 das Delay, dann kommt der Repeat style (da müsste für stete Wiederholung ja eRepeat rein), der Blocking style und dann die Richtung die der Loop durchläuft.
Wenn ich das letztens richtig verstanden habe bewirkt das eBlock, das alles geblockt wird bis die Animation zuende ist. Da müsstest du  noBlock reinsetzen -> keine Blockung! (also keine Endlosschleife)    ;)
[/klugscheiss]    ;D

Falls ich da irgendwie falsch liege, lass ich mich gern berichtigen.


KhrisMUC

Statt der 0 kann man auch eOnce verwenden.

eNoBlock und eRepeat zusammen geht ohne weiteres, und eRepeat macht auch nur mit eNoBlock Sinn, da das Spiel sonst ja auf das Ende einer endlosen Animation wartet ;)

cast

danke nochmal.

Jetzt habe ich allerdings ein anderes problem.

Und zwar:
Der Penner gibt kommentare ab:


  // script for Room: Repeatedly execute
if(IsTimerExpired(1)) {
  int ran = Random(3);
  if(ran==0) DisplaySpeechBackground(PENNER, "Hier muss doch was Essbares sein.");
  else if(ran==1) DisplaySpeechBackground(PENNER, "Oh man! Ich habe so einen Hunger");
  else if(ran==2) DisplaySpeechBackground(PENNER, "Hmm... alter Nudelauflauf!");
  else if(ran==3) DisplaySpeechBackground(PENNER, "Wie kan man sowas nur wegwerfen?");
  SetTimer(1, Random((10*20))+(20*10));
  }   


Allderings soll es so sein, dass der Penner weggeht wenn man ihm einen Burger gibt<- das habe ich schon alles.
Allerdings läuft das Script oben immernoch weiter. wie kann ich das ganze in eine If-Abfrage machen, dass abgefragt wird ob der Char in dem raum ist und dann das script läuft und wenn nicht, dann nicht.
Ted is red.
See red Ted.

KhrisMUC

Nur nebenbei: statt DisplaySpeechBackground wird inzwischen Folgendes verwendet: cPenner.SayBackground("...");
Aber egal:
if (IsTimerExpired(1) && cPenner.Room==X) {

cast

#41
Mal wieder ich.

So, ich will einen countdown der nach nach einem gespräch gestartet wird.
Also nach dem dialog kommt halt mein run-script befehl.

und in der dialog request kommt dann das hier:

if (xvalue==4) {
    SetTimer(2,200); 
    if (IsTimerExpired(2)){
    cJustus.ChangeRoom(5, 1, 1);
    }
}


Es ist ja das gleiche wie mit dem Penner, der was alle paar sekunden sagt, nur dieses geht einfach nicht.


€DIT:
Hat sich erledigt.
Mister L hatte die gleiche Frage im Adventure Treff Forum.
Ted is red.
See red Ted.

Mister L

Zitat von: cast in 21. Juli 2007, 03:23:29
Mister L hatte die gleiche Frage im Adventure Treff Forum.
Echt? Kann ich mich gar nicht mehr dran erinnern.  :-\
Tja, man wird alt...  ;)

KhrisMUC

#43
Nur aus Neugier: Ging es darum, dass if (IsTimerExpired(... in die repeatedly_execute muss?

Übrigens kannst Du den SetTimer-Befehl auch in eine zweite RunScript-action schreiben, wenn er nach dem Dialog ausgeführt werden soll (ich wiederhole mich).
Die dialog_request sollte man nur benutzen, wenn es nicht anders geht, sonst wirds schnell unübersichtlich.

Bei der Gelegenheit:
Wenn man eigene enums definiert, erhalten diese die Werte 1, 2, 3, usw. in der Reihenfolge der Deklaration. Also könnte man zumindest in der dialog_request (wenn auch nicht im Dialogskript) z.B. sowas verwenden:
function dialog_request(int p) {
  if (p==Edna_schaut_boese) {   // run-script 1
    cEdna.ChangeView(47);
  }
  ...
}

Das geht natürlich auch anderswo, ein tolles Beispiel wäre CallRoomScript(), da kann man nämlich direkt sowas machen:

// global script
  CallRoomScript[AlleTuerenZu];

// room script
function on_call(int p) {
  if (p==AlleTuerenZu) {
  ...
}

Und das tollste: Autocomplete funktioniert bekanntlich auch mit enums :D

cast

hey hey,

lange nichts von mir gehört.

Ich habe mal eine frage... was sonst.

Und zwar soll eine zwischensequenz kommen, wie halt mit dem Paket und Ed.

Okay, der timer rennt runter, nur die frage wie ich den raum lade.

Das war bisher so, dass ich EGO in den raum geladen habe, wobei player invisible gesetzt ist.

Allerdings soll nach der cutszene, der vorige raum geladen werden, .prevroom, allerdings steht mein EGO ja nicht mehr an der stelle.

Kann man das mit einem Save and Load regeln? dass er vor der scene saved und am ende lädt?

oder gibt es gar eine einfachere lösung?
Ted is red.
See red Ted.