Autor Thema: Privates Fragethread  (Gelesen 8622 mal)

Private

  • kleiner Tentakelsaugknopf
  • **
  • Beiträge: 22
    • Profil anzeigen
    • E-Mail
Privates Fragethread
« am: 12. Mai 2012, 19:06:50 »
Hallo, bin neu hier und habe beim Durchsuchen der bisherigen Beiträge keine Lösung für mein Problem gefunden.

Genutzt wird das aktuelle Starterpack Bernard für das aktuelle AGS 3.2?

Ich möchte, dass mein Spielercharakter im Bett liegt und im Schlaf redet. Die Bilder dazu habe ich bereits erstellt und ins Spiel geladen.

Wie kann ich bei
player.Say("...");

die Sprachanimation starten, die ich als Loop 4 in den BernardT-Ordner eingefügt habe? Das wäre die Animation, die er machen soll, wenn er in dieser Liegeposition ist.

im Global Skript muss es doch irgendwo definiert sein, dass beim Sprechen diese oder jene Sprachanimation abhängig von der jeweiligen Befindlichkeit des Charakters abgespielt werden soll. Meinetwegen schaut der Charakter nach rechts, also soll beim Sprechen der entsprechende Loop abgespielt werden.

Hoffentlich könnt Ihr mir helfen.

EDIT: Zu Beginn von Episode MMM04 liegt Hoagie auf Bernards Bett und spricht. Es muss also wenigstens ein Person wissen, wie das geht, was ich machen möchte.

EDIT: so, einen befehl habe ich schon mal gefunden:
player.LockViewFrame(9, 6, 0);
Damit bekomme ich schon mal den Charakter zum liegen, ohne dass ich das über den Animationsbefehl mache, wie ich es vorher hatte.

Jetzt fehlt nur noch das mit dem Loop für das Sprechen im Liegen.

EDIT: ok, habe es selbst herausgefunden. offenbar reichte es, dass ich den loop fürs quatschen auf die selbe zahl lege wie den loop im bewegungsbereich des charakters.
« Letzte Änderung: 13. Mai 2012, 14:48:14 von Private »

Private

  • kleiner Tentakelsaugknopf
  • **
  • Beiträge: 22
    • Profil anzeigen
    • E-Mail
Re: Privates Fragethread
« Antwort #1 am: 13. Mai 2012, 14:50:32 »
Nächstes Problem: In einer Cutscene stoppt bei mir plötzlich die Hintergrund-Musik. Ich weiß nicht, warum das geschieht, und auch nicht, wie ich das Problem beheben kann.

Hier das Skript:
function room_Load()
{
  SetBackgroundFrame(2);
  aMusic5.Play();
  Door[eTuerBernardsZimmer].Init(oTuer01, hTuer01);
  oPerpetuumMobile.SetView(56, 0, 0);
  oPerpetuumMobile.Animate(0, 7, eRepeat, eNoBlock);
  oComputer.SetView(57, 0, 0);
  oComputer.Animate(0, 9, eRepeat, eNoBlock);
}

function room_FirstLoad()
{
StartCutscene (eSkipESCOrRightButton);
StopMusic();
aMusic10.Play(eAudioPriorityVeryHigh);
SetBackgroundFrame(1);
object[7].Visible = true;
object[6].Visible = true;
object[1].Visible = true;
player.PlaceCharacter(210, 112, eDirUp);
player.LockViewFrame(9, 6, 0);
player.Transparency = 0;
Wait(100);
player.Say("Tun Sie es nicht, Herr Koslowski. Das dürfen Sie nicht.");
player.Say("Sie können mich der Schule nicht verweisen.");
player.Say("Nicht wegen Sport.");

object[8].Visible = true;
aSound2.Play();
Wait(30);
cBerno.EnterRoom(5, -30, 135, eDirRight);
cBerno.Walk(30, 135, eBlock, eAnywhere);
Wait(50);
cBerno.Say("Endlich.");
cBerno.Say("Bernard, da musst du jetzt durch.");
cBerno.Walk(190, 135, eBlock, eWalkableAreas);

object[8].Visible = false;
object[7].Visible = false;
object[6].Visible = false;
object[1].Visible = false;
EndCutscene();
player.PlaceCharacter(230, 140, eDirLeft);
}
Beim ersten Satz, den Bernard spricht, ist die Hintergrundmusik bereits nicht mehr zu hören.

