Autor Thema: Privates Fragethread  (Gelesen 10994 mal)

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 #15 am: 17. Mai 2012, 00:32:04 »
Hehe, ob du es glaubst oder nicht, aber mit dem Multi-Response hast du dann statt einer sogar zwei Variablen. ;)


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 #16 am: 17. Mai 2012, 00:56:09 »
@Endres
Keine Sorge, ich bin gutgläubig, ich glaube Dir das schon.

so, feierabend für heute. komme mir vor, wie im studium der theoretischen philosophie. der erste beweis, der gelingt, verschafft unheimliche glücksgefühle. und dann, wenn man nicht weiter kommt, stellt sich ein vollkommen gegensätzliches gefühl ein.

nun stehe ich vor dem problem, dass mir einfach nicht einleuchten will, warum das mit dem inventar nicht klappt, wie ich es will.

1. ich möchte inventar a mit inventar b benutzen, und zwar wechselseitig.
das klappt auch, aber nur, wenn ich mit der linken maustaste zuerst jeweils den einen inventargegenstand anklicke und dann den anderen.
sobald ich aber den "benutze" butten anklicke und dann auf den inventargegenstand klicke, egal ob a oder b, so will das programm plötzlich nur noch einen "benutze"- und keinen "benutze-mit" befehl ausführen.

Beispiel: Ich habe einen Briefumschlag und möchte ihn mit einem Skalpell öffnen.
Sobald ich aber den Event "Use Inventory on this Item" verwende und dort mit "player.ActiveInventory = iItemxy" auswähle, was auf den jeweiligen gegenstand angewendet werden kann, erzeuge ich obiges Problem. Ich kann mit der linken Maustaste im Inventar die Gegenstände miteinander kombinieren, aber eben nicht durch "Benutze" + "Skalpell" mit "Briefumschlag", weil er ja nur "Benutze" versucht und kein "Benutze-mit", warum auch immer das versperrt ist, kann ich mir nicht erklären. jedenfalls wäre das spiel so aus meiner sicht nicht spielbar.

Mit dem Event "Other click on inventory item" habe ich es leider auch nicht hinbekommen.

2. dann suche ich verzweifelt ein tutorial, das gerade diese dinge klärt:
Benutze Inventar mit Inventar
Benutze Inventar mit Hotspot
Benutze Inventar mit Objekt
(in diesem Forum findet man wenigstens in einem Tutorial eine Formel, mit der man Gegenstände an andere Charaktere geben kann.)

3. Habe mir nochmal das Tutorial angeschaut und dort das gefunden:
if(UsedAction(eActUse)) {
Wait(5);
player.Say("Vielleicht woanders.");
}
else if(player.ActiveInventory==iUSBStick) {
Wait(5);
player.Say("Ich stecke den Stick mal rein...");
}
else Unhandled_Inventory();
Das, was hier mit dem USB-Stick angedacht ist, funktioniert einfach nicht. Das kann man knicken und es sollte vlt. das Tutorial dahingehend geändert werden.
« Letzte Änderung: 17. Mai 2012, 01:10:56 von Private »

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 988
    • Profil anzeigen
Re: Privates Fragethread
« Antwort #17 am: 17. Mai 2012, 14:06:37 »
Nochmal bzgl. des Briefumschlags:
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);
}
Die drei Zeilen mit if (state == 1) kann man zu einem Block zusammenfassen:
[ags]      if (state==1) {
        player.Animate(14, 3, eOnce, eBlock, eForwards);
        aSound25.Play();
        player.AddInventory(iBriefumschlag);
      }[/ags]

Das Multiresponse-Modul ist ne feine Sache, es gibt aber eine eingebaute Funktion in AGS, die zumindest zwei states zulässt:
[ags]      if (Game.DoOnceOnly("Briefkasten-Check")) {
        player.Say("Oh, ein Briefumschlag!");
        player.Animate(14, 3, eOnce, eBlock, eForwards);
        aSound25.Play();
        player.AddInventory(iBriefumschlag);
      }
      else player.Say("Er ist leer.");[/ags]
