Maniac Mansion Mania Forum

MMM-Werkzeugkiste => Technik => Tutorials => Thema gestartet von: 1mal_volltanken am 26. September 2010, 18:21:10

Titel: Der Schraubertipps-Thread
Beitrag von: 1mal_volltanken am 26. September 2010, 18:21:10
Hallo Leutz!

Ich mach hier mal ein Thread auf, wo Ihr alle irgendwelche Kniffe verraten könnt, die das allgemeine arbeiten mit AGS beschleunigen und vereinfachen. Es können wirklich Dinge sein, die sonst kaum irgendwo zu lesen sind, aber durch eigenes Tüfteln selbst herausgefunden habt.

Ich mach mal einen Anfang:

Walkbehind oder Object?

Leider hat AGS ja keine Zoom-Funktion für die Feinarbeit der Areas. Deswegen muss man insbesondere bei Walkbehinds, die sehr viel Feinarbeit erfordern, mit der Nase ganz an den Monitor ran, um das Einzeichnen dieser Areas genau hinzukriegen.
Deswegen habe ich den Tipp, Walkbehinds bei Gegenständen anzuwenden, die einen Charakter von geometrischen Formen haben (Bsp. Schrank, Schreibtisch, etc.).
Bei Gegenständen, die unregelmäßige Formen haben, wie bspw. Treppengeländer und Brüstungen mit geschwungenen Säulen, Pflanzen im Vordergrund, etc. ist es einfacher, diese als Objekte einzusetzen, da man sich dadurch die Feinarbeit erspart. Sofern man davon ausgehen kann, dass die benötigten Objekte für einen Room das Maximum von 20 nicht ausschöpfen werden, kann man zum Zweck der Einfachheit auch mal zwei, drei Objekte opfern! ;)



Mitnehmbare oder bewegliche Objects in Schränken, Truhen oder hinter sonstigen Hindernissen

Auch hier lässt sich einiges an Arbeit sparen, wenn man die Hintergründe mit Schränken im OFFENEN(!) Urzustand zeichnet. Die Schranktür kann man danach als Object draufsetzen. Nun kann man die Objects, die den Schrankinhalt darstellen, zuerst im Schrank einsortieren und ZUM SCHLUSS, setzt man die Schranktür dort rüber. Wichtig ist, dass die Baseline von der Schranktür unterhalb der anderen Objekte, die sich im Schrank befinden, gesetzt wird.

Damit kann man sich die mühseligen Programmierungen a la

if AlteBatterienimKuehlschrank == true  ObjectOn(6);

mit dem ganzen Drumherum sparen und braucht für den PickUp-Befehl nur noch mit dem ObjectOff arbeiten. Das lässt sich natürlich auf alle ähnlichen Varianten transferieren, indem man Hintergründe ohne Hindernisse zeichnet und verdeckende Gegenstände als Objects eingesetzt werden.


Nun, Ihr kennt doch sicher auch noch Kniffe. Tut sie hier rein! ;)


BG
der Volltanker


Titel: Re: Der Schraubertipps-Thread
Beitrag von: NsMn am 26. September 2010, 18:23:51
Leider hat AGS ja keine Zoom-Funktion für die Feinarbeit der Areas.

Hat es wohl!  :o
Titel: Re: Der Schraubertipps-Thread
Beitrag von: Tribble am 26. September 2010, 18:37:07
Aber erst ab Version 3, aber die benutzt ja kein normaler Mensch.

Der Trick mit dem Schrank ist nicht schlecht. Das Problem hierbei ist aber, dass man neben der geschloßenen Tür ein weiteres Object für die offene Tür braucht (oder man muss skripten dass das Türobjekt ständig Aussehen und Position verändert, was auch nicht einfacher ist).

Meine Methode, um zu verhindern dass man beim wiederholten öffnen von Schränken Gegenstände doppelt und dreifach bekommt sieht daher etwas anders aus:
Erstmal bleibt alles beim alten: Wenn ich den Schrank öffne werden die objekte 'offener Schrank' und 'Inhalt' eingeschaltet, und beide werden ausgeschaltet wenn man ihn schließt.
Wenn ich den Inhalt nun nehme schalte ich das entsprechende Objekt nicht aus, sondern verschiebe nur die Baseline so, dass es nun von dem Schrank verdeckt wird (für den Spieler sieht es so aus, als währe es weg).
Wenn ich den Schrank nun nochmal öffne wird der Inhalt zwar technisch wieder eingeschaltet, aber da der Spieler ihn weder sehen und anklicken kann muss ich mich darum nicht weiter kümmern.
Titel: Re: Der Schraubertipps-Thread
Beitrag von: NsMn am 26. September 2010, 18:41:13
KhrisMUC hätte seine Freude an dem Thread, ich sag's ich jetzt schon, falls er doch mal wieder auftaucht.
Titel: Re: Der Schraubertipps-Thread
Beitrag von: fireorange am 26. September 2010, 19:04:19
Damit kann man sich die mühseligen Programmierungen a la