EDIT: Problem solved. Ich hatte in einer vorigen Cutscene ein Musikstück laufen, und dadurch, dass es nicht gestoppt wurde, hat sich vermutlich irgendwas verhakt. So langsam lässt sich in das System einfinden, obwohl es mir nicht benutzerfreundlich genug ist für Laien wie mich, die nicht viel mit der Programmiersprache am Hut haben.
« Letzte Änderung: 13. Mai 2012, 17:54:12 von Private »

Private

  • kleiner Tentakelsaugknopf
  • **
  • Beiträge: 22
    • Profil anzeigen
    • E-Mail
Re: Privates Fragethread
« Antwort #2 am: 13. Mai 2012, 20:37:18 »
Auch in der Gefahr, es wieder selbst irgendwo herauszufinden, gebe ich bei der Suche nach Hilfe in diesem Forum noch nicht auf:

Ich möchte bei diesem Befehl
DisplayTopBar(1, 8, 7, "Erzaehler", "Bernards Haus");einen Sound abspielen.

Lieber hätte ich zwar, dass die Buchstaben nach und nach einzeln auftauchen, aber erstmal gebe ich mich damit zufrieden.

Bisher gelingt es mir nur, den Sound vorher oder nachher abzuspielen.

EDIT: Als gelernter Autodidakt (den Witz versteht nicht jeder) habe ich es jetzt nicht sehr elegant hierüber gelöst.

if (aSound23.Play()) {
  DisplayTopBar(180, 8, 8, "Erzaehler", "Bernards Haus");
  }
Zuvor habe ich aber die Textgeschwindigkeit ändern müssen.
« Letzte Änderung: 13. Mai 2012, 21:27:46 von Private »

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 981
    • Profil anzeigen
Re: Privates Fragethread
« Antwort #3 am: 13. Mai 2012, 21:56:26 »
Hast Du es denn mal so versucht:
[ags]  aSound23.Play();
  DisplayTopBar(180, 8, 8, "Erzaehler", "Bernards Haus");[/ags]

Sounds sind nicht blocking, das sollte eigentlich so klappen (und Dein Code macht unterm Strich nichts anderes).

Und AGS skripten ist Dir nicht benutzerfreundlich genug...? Sorry, einfacher wird es nicht (und geht es auch kaum).

Private

  • kleiner Tentakelsaugknopf
  • **
  • Beiträge: 22
    • Profil anzeigen
    • E-Mail
Re: Privates Fragethread
« Antwort #4 am: 13. Mai 2012, 23:07:19 »
danke für die rückmeldung, ja das habe ich versucht, aber das stimmte nicht ganz überein, mittlerweile bin ich mit dem ergebnis zufrieden, ärgere mich aber, dass ich zu wenig ahnung von dem ganzen habe. ich kann ja ende der nächsten woche eine art demo meiner idee posten, falls das jemanden interessiert. zunächst einmal mache ich das ganze, weil ich lust drauf habe und es für mich machen möchte. am ende kann ich es aber zur freien verfügung stellen. die story, oder besser: der rahmen für den plot, steht ja noch nicht mal zu 100%, es wird wie alles bei mir im prozess entwickelt.

spätestens bei den rätseln werde ich vermutlich einige hürden nehmen müssen.

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 981
    • Profil anzeigen
Re: Privates Fragethread
« Antwort #5 am: 13. Mai 2012, 23:35:11 »
Hier ist noch keiner in ein paar Tagen vom Anfänger zum Supercoder geworden. Wenn Du Dich jetzt schon ärgerst...

Und gib dem Forum hier ruhig etwas mehr Zeit; wenn Du die Antwort auf Deine Fragen immer selbst parat hast, heißt das nicht, dass wir anderen langsam oder schreibfaul sind, sondern eigentlich nur, dass Du hier voreilig postest... ;)
Neue Spielemacher sind hier aber immer herzlich willkommen; wenn Du Dein Projekt durchziehst und einen Betatest machen lässt, kann eigentlich nicht viel schief gehen.