Den Text, der als Parameter übergeben wird, kannst Du beliebig wählen, er muss nur jeweils eindeutig sein. Damit kann man praktischerweise auch den gleichen Check an zwei verschiedenen Stellen im Code durchführen, indem man einfach bei beiden den selben Text verwendet.

So kann man zumindest vermeiden, wegen jedem Pups ne Raum- oder globale Variable einzuführen.

Wegen des Benutzens zweier Inventargegenstände:
Eigentlich sollte ein Inventargegenstand bei angewähltem "Benutze" nur sofort allein benutzt werden, wenn am Ende ein ">u" hängt.
Ich hab das mal mit dem ManiacMansion-Starterpack getestet.
Damit ein Inventargegenstand nicht auswählbar ist, sondern sofort benutzt wird, muss erstens ein ">u" am Namen hängen, zweitens muss eine Funktion bei "Interact with item" verlinkt sein, und drittens muss "Gehe zu" oder "Nimm" das aktive Verb sein.
Die ersten beiden Kriterien kannst Du ganz leicht ändern.

Als nächstes solltest Du bei "Use inventory on item" Folgendes eintragen:
[ags]function iBriefumschlag_UseInv()
{
  if (player.ActiveInventory == iSkalpell) brief_oeffnen();
  else Unhandled_Inventory();
}

function iSkalpell_UseInv()
{
  if (player.ActiveInventory == iBriefumschlag) brief_oeffnen();
  else Unhandled_Inventory();
}[/ags]

Über(!) diese beiden Funktionen setzt Du nun:
[ags]function brief_oeffnen() {
  ...
}[/ags]
Und schreibst dort rein, was passiert, wenn man das Skalpell mit dem Umschlag oder umgekehrt benutzt.

Einen Inventargegenstand mit einem Objekt oder Hotspot zu benutzen, funktioniert so:
Du legst für den Hotspot die "Any click on" funktion an, und dann setzt Du Folgendes rein:
[ags]function hBaum_AnyClick()
{
  if (UsedAction(eActLookAt)) {
    player.FaceLocation(176, 130);
    Wait(5);
    player.Say("Nur ein Baum.");
    return; // jetzt aussteigen
  }
  if (MovePlayer(176, 155) == 2) {
    player.FaceDirection(eDirUp);
    Wait(5);
    if (UsedAction(eActUseInventory)) {
      if (player.ActiveInventory == iTaschenlampeOn) {
        player.Say("Ich leuchte mal in den Baum.");
      }
      // else if (UsedAction()) { }   // hier andere Verben
      else Unhandled();
    }
    else Unhandled();
  }
  else player.Say("Ich komme nicht ran.");
}[/ags]

Hier lasse ich bei "Schau an" den Charakter nicht hinlaufen, d.h. er kann sich den Baum auch von der Ferne ansehen, falls er z.B. gerade nicht erreichbar ist. Soll er statt dessen genauer untersucht werden, setze ich den if (UsedAction(eActLookAt))-Block mit rein zu den anderen Verben.

MovePlayer liefert nur 2 zurück, wenn der Charakter auch tatsächlich bei den Koordinaten angekommen ist. Deswegen sollte man immer diesen == 2 Check machen.
Als nächstes lässt man den Charakter in die richtige Richtung schauen, dann überprüft man die Aktion, in diesem Fall muss also eActUseInventory verwendet werden. Am Ende überprüft man das verwendete Item.
Die Unhandled()s sind wichtig, damit das Spiel korrekt reagiert, falls eine andere Aktion oder ein anderes Item verwendet wurde.

Übrigens wirst Du auf Dauer nicht um globale oder zumindest Raumvariablen herumkommen; wie anders soll Dein Spiel wissen, wann der Spieler Fortschritte bei den Rätseln gemacht hat?
Ein paar Schlauköpfe haben das teilweise mit unsichtbaren Inventory Items und ähnlichen Späßen versucht, aber bitte begib Dich nicht auf derartige Irrwege.
« Letzte Änderung: 17. Mai 2012, 14:08:58 von KhrisMUC »

