Hauptmenü

Neuigkeiten:

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

Hilfe für Indy

Begonnen von Indy, 24. November 2007, 10:31:47

Vorheriges Thema - Nächstes Thema

KhrisMUC

Zitat von: Indy in 24. Dezember 2008, 09:52:39
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

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

Zitat von: KhrisMUC in 28. Dezember 2008, 20:13:28
Außerdem sollte MovePlayer benutzt werden, nicht .Walk.
So geht's:
Muss,nicht sollte.

KhrisMUC

Wer sagt das, Du?
Wenn man nicht MovePlayer benutzt, kann man das Hingehen nicht abbrechen, aber das wäre ein rein stilistischer "Fehler".

NsMn

Sicher,wenn man aber eNoBlock benutzt,wird das Script immer (oder nie?)ausgeführt, egal, ob der Charakter das Ziel erreicht hat.

KhrisMUC

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

Aber machst du nicht zur bedingung, dass man den Playercharakter zu bestimmten Koordinaten schickt? ???
Please don't feed trolls.

KhrisMUC

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

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: AGS3room26.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

da ist eine zeile

player.Say (Zumindest nicht jetzt...");

da fehlt das " am anfang  ;)
Schlachtaman Vibrations, UHYEAH!!!
_________________________________

>>>> Ende der Kommunikation <<<<

NsMn

Joah, und bei Push sind dafür 2 Davon  :P

KhrisMUC

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();       
}