Falls Du Rückmeldungen zu Deiner Story, Deinen Grafiken o.Ä. willst und schon was entsprechendes vorzuweisen hast, mach Doch hier einen Thread auf: http://www.maniac-mansion-mania.de/forum/index.php?board=9.0

Wegen dem Schreibmaschinen-Stil für Bildschirmtext: solche Sachen muss man i.d.R. selbst coden oder ein entsprechendes Modul nutzen.

Private

  • kleiner Tentakelsaugknopf
  • **
  • Beiträge: 22
    • Profil anzeigen
    • E-Mail
Re: Privates Fragethread
« Antwort #6 am: 14. Mai 2012, 13:37:34 »
Nächste Frage:
Wie kann ich Folgendes richtig skripten?

Ich möchte, dass in einem Raum je nach Charakter ein anderer Inhalt des "function room_AfterFadeIn()" abgerufen wird.

Versucht habe ich
if (player = cBerno) {
else (player = cBernard) {}
}
Aber das hat es nicht gebracht.

Alternativ kann ich natürlich einfach einen neuen Raum erstellen, was ich aber eigentlich nicht will. Bislang habe ich die Räume des Starterpacks um ein Nachtframe als Background erweitert.

Bòógieman

  • International anerkannter Superheld
  • Globaler Moderator
  • alter Tentakel
  • *****
  • Beiträge: 2585
  • Geschlecht: Männlich
  • Grün Tentakel = Running Sushi!
    • Profil anzeigen
    • Bòógieman's Halls Of Illusions
Re: Privates Fragethread
« Antwort #7 am: 14. Mai 2012, 13:47:14 »
zum vergleichen musst du == statt = machen

if (player == cBerno) {
else (player == cBernard) {}
}
Schlachtaman Vibrations, UHYEAH!!!
_________________________________

Visit Bòógieman's Halls Of Illusions
_________________________________

>>>> Ende der Kommunikation <<<<

Fatal B

  • Mod
  • volljähriger Tentakel
  • **
  • Beiträge: 890
  • Geschlecht: Männlich
  • "50% +- 0 von Fatal hoch zwei"
    • Profil anzeigen
    • Fatal²
Re: Privates Fragethread
« Antwort #8 am: 14. Mai 2012, 13:56:12 »
Oder du benutzt Variablen .

zB:

[ags]if (GetGlobalInt(326)==0)  {  //Hier wird die Variable gesetzt

cBernard.Say("Das Zimmer ist dunkel.");

SetGlobalInt(326,1);  }  // Hier wird die Variable von 0 auf 1 gesetzt

else if (GetGlobalInt(326)==1)  {  // Hier wird jetzt beim zweiten Raumbetreten diese Variable abgespielt

cBernard.Say("Das Zimmer jetzt hell.");

SetGlobalInt(326,2);  }  // Und hier wird wieder die Variable um 1 erhöht usw...[/ags]

Hoffe du versteht es wie ich es meine, bin kein guter Erklärer. :o
Epis:
DMdcvdS: In Arbeit 20%
 

Aggressiver Verfechter von MMM lebt

Private

  • kleiner Tentakelsaugknopf
  • **
  • Beiträge: 22
    • Profil anzeigen
    • E-Mail
Re: Privates Fragethread
« Antwort #9 am: 14. Mai 2012, 14:09:29 »
ha! danke euch beiden, die doppelten gleichheitszeichen haben es gebracht, und den anderen code werde ich für später im hinterkopf behalten.

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 981
    • Profil anzeigen
Re: Privates Fragethread
« Antwort #10 am: 15. Mai 2012, 01:40:25 »
Der Code muss so aussehen:
[ags]  if (player == cBerno) {
    ...
  }
  else if (player == cBernard) {
    ...
  }
  else {
    ...
  }[/ags]

Und die Verwendung von GetGlobalInt und SetGlobalInt wird mit nicht unter fünf Gnackwatschn bestraft... ;)
Ernsthaft, wir haben nicht mehr 2004.