Private

  • kleiner Tentakelsaugknopf
  • **
  • Beiträge: 22
    • Profil anzeigen
    • E-Mail
Re: Privates Fragethread
« Antwort #18 am: 17. Mai 2012, 14:30:45 »
zum letzten Punkt. oha, nicht dass ich da schon auf den irrweg geraten bin. vielen dank für die einführenden hinweise.

habe das problem mit dem benutzen auch hier im forum gefunden:
http://www.maniac-mansion-mania.de/forum/index.php?topic=1994.0

den tipps dort bin ich gefolgt und es funktionierte, aber nicht für lange ... denn sobald ich dann den inventargegenstand nochmals benutzt habe, ging danach die "Benutze mit"-Funktion nicht mehr.

Meine vorläufige Lösung:
function iGummiballRepLeer_UseInv() {
if (player.ActiveInventory==iSkalpell) {
  int state=Multi.Say("Nein.>Niemals!");
  if (state==1) {
  player.Say("Zuerst biete ich all meine psychische und physische Kraft auf, um den Ball in einen intakten Zustand zu versetzen.");
  player.Say("Und jetzt soll ich mein legendäres Tagwerk wieder vernichten?");
  }
  player.ActiveInventory = null;
  }
else Unhandled_Inventory();
}
Also, ich habe bei jedem "UseInv" die Zeile "player.ActiveInventory = null;" eingefügt. Es funktionierte, ich war froh, aber stieß dann sogleich auf das nächste problem in diesem zusammenhang:
Ich verwendete das Skalpell mit dem Garagentor, worauf der "Benutze-mit"-Befehl wieder blockiert oder weg war, so dass nur noch ein "Benutze" ging.
Als nächstes probiere ich aus, ob ich nicht bei den Hotspots und Objekten auch noch
"player.ActiveInventory = null;" einfügen muss, um das Problem zu vermeiden.

EDIT: Ha, es war erfolgreich. Dank Deines Hinweises wusste ich nun auch, wo genau ich das bei den Hotspots einzutragen habe. Es ist zwar etwas umständlich, aber solange die Funktionalität gewährleistet wird, ist es in Ordnung.
« Letzte Änderung: 17. Mai 2012, 14:56:17 von Private »

Private

  • kleiner Tentakelsaugknopf
  • **
  • Beiträge: 22
    • Profil anzeigen
    • E-Mail
Re: Privates Fragethread
« Antwort #19 am: 17. Mai 2012, 16:47:33 »
Jetzt habe ich den Salat.

Ich wollte einen Inventargegenstand erstellen, den man direkt mit "Benutze" verwenden kann. Und nun geht das nicht mehr.

Habe extra bei Description ">u" dahinter geschrieben.

EDIT: Ich werde jetzt erstmal alles rückgängig machen, was ich im Global Script geändert habe. Mal sehen, ob dann was geht.

Welches neuere Starterpack funktioniert denn einwandfrei? Vielleicht könnte ich einfach die Definitionen übernehmen. Dann müsste doch das mit dem "Benutze" und "Benutze-mit" auch wieder richtig gehen.

EDIT2:
nächste Frage:
Ich möchte eine Tür mit einem Schlüssel aufschließen und dann verwenden.

Was muss ich dazu im Door-Skript ändern?

EDIT3:Problem solved. Im Door-Skript habe ich die Tür in der Garage entdeckt, dort stand Global Int = 2.
Habe ich gleich auf meine Tür übertragen und im Room-Skript der Garage auch den entsprechenden Befehl
if(Door[eTuerGarage].ClickSpecial(2, 3, iSchluessel, 0) == 0 ) Unhandled();gefunden.
Jetzt klappt es, aber irgendwie wollte ich eigentlich noch ein Türrüttelsound einbauen, wenn jemand versucht die Tür zu öffnen, zu drücken oder zu ziehen, obwohl Sie geschlossen ist. Das müsste ich ja eigentlich dann auch in das Türenskript schreiben können.
« Letzte Änderung: 18. Mai 2012, 13:59:37 von Private »

