Autor Thema: mukks Fragethread ^^  (Gelesen 35716 mal)

mukk

  • kleiner Tentakel
  • ***
  • Beiträge: 145
  • Geschlecht: Männlich
    • Profil anzeigen
Re: mukks Fragethread ^^
« Antwort #90 am: 24. Mai 2011, 23:03:16 »
Folgendes Problem:

Sobald ich einem Charakter etwas geben will, wird erst das Script ausgeführt, das bei Use Inventory on Character eingetragen ist, danach (!) springt das Spiel in diese Zeile im GlobalScript:

[ags]string buffer;
    if (type == 2 || type == 6) FaceCharacter (GetPlayerCharacter (), GetCharacterAt (mouse.x, mouse.y));
[/ags]

die Zeile steht unter [ags]function unhandled_event (int xxx, int yyy)[/ags]

darüber steht ne Legende:
Zitat
//Check modes with: if(UsedAction(A_???)), check types by if(type==#). types:
    //1   a hotspot
    //2   a character
    //3   an objekt
    //4   an inventory item.
    //5   inv. item on hotspot
    //6   inv. item on character
    //7   inv. item on objekt
    //8   inv. item on inv. item
    // // You have the string "locationname" that is the name of
    // // what you clicked on, and the string "usedinvname" that is
    // // the name of the item that was used on where you clicked (only for types 5,6,7,8)
    // // REPLACE THIS SAMPLE INTERACTIONS WITH YOURS:

Das Spiel stürzt in dem Moment in dem er im oben genannten Script landet ab falls man die Maus bewegt, da dann ja der gesuchte Charakter nicht mehr unter der Maus ist. Und da AGS erst das Script aus UseInvOnChar ausführt, ist das mehr als wahrscheinlich.

Mein Script bei bspw. Britney sieht so aus:

[ags]function cBritney_UseInv()
{
MovePlayer (40, 130);
FaceCharacter (GetPlayerCharacter (), BRITNEY);

  if (BritneyInv==1)
  {
DisplaySpeech(BRITNEY,"Das will ich nicht.");
  }
  if (BritneyInv==0)
  {
DisplaySpeech(GetPlayerCharacter(),"Das brauch ich noch.");
  }
}[/ags]

Ich hab keine Ahnung, in wie weit ich dadran rumpfuschen darf oder warum er an der Stelle überhaupt in ein Script für unhandled events geht...kann mir da bitte jemand helfen?


Edit: Hab die Zeile jetzt einfach rausgenommen und es scheint alles zu laufen... kurios
« Letzte Änderung: 24. Mai 2011, 23:41:31 von mukk »
Each year, vegetarians bully animals,
cheat in relationships, watch porno and cause pollution.
So join the fight now and stop the vegetarians.

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: mukks Fragethread ^^
« Antwort #91 am: 25. Mai 2011, 00:41:46 »
Das ist schon bei Maniac Mansion Deluxe so schlampig programmiert gewesen, war aber kein Problem, da Charaktere nur das any_click-Event hatten.
Und da das Gib-Verb ein Spezialfall war, der separat behandelt wurde, wurde die entsprechende Zeile immer unmittelbar nach dem Klick auf den Charakter aufgerufen, d.h. man musste die Maus schon extrem schnell wegbewegen, um den null pointer error zu erzeugen.

Die alten Starterpacks aber sind so umgeschrieben, das Gib und Benutze UseInv aufrufen. Danach wird allerdings trotzdem any_click aufgerufen (das wird von AGS so gehandhabt und lässt sich nicht abstellen).
Wenn also UseInv eine Reaktion erzeugt, z.B. einen kurzen Dialog, dann ist die Maus danach natürlich längst sonstwo gelandet, und am ende von any_click wird dann schön brav Unhandled() aufgerufen, das jedoch den aktuell unter der Maus befindlichen Charakter verwenden möchte. Da ist jedoch in der Regel keiner mehr, und so entsteht der berühmt-berüchtigte Fehler.

Eine vernünftige Lösung muss somit verhindern, dass Unhandled ausgeführt wird, wenn die Aktion sehr wohl "gehandled" wurde, nämlich von UseInv.
Alternativ kann man Benutze und Gib auch wieder in any_click "handlen", dann fällt der Fehler ebenfalls weg.
Neuere Starterpacks haben vermutlich eine dieser Varianten bereits umgesetzt; das Problem hier ist auch, dass Du mit uraltem Code und wahrscheinlich entsprechend einem völlig veralteten AGS und Starterpack arbeitest.

Zum direkten Vergleich:
Alt:
[ags]  DisplaySpeech(GetPlayerCharacter(),"Das brauch ich noch.");[/ags]
Neu:[ags]  player.Say("Das brauch ich noch.");[/ags]

Das geht übrigens schon ab 2.7, d.h. Du musst Dich nicht an den neuen Editor gewöhnen; wenn Du bereits (hoffentlich) mit 2.72 arbeitest, dann würde ich Dir sehr empfehlen, auf neuen Code umzusteigen.

