Autor Thema: Hilfe für Indy  (Gelesen 20005 mal)

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Hilfe für Indy
« Antwort #45 am: 28. Dezember 2008, 20:13:28 »
Ich habe ein neues Problem:

Ich habe als Hotspot eine Tür und das Script für AnyClickOn Hotspot sieht folgendermaßen aus:

if (UsedAction (A_OPEN))
{
if (player.Walk (120,124,eBlock,eWalkableAreas))
{
FaceDirection (player.ID,DIR_UP);
Wait (5);
ObjectOn (0);
PlaySound(1);
}

etc.

Hat sich anscheinend immer noch nicht rumgesprochen, aber diese Schreibweise ist viel zu umständlich. Außerdem sollte MovePlayer benutzt werden, nicht .Walk.
So geht's:

  if (MovePlayer(120, 124)) {
    player.FaceDirection(eDirUp);
    Wait (5);

    if (UsedAction(eActOpen)) {
      ObjectOn (0);
      PlaySound(1);
      ...
    }

    if (UsedAction(eActClose)) {
      ...
    }

    ...

    else Unhandled();
  }

Bei Türen gibt es außerdem die Funktion any_click_on_door(), welche zumindest öffnen und schließen automatisch erledigt.
Wie die enums für die Verben und Richtungen heißen, steht in der Beschreibung des Starterpacks. Das ist aber eine Entscheidung des Autors und hat nichts mit AGS 3 zu tun.

Indy

  • volljähriger Tentakel
  • *****
  • Beiträge: 725
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Hilfe für Indy
« Antwort #46 am: 28. Dezember 2008, 20:43:47 »
Ich muss sagen, durch meine Art blicke ich mehr durch. Ich versteh bei dir schon die erste Zeile nicht.
Please don't feed trolls.

NsMn

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1646
  • Geschlecht: Männlich
  • überzeugter Paint-Nutzer
    • ICQ Messenger - 404385098
    • Profil anzeigen
    • E-Mail
Re: Hilfe für Indy
« Antwort #47 am: 28. Dezember 2008, 20:51:07 »
Außerdem sollte MovePlayer benutzt werden, nicht .Walk.
So geht's:
Muss,nicht sollte.

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Hilfe für Indy
« Antwort #48 am: 28. Dezember 2008, 21:16:12 »
Wer sagt das, Du?
Wenn man nicht MovePlayer benutzt, kann man das Hingehen nicht abbrechen, aber das wäre ein rein stilistischer "Fehler".

NsMn

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1646
  • Geschlecht: Männlich
  • überzeugter Paint-Nutzer
    • ICQ Messenger - 404385098
    • Profil anzeigen
    • E-Mail
Re: Hilfe für Indy
« Antwort #49 am: 29. Dezember 2008, 10:53:15 »
Sicher,wenn man aber eNoBlock benutzt,wird das Script immer (oder nie?)ausgeführt, egal, ob der Charakter das Ziel erreicht hat.

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Hilfe für Indy
« Antwort #50 am: 29. Dezember 2008, 11:02:56 »
Er hat aber eBlock benutzt.

Indy:
MovePlayer ist seit Angedenken der Befehl, mit dem man den player zu den Koordinaten schickt. Er bewirkt, dass man während des Hinlaufens woanders klicken und so die Aktion abbrechen kann, genau wie bei den Scumm-Spielen.
Ansonsten hab ich nur die neuen enums benutzt, aber viel wichtiger: die Reihenfolge umgedreht: erst schicke ich den player zu den Koordinaten, lasse ihn in die Richtung schauen und handle dann entsprechend des verwendeten Verbs, sonst muss ich doch, wie Du es gemacht hast, bei jedem Verb den ganzen Move-Face-Wait-Sums schreiben.
Der Rest ist gleich geblieben.

Indy

  • volljähriger Tentakel
  • *****
  • Beiträge: 725
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Hilfe für Indy
« Antwort #51 am: 29. Dezember 2008, 13:25:39 »
Aber machst du nicht zur bedingung, dass man den Playercharakter zu bestimmten Koordinaten schickt? ???
Please don't feed trolls.

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Hilfe für Indy
« Antwort #52 am: 29. Dezember 2008, 13:47:00 »
So soll es ja sein:
MovePlayer schickt den player los; während er läuft, kann man jedoch was anderes anklicken.
Wenn man das tut, liefert MovePlayer 0 zurück, die Aktion wird abgebrochen.
Klickt man nichts anderes an, erreicht der player sein Ziel, MovePlayer liefert 1 zurück und erst dann wird das Verb abgefragt.

Dich irritiert wahrscheinlich, dass MovePlayer intern eine Schleife laufen hat und die if-Abfrage erst nach ein paar Sekunden entscheidet, ob sie wahr oder falsch ist.
Wenn sich in einer if-Bedingung mindestens eine Funktion befindet, wird mit der Verarbeitung solange pausiert, bis alle Funktionen ihre Werte zurückgeliefert haben und entschieden werden kann, ob wahr oder falsch herauskommt. Im Falle von MovePlayer dauert das halt ein bisschen.

Indy

  • volljähriger Tentakel
  • *****
  • Beiträge: 725
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Hilfe für Indy
« Antwort #53 am: 24. Januar 2009, 12:21:46 »
function hotspot2_a() {
  // script for hotspot2: Any click on hotspot
if (UsedAction (eActWalkTo))
{
 if (MovePlayer (65,127))
 {
  player.FaceDirection (eDirUp);
 }
}
else if (UsedAction (eActOpen))
{
 if (MovePlayer (65,127))
 {
  player.FaceDirection (eDirUp);
  player.Say ("Ichgehe doch nicht an fremde Kühlschränke.");
  Wait (5);
  player.Say (Zumindest nicht jetzt...");
 }
}
else if (UsedAction (eActLookAt))
{
 if (MovePlayer (65,127))
 {
  player.FaceDirection (eDirUp);
  DisplaySpeech(GetPlayerCharacter(),"Der Kühlschrank der Millers.");
 }
}
else if (UsedAction (eActUse))
{
 if (MovePlayer (65,127))
 {
  player.FaceDirection (eDirUp);
  player.Say ("Ja und wie?");
 }
}
else if (UsedAction (eActPush))
{
 if (MovePlayer (65,127))
 {
  player.FaceDirection (eDirUp);
  player.Say (""Nein Danke.");
 }
}
else if (UsedAction (eActPull))
{
 if (MovePlayer (65,127))
 {
  player.FaceDirection (eDirUp);
  player.Say ("Nein Danke.");
 }
}
else if (UsedAction (eActClose))
{
 if (MovePlayer (65,127))
 {
  player.FaceDirection (eDirUp);
  player.Say ("Der ist schon zu.");
 }
}
else if (UsedAction (eActPickUp))
{
 if (MovePlayer (65,127))
 {
  player.FaceDirection (eDirUp);
  player.Say ("Statt mich hier schuften zu lassen solltest du dich lieber beeilen.");
  player.Say ("Eigentlich wollte ich ja schon längst am Strand surfen...");
 }
}
else Unhandled ();       
}

in der Zeile "if (MovePlayer (...))" unter der Aktion Push soll ein Fehler sein.
Zitat von: AGS3
room26.asc(41): Error (line 41): buffer exceeded: you probably have a missing closing bracket on a previous line
Ich finde nirgends eine Zeile, an der ich eine Klammer vergessen haben soll.
Please don't feed trolls.

Bòógieman

  • International anerkannter Superheld
  • Globaler Moderator
  • alter Tentakel
  • *****
  • Beiträge: 2665
  • Geschlecht: Männlich
  • Grün Tentakel = Running Sushi!
    • Profil anzeigen
Re: Hilfe für Indy
« Antwort #54 am: 24. Januar 2009, 13:55:23 »
da ist eine zeile

player.Say (Zumindest nicht jetzt...");
da fehlt das " am anfang  ;)
Schlachtaman Vibrations, UHYEAH!!!
_________________________________

>>>> Ende der Kommunikation <<<<

NsMn

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1646
  • Geschlecht: Männlich
  • überzeugter Paint-Nutzer
    • ICQ Messenger - 404385098
    • Profil anzeigen
    • E-Mail
Re: Hilfe für Indy
« Antwort #55 am: 24. Januar 2009, 14:40:23 »
Joah, und bei Push sind dafür 2 Davon  :P

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Hilfe für Indy
« Antwort #56 am: 24. Januar 2009, 20:44:08 »
Und hier die korrigierte Kurzfassung:
function hotspot2_a() {

  if (MovePlayer(65,127) != 1) return;  // nicht angekommen -> aussteigen
  player.FaceDirection(eDirUp);

  if (UsedAction(eActOpen))
  {
    player.Say("Ich gehe doch nicht an fremde Kühlschränke.");
    Wait(5);
    player.Say("Zumindest nicht jetzt...");
  }

  else if (UsedAction(eActLookAt))
    player.Say("Der Kühlschrank der Millers.");

  else if (UsedAction(eActUse))
    player.Say("Ja und wie?");

  else if (UsedAction(eActPush) || UsedAction(eActPull))
    player.Say("Nein Danke.");

  else if (UsedAction(eActClose))
    player.Say("Der ist schon zu.");

  else if (UsedAction(eActPickUp))
  {
    player.Say("Statt mich hier schuften zu lassen solltest du dich lieber beeilen.");
    player.Say("Eigentlich wollte ich ja schon längst am Strand surfen...");
  }

  else Unhandled();       
}