Fatal B

  • Mod
  • volljähriger Tentakel
  • **
  • Beiträge: 890
  • Geschlecht: Männlich
  • "50% +- 0 von Fatal hoch zwei"
    • Profil anzeigen
    • Fatal²
Re: Privates Fragethread
« Antwort #11 am: 15. Mai 2012, 23:51:03 »

 ;D

Epis:
DMdcvdS: In Arbeit 20%
 

Aggressiver Verfechter von MMM lebt

Private

  • kleiner Tentakelsaugknopf
  • **
  • Beiträge: 22
    • Profil anzeigen
    • E-Mail
Re: Privates Fragethread
« Antwort #12 am: 16. Mai 2012, 18:16:12 »
Irgendwie klappt es heute nicht so gut:
Ich möchte, dass die Spielerfigur in den geöffneten Briefkasten schaut und daraus einen Umschlag (addinventory) erhält.

Beim zweiten Anschauen soll die Figur einfach nur sagen, dass da nichts weiter drin ist.

Mein fehlgeschlagener Versuch:
else if (UsedAction(eActLookAt) == 1)
{
Wait(5);
player.Say("Oh, ein Briefumschlag.");
        player.AddInventory(iBriefumschlag);
}
    else if (UsedAction(eActLookAt) == 2)
    {
      Wait(5);
      player.Say("Leer.");
    }    

EDIT: Ich glaube, ich habe hier was Nützliches gefunden:
http://www.adventuregamestudio.co.uk/wiki/?title=MultiResponse

Werde es gleich mal ausprobieren.

EDIT2:Ok, ich bin zu blöd. Wie bekomme ich die
MultiResponse.scm
Datei ins Spiel integriert?

EDIT3:
Gut, ich habe es dann doch geschafft. Für alle Dummies wie mich:
Eine scm-Datei wird in AGS integriert, indem man im Baumdiagramm auf der rechten Seite bei den Scripts die rechte Maustaste drückt und dann "Import Script" anklickt. Wo man die Datei gespeichert hat, sollte man eigentlich wissen.
« Letzte Änderung: 16. Mai 2012, 22:14:40 von Private »

Endres

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1264
  • Geschlecht: Männlich
  • En|dres, der
    • ICQ Messenger - 230191486
    • MSN Messenger - enni_puschner@hotmail.de
    • Profil anzeigen
    • e7p.de
    • E-Mail
Re: Privates Fragethread
« Antwort #13 am: 16. Mai 2012, 18:59:32 »
Nein, MultiResponse brauchst du für sowas nicht. Dein Ansatz mit ifs ist schon gar nicht so schlecht.
Weil sonst kriegst du das mit dem Inventar nicht mehr so richtig da rein. Auch falls du mal was anderes machen willst.

allerdings musst du auch dies mit Variablen / GlobalInts machen.

[ags]    else if (UsedAction(eActLookAt))
    {
        Wait(5);
        if (iUmschlagWeg == 0)
        {
            iUmschlagWeg = 1;
       player.Say("Oh, ein Briefumschlag.");
            player.AddInventory(iBriefumschlag);
        }
        else
        {
            player.Say("Leer.");
        }
    }[/ags]


Domi:"irc hab ich mir viren geholt.. icq hab ich nimmer"

Private

  • kleiner Tentakelsaugknopf
  • **
  • Beiträge: 22
    • Profil anzeigen
    • E-Mail
Re: Privates Fragethread
« Antwort #14 am: 16. Mai 2012, 19:08:24 »
Danke Dir. Ich habe es jetzt so gelöst, und es klappt. Ich wollte nicht extra mit Global Ints arbeiten müssen, aber irgendwann werde ich das wohl nicht mehr vermeiden können:

else if (UsedAction(eActLookAt))
{
Wait(5);
int state=Multi.Say("Oh, ein Briefumschlag.>Leer.>Immer noch leer.");
      if (state==1) player.Animate(14, 3, eOnce, eBlock, eForwards);
      if (state==1) aSound25.Play();
      if (state==1) player.AddInventory(iBriefumschlag);
}

Mit dem Multi-Response-Script läuft das einwandfrei.