Maniac Mansion Mania Forum
MMM-Werkzeugkiste => Technik => Tutorials => Thema gestartet 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
-
Leider hat AGS ja keine Zoom-Funktion für die Feinarbeit der Areas.
Hat es wohl! :o
-
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.
-
KhrisMUC hätte seine Freude an dem Thread, ich sag's ich jetzt schon, falls er doch mal wieder auftaucht.
-
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.
-
@FO mach ich auch mit gis
-
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.
-
Aber erst ab Version 3, aber die benutzt ja kein normaler Mensch.
ich benutz auch ags 3.1.2 und bin normal.
-
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]
-
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.
-
THX fo aber timer hats mir schon zukommen lassen
-
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.
-
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?
-
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. ;)
-
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)
-
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.
-
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
-
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.
-
Super danke, das Prinzip habe ich verstanden, damit weiss ich jetzt wie ich das einbauen kann. ;D