Private

  • kleiner Tentakelsaugknopf
  • **
  • Beiträge: 22
    • Profil anzeigen
    • E-Mail
Re: Privates Fragethread
« Antwort #20 am: 18. Mai 2012, 19:14:33 »
Wie kann ich die Musiklautstärke ändern?
SetMusicVolume(-3);oder
SetMusicMasterVolume(0);hat beides keinen Effekt.

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 988
    • Profil anzeigen
Re: Privates Fragethread
« Antwort #21 am: 19. Mai 2012, 10:30:50 »
Probier es mal so:

[ags]  AudioChannel*ac = aMusik.Play();
  ac.Volume = 50;  // 0 - 100[/ags]

Rocco

  • Administrator
  • alter Tentakel
  • *****
  • Beiträge: 2352
  • Geschlecht: Männlich
    • Profil anzeigen
    • Maniac Mansion Mania
    • E-Mail
Re: Privates Fragethread
« Antwort #22 am: 19. Mai 2012, 13:18:35 »
Wie kann ich die Musiklautstärke ändern?
SetMusicVolume(-3);oder
SetMusicMasterVolume(0);hat beides keinen Effekt.

Diese Befehle sind veraltet.
Für die Slider im OptionsGui:
[ags]function sldMusic_OnChange(GUIControl *control)
{
  //System.Volume = sldMusic.Value;
  Game.SetAudioTypeVolume(eAudioTypeMusic, sldMusic.Value, eVolExistingAndFuture);

}

function sldSound_OnChange(GUIControl *control)
{
  // This sets the sound volume. Note it'll also affect MOD and XM music - read the manual
  Game.SetAudioTypeVolume(eAudioTypeSound, sldSound.Value, eVolExistingAndFuture);
}[/ags]

Private

  • kleiner Tentakelsaugknopf
  • **
  • Beiträge: 22
    • Profil anzeigen
    • E-Mail
Re: Privates Fragethread
« Antwort #23 am: 19. Mai 2012, 14:56:23 »
offenbar kann ich das nicht im roomskript eingeben. jedenfalls führte das zu keiner änderung.

Rocco

  • Administrator
  • alter Tentakel
  • *****
  • Beiträge: 2352
  • Geschlecht: Männlich
    • Profil anzeigen
    • Maniac Mansion Mania
    • E-Mail
Re: Privates Fragethread
« Antwort #24 am: 19. Mai 2012, 14:59:34 »

Der Wert in der Mitte ist die Lautstärke.
Das ist der Befehl auf den es ankommt.

[ags]  Game.SetAudioTypeVolume(eAudioTypeMusic,50, eVolExistingAndFuture);[/ags]

Private

  • kleiner Tentakelsaugknopf
  • **
  • Beiträge: 22
    • Profil anzeigen
    • E-Mail
Re: Privates Fragethread
« Antwort #25 am: 19. Mai 2012, 17:45:33 »
habs versucht, hat nicht geklappt, die musik ist immer noch viel zu laut und lässt sich durch den befehl nicht regeln.

es ist das stück

aMusic26

im neuesten Bernard-Starterpack.

oder liegt es daran, dass ich windows 7 64bit verwende?

Rocco

  • Administrator
  • alter Tentakel
  • *****
  • Beiträge: 2352
  • Geschlecht: Männlich
    • Profil anzeigen
    • Maniac Mansion Mania
    • E-Mail
Re: Privates Fragethread
« Antwort #26 am: 20. Mai 2012, 10:09:45 »
seltsam, also an win7 64bit liegts nicht.
wäre ja abstrus wenn sich die lautstärke auf einem win7 32 bit ändern liesse,
aber auf einem 64bit system nicht.

