zufällige Sprechanimation *einfach gelöst*

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Benutzeravatar
Saiyaman
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 74
Registriert: 07.05.2005, 12:25

zufällige Sprechanimation *einfach gelöst*

Beitrag von Saiyaman »

Gibt es eine Möglichkeit, die einzelnen Bilder der Sprechanimation zufällig abspielen zu lassen?

MfG
Zuletzt geändert von Saiyaman am 05.02.2006, 19:10, 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 »

Einfach: mehrere SpeechViews erstellen, ein eigenes Say-Kommando scripten und darin vor dem Sprechen eine zufällige Character.SpeechView festlegen. (Nicht genau das, was Du willst, aber vielleicht reicht es Dir.)

Schwierig: einen zweiten, unsichtbaren Charakter sprechen lassen, der an der gleichen Position steht, und dem Hauptcharakter währenddessen abhängig von der Blickrichtung zufällige Character.Frames zuweisen.

Bei Dialogen musst Du die zweite Methode benutzen, im Nachhinein ist diese garnicht soo schwierig umzusetzen. Muss jetzt weg, sonst würde ich ein script posten.

EDIT: (hab doch noch Zeit, hehe)

Code: Alles auswählen

int talking=0;
int lastframe=-1;

repeatedly_execute() {
  cDummy.room=player.room;
  cDummy.X=player.x;
  cDummy.Y=player.y;
  if (cDummy.View==cDummy.SpeechView) { // keine Ahnung, ob das funktionert...
    talking=1;
    SetTimer(1,20);  // Framewechsel alle halbe Sekunde
  }
  else {
    talking=0;
  }
  if (talking && IsTimerExpired(1)) {
    player.ChangeView(player.SpeechView);
    int i=-1;
    while(i==lastframe) {
      i=Random(5); // sechs (0-5) verschiedene talking-Frames pro loop
    }
    lastframe=i;
    player.Frame=i;
    SetTimer(1,20);
  }
  if (talking==0) {
    player.UnlockView();
   lastframe=-1;
  }
}
Statt der Hauptfigur lässt Du einfach immer "Dummy" reden.
(Mach das mal mit PaC-DK ;))
Use gopher repellent on funny little man
Benutzeravatar
Saiyaman
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 74
Registriert: 07.05.2005, 12:25

Beitrag von Saiyaman »

Hmmm.... is ne Möglichkeit. Ich will das aber bei jeder Person so machen :-/ *grübel*

MfG

Edit: Also mit LipSync gehts auch ned :-(
Benutzeravatar
Saiyaman
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 74
Registriert: 07.05.2005, 12:25

Beitrag von Saiyaman »

Code: Alles auswählen

int talking = 0;
int lastFrame = -1;

function repeatedly_execute_always()
{
		// raondom speech
    if (player.View == player.SpeechView)
    {
      talking = 1;
      SetTimer(1, 20);
      player.LockView(player.View);
    }
    else
    {
      talking = 0;
    }
    if ((talking == 1) && IsTimerExpired(1))
    {
      int i = -1;
      while (i == lastFrame)
      {
        i = Random(5);
      }
      lastFrame = i;
      player.Frame = i;
      SetTimer(1, 20);
    }
    if (talking == 0)
    {
      //player.UnlockView(); --- auskommentiert, da sich sonst der Charakter nie bewegt
      lastFrame = -1;
    }  
}
Kann es sein, dass die Timer nicht korrekt arbeiten, wenn geredet wird? Also ich hab das ganze jetzt schon in die "repeatedly_execute_always"-Funktion gepackt, da die andere ohne "-always" ja beim Sprechen nicht aufgerufen wird ;)

Ohne Timer wechselt die Sprechanimation unheimlich schnell immer wieder willkürlich - so wie sie es soll. Nur muss das halt langsamer geschehen.

Mach ich mit dem Timer was falsch?

Edit: Nach dem Sprechen wird automatisch "geunlocked", sodass ich wieder normal laufen kann ;)

------------- UPDATE ------------

So funktionierts:

Code: Alles auswählen

function game_start()
{
  SetTimer(1, 20);
}

int talking = 0;

function repeatedly_execute_always()
{
		// random speech
    if (player.View == player.SpeechView) talking = 1;
    else talking = 0;
    
		if (talking && IsTimerExpired(1))
    {
      player.Frame = Random(5);
      SetTimer(1, 20);
    }    
}
Deutlich kürzere Lösung, wa? ;) Ha! Ich liebe C++ :)

MfG
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Hey, cool, ich bin davon ausgegangen, dass es so nicht funktioniert, weil die Sprech-Animation von AGS dazwischenfunkt.
Das lastframe-Zeug dient nur dazu, dass nicht zweimal hintereinander dasselbe Frame verwendet wird.
Use gopher repellent on funny little man
Benutzeravatar
Saiyaman
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 74
Registriert: 07.05.2005, 12:25

Beitrag von Saiyaman »

Naja, manchmal erfolgt der Wechsel zu schnell, da wohl doch die Sprechanimation im Hintergrund läuft. Aber theoretisch müsste man nur exakt den Pausenwert der Animation rausbekommen, dann wäre das auch weg.

MfG
Antworten