mukk

  • kleiner Tentakel
  • ***
  • Beiträge: 145
  • Geschlecht: Männlich
    • Profil anzeigen
Re: mukks Fragethread ^^
« Antwort #92 am: 25. Mai 2011, 01:41:51 »
Ähm...ja, ich benutze AGS 3.1 und scripte frei nach Frankenstein...kopieren und einfügen was ich grad brauche. Und da die Starter alle alt sind die ich benutze, ist der Code wild durcheinnander...aber s läuft ;)

Muss ich jetzt mit irgendwelchen Konsequenzen rechnen, wenn ich
[ags]string buffer;
    if (type == 2 || type == 6) FaceCharacter (GetPlayerCharacter (), GetCharacterAt (mouse.x, mouse.y));[/ags]
einfach rauslösche?

Alternativ kann man Benutze und Gib auch wieder in any_click "handlen", dann fällt der Fehler ebenfalls weg.

Das klappt nicht, hab ich mehrfach versucht...liegt vielleicht an den alten Startern?
« Letzte Änderung: 25. Mai 2011, 01:59:27 von mukk »
Each year, vegetarians bully animals,
cheat in relationships, watch porno and cause pollution.
So join the fight now and stop the vegetarians.

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: mukks Fragethread ^^
« Antwort #93 am: 25. Mai 2011, 04:25:58 »
Das Löschen sollte eigentlich keine negativen Folgen haben.

Um Benutze und Gib in any_click packen zu können, muss wahrscheinlich das GlobalScript umgeschrieben werden. Einfach "if (UsedAction(A_GIVE))" verwenden dürfte nicht funktionieren, nein.

Solange alles läuft, würd ich erst mal weitermachen; jetzt noch alles umschreiben macht wahrscheinlich wenig Sinn. :)

mukk

  • kleiner Tentakel
  • ***
  • Beiträge: 145
  • Geschlecht: Männlich
    • Profil anzeigen
Re: mukks Fragethread ^^
« Antwort #94 am: 19. Januar 2012, 18:47:36 »
woohoo, weiter gehts  8)

hab 2 fragen bezüglich des spielercharakters:

1. Kann man die steh-animation irgendwie animieren ohne die idle-animation auf dauerhaft zu stellen? Normal wird ja nur frame 0 der entsprechenden loop benutzt...also irgendwie die ersten 2 frames dafür reservieren o.ä.? Die idle-animation würd ich mir gern für was anderes aufheben

2. Ich benutz ein anderes Gui und möchte, dass sich das Inventar bei tastendruck (kein Problem) und bei Klick auf den Charakter öffnet. Der ist allerdings sehr fizzelig anzuklicken...lässt sich da der Hotspot irgendwie unabhängig vom Sprite festlegen?
Each year, vegetarians bully animals,
cheat in relationships, watch porno and cause pollution.
So join the fight now and stop the vegetarians.

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: mukks Fragethread ^^
« Antwort #95 am: 20. Januar 2012, 22:41:07 »
1. Nicht durch einen eingebauten Mechanismus; von Hand, also per script geht sowas i.d.R. immer.
Ich hab vor einem Jahr ein entsprechendes Modul gemacht: https://dl.dropbox.com/s/69fk4e4o7h7uokl/IdleIdle.scm?dl=1
Zum Benutzen einfach sowas in game_start:[ags]  player.SetIdleIdleView(3, 4, 10);[/ags]
Dann wird view 3 zum stehen genommen, und view 4 zum "idlen" nach 10 Sekunden.

2. Man kann global die Option "pixel-perfect click detection" deaktivieren. Dann wird bei jedem Charakter oder Object die Transparenz im Sprite ignoriert. Das wirst Du aber nicht wollen, schätze ich.
Alternativ könntest Du einen zweiten Charakter mit Transparenz = 99 verwenden, der dem Spieler per FOLLOW_EXACTLY folgt. Und dann player.Clickable auf false, und den zweiten für click-events hernehmen.

mukk

  • kleiner Tentakel
  • ***
  • Beiträge: 145
  • Geschlecht: Männlich
    • Profil anzeigen
Re: mukks Fragethread ^^
« Antwort #96 am: 21. Januar 2012, 17:01:07 »
Super, genau was ich brauchte  :-*

Ein kleines Problem: Die Idle-Animation setzt erst nach nach ner Sekunde oder so ein, und da sie recht schnell is fällt das doch ziemlich auf...kann man da was dran machen?
Each year, vegetarians bully animals,
cheat in relationships, watch porno and cause pollution.
So join the fight now and stop the vegetarians.

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: mukks Fragethread ^^
« Antwort #97 am: 22. Januar 2012, 02:55:34 »
Intern wird [ags]  this.SetIdleView(idle, 0);[/ags] verwendet, da kann man also leider nichts machen.

Probier doch bitte mal aus, ob diese Verzögerung unabhängig von meinem Modul auftritt.