wenn es nur um das eine Musikstück geht,
dann such dir das file unter audio -> music und stell die DefaultVolume ein.
Vielleicht klappts so.  :cl
   

Private

  • kleiner Tentakelsaugknopf
  • **
  • Beiträge: 22
    • Profil anzeigen
    • E-Mail
Re: Privates Fragethread
« Antwort #27 am: 20. Mai 2012, 13:17:40 »
aber klar, dabei hatte ich die funktion doch schon vorher bemerkt, danke rocco.

Private

  • kleiner Tentakelsaugknopf
  • **
  • Beiträge: 22
    • Profil anzeigen
    • E-Mail
Re: Privates Fragethread
« Antwort #28 am: 20. Mai 2012, 19:01:53 »
nächste Frage:
Ich habe einen Dialog geschrieben und wollte, dass im Anschluss daran einige Dinge geschehen.

Nun zieht das Programm diese Handlungen vor und spielt anschließend den Dialog ab.

Gibt es eine Möglichkeit, dass ich erst den Dialog abspielen kann und danach die anderen Sachen beginnen?

Ich könnte mir sowas mit einem Blockingbefehl vorstellen.

EDIT: Das Problem zerstört mir jetzt irgendwie alles.

Wenn ich im Dialog einen Charakter ausblende, den Raum ausblende und dann den Charakter einen anderen Raum betreten lasse, kann ich dort in dem anderen Raum den Charakter nicht wieder einblenden. Das ist nervig.
Wenn ich versuche, es nach dem Dialog zu machen, dann werden Handlungen vor dem Dialog vollzogen und nicht danach, wie es sein sollte. Und das Spiel stürzt anschließend ab.

im Dialog:
Wait(40);
cBerno.Animate(27, 5, eOnce, eBlock, eForwards);
int trans;
while (trans < 100) {
   trans++;
   player.Transparency = trans;
   Wait(1);
   aSound28.Play();
 }
Wait(40);
cBerno.FaceDirection(eDirDown);
cBerno.Say("Ich hätte ihn wirklich umbringen sollen.");
StopMusic();
FadeOut(1);
player.EnterRoom(23, 140, 110, eDirLeft);
Wait(50);
stop
}

Und dann im neuen Raum:
function room_FirstLoad()
{
aMusic11.Play();
Wait(60);
 int trans;
 while (trans > 0) {
    trans--;
    player.Transparency = trans;
    aSound28.Play();
    Wait(1);
  }
player.Say("Was zum ...");
}

Aber die Figur wird leider nicht eingeblendet, wie ich es will. Ich weiß nicht, woran es liegt, aber wenn ich das so nicht hinbekomme, weiß ich nicht, wie ich die Handlung des Spiels sinnvoll umschreiben soll. Lasse ich den Dialog weg, ist die Unterredung zwischen zwei Figuren zu langatmig und schließt den Spieler hinter dem Bildschirm aus. Behalte ich ihn, habe ich im neuen Raum eine unsichtbare Figur.
« Letzte Änderung: 20. Mai 2012, 22:36:30 von Private »

Private

  • kleiner Tentakelsaugknopf
  • **
  • Beiträge: 22
    • Profil anzeigen
    • E-Mail
Re: Privates Fragethread
« Antwort #29 am: 20. Mai 2012, 23:59:19 »
habe es jetzt etwas unschön gelöst bekommen
function room_FirstLoad()
{
aMusic11.Play();
Wait(60);
 int transo;
 while (transo < 100) {
    transo++;
    player.Transparency = transo;
  }
 while (transo > 0) {
    transo--;
    player.Transparency = transo;
    Wait(1);
    aSound28.Play();
  }
player.Say("Was zum ...?");
Wait(30);

Wait(30);
}

warum nur funktioniert das jetzt, indem ich den charakter nach einem ausblendeprozess nochmal im neuen raum ausblende?