if AlteBatterienimKuehlschrank == true  ObjectOn(6);[/color]

Dafür nutze ich normalerweise GlobalInts. ;)

Das mit den Objekten ist eine Methode, aber ich persönlich bevorzuge doch die Detailarbeit beim Einzeichnen von Walkbehinds, weil ich Objekte im Übermaß dann irgendwo unübersichtlich finde. Außerdem finde ich es so einfacher. Aber ist wohl Geschmackssache.
Titel: Re: Der Schraubertipps-Thread
Beitrag von: Domi am 26. September 2010, 19:07:26
@FO mach ich auch mit gis
Titel: Re: Der Schraubertipps-Thread
Beitrag von: Endres am 28. September 2010, 17:42:50
GIs und ObjectOn und so ist uncool...
Übrigens. Für das mit den Objekten und Walkbehinds gibt es in AGS 3 auch eine neue Lösung: Masken importieren. Damit kann man die Masken mit einem Grafikprogramm was auch Farbpaletten kann ( ;D - so ziemlich jedes außer Paint) malen und einfach importieren. Bei sehr detailreichen Masken mache ich das mittlerweile auch so.
Titel: Re: Der Schraubertipps-Thread
Beitrag von: Domi am 28. September 2010, 17:44:44
Zitat
Aber erst ab Version 3, aber die benutzt ja kein normaler Mensch.
ich benutz auch ags 3.1.2 und bin normal.
Titel: Re: Der Schraubertipps-Thread
Beitrag von: ManiacTwister am 29. September 2010, 03:07:14
Zitat
Aber erst ab Version 3, aber die benutzt ja kein normaler Mensch.
ich benutz auch ags 3.1.2 und bin normal.


[OT][SPAM] Es wunder mich wirklich das darauf noch kein Kommentar kam...[/SPAM][/OT]
Titel: Re: Der Schraubertipps-Thread
Beitrag von: fireorange am 29. September 2010, 19:13:35
Extra für Domi:

Telefon- und Codeeingabe ohne großes Skriptwissen

Wir nehmen zum Beispiel die Nummer oder Kombination 1234. Dafür brauchen wir vier Räume, die jeweils das Tastenfeld anzeigen. Jedes Tastenfeld ist ein Hotspot (oder Objekt). Wenn man sie anklickt (AnyClick) wird man je nach Richtigkeit der Zahl entweder zurück in den ersten Raum befördert oder in den nächsten Raum. Wenn man zum Beispiel in Raum 2 auf die 5 klickt, muss der Befehl NewRoom(1); einsetzen, evtl. noch ein schriller Sound dazu. Beim Hotspot zur Nummer 2 muss NewRoom(3); stehen, evtl. ein Erfolgssound dazu. Als Zusatz könnte man noch einen Reset-Button einbauen, der den Spieler zurück in Raum 1 befördert.
Titel: Re: Der Schraubertipps-Thread
Beitrag von: Domi am 29. September 2010, 21:00:46
THX fo aber timer hats mir schon zukommen lassen
Titel: Re: Der Schraubertipps-Thread
Beitrag von: KhrisMUC am 30. September 2010, 15:05:04
Wundert wohl keinen, dass ich nicht mehr so oft hier herein schaue, oder? :P

Tribble's Kommentar kann ich im Übrigen unterstreichen; warum sollte man auch ein kostenloses Android-Touchscreen-Smartphone benutzen, mit dem Nokia 5110 kann man ja auch telefonieren, ne? (Achja, weil der Akku schlappmacht, das Display zu klein ist und schwarz-grün, ich keine Apps installieren kann, es nicht mit Sync-Software zusammenarbeitet, der Empfang schlechter ist, ich keine Fotos machen kann, etc. etc. etc.)

Ein gutes Argument für den Wechsel wäre, dass die Anzahl der Leute, die einem bei 2.X-Problemen helfen, mit Sicherheit immer weiter abnimmt; außerdem sind in alten AGS-Versionen bugs drin, die bei 3.X natürlich längst ausgemerzt sind.
Das muss aber jeder selber wissen; ich fand 3.0 anfangs auch ungewohnt, mittlerweile bin ich aber drin und könnte nie mehr zurück.

Um auch noch was zum Thema beizutragen:
Der Trick mit dem Schrank ist nicht schlecht. Das Problem hierbei ist aber, dass man neben der geschloßenen Tür ein weiteres Object für die offene Tür braucht (oder man muss skripten dass das Türobjekt ständig Aussehen und Position verändert, was auch nicht einfacher ist).

Wenn man um die Grafiken der geschlossenen und offenen Tür entsprechend angepasste Transparenz läßt, muss man nur die Grafik wechseln.
Wenn die slots z.B. die Nummern 67 und 68 haben, geht das mit:
  oSchranktuer.Graphic = 135 - oSchranktuer.Graphic;Eine simple Zeile, und alles läuft einwandfrei.
Titel: Re: Der Schraubertipps-Thread
Beitrag von: Rocco am 30. September 2010, 16:28:30
soweit ich weiss hat man aber dann das Problem, dass man den Labeltext von zB. geschlossene Schranktür nicht auf offene Schranktür ändern kann,
oder geht das mittlerweile?
Titel: Re: Der Schraubertipps-Thread
Beitrag von: KhrisMUC am 30. September 2010, 16:42:59
Das kann man tricksen; man muss halt Code in TranslateAction packen. Man könnte das auch als Modul auslagern.
Außerdem kann man den Namen auch bei "Schranktür" belassen, ob sie offen oder geschlossen ist, sieht man ja deutlich. ;)
Titel: Re: Der Schraubertipps-Thread
Beitrag von: Rocco am 30. September 2010, 17:09:11
das ist halt eine grundsätzliche Designentscheidung.
Ich arbeite grade an einem Projekt, wo man es nicht so gut sieht und mich deswegen mit einzelnen Objekten herumärgere, nur damit der richtige Labeltext angezeigt wird.
Das einfachste wäre da den Hotspotlabeltext zu ändern, aber das geht halt leider nicht einfach so.  :'(

kannst du mir da vielleicht ein konkretes Beispiel geben, wie man das umgehen kann um auch bei Grafikswitches den richtigen Labeltext zu sehen.
(Ein Modul dafür wäre natürlich ideal.  ;D)
Titel: Re: Der Schraubertipps-Thread
Beitrag von: KhrisMUC am 01. Oktober 2010, 14:54:39
Ein Modul muss gar nicht sein, das würde ich nur der Aufgeräumtheit halber benutzen.

Im Grunde ist es sehr simpel:
In TranslateAction folgende Zeile einfügen (bei mir Zeile 138):

  objekt = OtherName(objekt);
Dann diese Funktion benutzen:

String OtherName(String objekt) {
  int r = player.Room;
  int mx = mouse.x;
  int my = mouse.y;
 
  int c = -1, h = -1, o = -1;
 
  int lt = GetLocationType(mx, my);
  if (lt == eLocationCharacter) {
    Character*cp = Character.GetAtScreenXY(mx, my);
    if (cp != null) c = cp.ID;
  }
  if (lt == eLocationHotspot) {
    Hotspot*hp = Hotspot.GetAtScreenXY(mx, my);
    if (hp.ID > 0) h = hp.ID;
  }
  if (lt == eLocationObject) {
    Object*op = Object.GetAtScreenXY(mx, my);
    if (op != null) o = op.ID;
  }
 
  // Raum 2
  if (r == 2) {
    if (h == 1 && books_wet) objekt = "nasse Bücher";
  }
 
  return objekt;
}

Im Beispiel habe ich einen alternativen Text für Hotspot 1 in Raum 2, falls books_wet == true.

(Der ganze Aufwand mit GetAtScreenXY ist übrigens nicht nötig, wenn die Gegenstände eindeutige Namen haben. Gibt es aber z.B. mehrere Spinde, von denen einer irgendwann "kaputter Spind" heißen soll, muss man natürlich zwischen IDs unterscheiden.

Wenn es aber z.B. im ganzen Spiel nur einen Rubin gibt, der später "Blutrubin" heißen soll, reicht:
  if (objekt == "Rubin" && ruby_is_bloody) return "Blutrubin";)

Auf die gleiche Weise kann man natürlich auch den Verbtext ändern.
Titel: Re: Der Schraubertipps-Thread
Beitrag von: Rocco am 01. Oktober 2010, 15:09:56
Danke, was ich vielleicht dazusagen hätte sollen ist, das ich da kein MMM-Starterpack verwende.  :-\
Bin deswegen auch gestern auf der Leitung gestanden was du mit TranslateAction meinst, weil ich so einen Befehl von AGS nicht kannte.
Werd mir das aber genau anschauen, vielleicht kann ich es extrahieren und trotzdem in mein Projekt einbauen.

PS: So ein generelles Modul wäre aber nicht verkehrt, das könnten sicher mehr Entwickler brauchen.
http://www.bigbluecup.com/yabb/index.php?topic=41245.msg545803#msg545803
Titel: Re: Der Schraubertipps-Thread
Beitrag von: KhrisMUC am 01. Oktober 2010, 16:24:30
Achso, ich nehme an, Du verwendest ein label mit "@OVERHOTSPOT@"?
Das Prinzip ist dasselbe, Du legst den Text manuell fest und änderst ihn gegebenenfalls.

Wie gesagt, man kann das als Modul machen, aber es ist bisschen blöd, den alternativen Text in einer allgemeinen Form einzubauen.
Man muss ja irgendwie das Objekt/den Hotspot/etc. mit einer Variablen verknüpfen; das geht immer noch am leichtesten, wenn man es if-Zeilenweise in eine Funktion schreibt.
Titel: Re: Der Schraubertipps-Thread
Beitrag von: Rocco am 04. Oktober 2010, 10:41:13
Super danke, das Prinzip habe ich verstanden, damit weiss ich jetzt wie ich das einbauen kann.  ;D