Ich hab euch dann mal wieder ein paar meiner aktuellen Probleme zusammengesammelt:
#1
Ich möchte, dass wenn jemand in einem Raum eine Lampe anschaltet, der Hintergrund wechselt.
Hab das mit animiertem Background versucht, dessen Verzögerung ich testweise einfach mal auf -1 gestellt hatte, was dann aber automatisch zu 255 wurde. Nach längerer Beobachtung hab ich aber festgestellt, dass die Hintergründe auch da nicht automatisch zu wechseln scheinen. Sollte jemand das Gegenteil wissen und ich Gefahr laufen, dass dem Spieler das Licht während einer längeren Pinkelpause von selbst angeht, dann lasst es mich wissen.
Jedenfalls wird beim Eintritt in den Raum die entsprechende GI der Lampe überprüft und die (offenbar eingefrorene) Animation auf das passende Frame gesetzt.
Wenn man allerdings schon im Raum ist und die Lampe an- / ausschaltet, passiert bislang nichts, weil ich dafür noch keine Lösung gefunden hat.
Die Lampe befindet sich im Inventar, Interaktion wird demnach im Global Script behandelt. Die Änderung des Hintergrund-Frames funktioniert aber nur im Room-Script.
Ich hoffe, ihr wisst was ich meine. AGS hab ich auf dem Laptop und gerade nicht hier, deshalb kann ich mein Script nicht reinkopieren. Notfalls liefer ich das noch nach.
Ich wäre natürlich auch für eine alternative Lösung des Problems dankbar, denn ich denke mal, dass das eines ist, was schon für viele Adventures gelöst wurde.
#2
Eigentlich nur eine kurze Frage:
Gibt es für Objects auch irgendwie die Möglichkeit, einen WalkTo-Point festzulegen oder muss ich das im jeweiligen Script per Walk() selber behandeln?
#3
Ich hab ein "fliegendes Objekt" gerade als Character realisiert, das ich am Himmel über Walk mit eAnywhere bewege. Jedoch bewegte es sich viel zu schnell.
Hab daraufhin an der Speed-Eigenschaft herumgespielt, aber egal , was dort eingetragen war (hab zwischen -99 und 999 alles mögliche probiert), es änderte sich nichts.
Bin ich zu blöde oder geht das aus irgendeinem bestimmten Grund nicht?
Oder sollte ich das ganze vielleicht ganz schnell vergessen und durch ein animiertes Object ersetzen?
Script-Probleme
- AlphaBolley
- Verpackungs-Wegwerfer
- Beiträge: 53
- Registriert: 07.03.2006, 15:52
- Wohnort: Iserlohn
- Kontaktdaten:
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
#1:
Sobald der Hintergrund mit SetBackgroundFrame(x); auf 0, 1, 2, 3 oder 4 gesetzt wurde, bleibt's dabei. Die Animation geht erst wieder bei einem SetBackgroundFrame(-1); los.
Zwei Möglichkeiten:
1.: Du gibst dem Raum eine repeatedly_execute, indem Du das i bei Settings anklickst und bei Repeatedly execute eine RunScript-Interaction einfügst.
Dort schreibst Du Folgendes rein:
2.: Füge dem Raumskript folgendes hinzu:
Bei der Interaktion mit der Lampe rufst Du dann CallRoomScript(x); auf. Du musst hierbei nicht überprüfen, ob sich der Spieler im entsprechenden Raum befindet, da AGS den CallRoomScript()-Befehl ignoriert, wenn der Raum keine on_call() hat.
Logischerweise musst Du deswegen auch bei weiteren Räumen, in denen man die Lampe benutzen kann, nur die on_call()-Funktion einfügen.
#2:
Das kannst Du über die Custom properties machen.
Geh zu Room -> Objects, klick auf den Button "Properties" und erstelle zwei neue properties vom Typ "Number". Als Namen verwendest Du "x" und "y", als Beschreibung kannst Du irgendwas eintragen, z.B. "WalkTo-X von Objekten", als Default value würde ich -1 eintragen.
Schließe jetzt den Schema Editor und trage bei allen Objekten die Koordinaten ein.
Auf diese kannst Du jetzt mit Object.GetProperty("x") und Object.GetProperty("y") zugreifen.
#3:
Falls dieses fliegende Objekt in mehreren Räumen zu sehen sein wird, ist es sinnvoll, einen Character zu verwenden, ansonsten würde ich ein Object nehmen.
Aber bleiben wir beim Character:
Es gibt zwei Speed-Einstellungen, Speed und Animation speed. Lustigerweise ist keines der beiden eine Geschwindigkeit.
Sagen wir, AGS soll einen Charakter, der bei den Koordinaten (100:150) steht, nach (200:150) bewegen, also 100 Pixel nach rechts. AGS nimmt die X-Koordinate, zählt den (X-)Speed dazu und stellt das erste Frame des walk cycles dar. Jetzt wartet AGS soviele gameloops, wie in Animation speed eingestellt ist. Nun wird erneut der (X-)Speed zur X-Koordinate dazugezählt und das zweite Frame des walk cycles dargestellt. Dann wartet AGS erneut die Anzahl gameloops, die durch Animation speed festgesetzt wurde, usw., usw., bis der Charakter bei (200:150) angekommen ist.
Angenommen, der Speed ist 4, und der Animation speed 2. Normalerweise hat eine Sekunde 40 gameloops, d.h. pro Sekunde bewegt AGS den Charakter 20x (40/2) um 4 Pixel nach rechts, macht also 80 Pixel pro Sekunde. Der Charakter würde also 4 Sekunden für die komplette (320er-)Bildschirmbreite brauchen.
Würde man den Animation speed auf 1 herabsetzen, verdoppelt sich die Geschwindigkeit, da AGS zwischen zwei Bewegungen nur noch 1/40 Sekunde statt 2/40 Sekunden wartet.
Setzt man dagegen den Speed herab, wird der Charakter langsamer, da er jetzt in der gleichen Zeit weniger Pixel zurücklegt.
Wenn Du also Deinen Charakter langsamer werden lassen möchtest, setze speed auf 1 und Animation speed auf 10, dann arbeite dich langsam Richtung 1 herunter, bis die Geschwindigkeit passt.
Zum Schluß noch ein allgemeiner Hinweis zu den Speeds:
Sehr oft sieht man in Fanadventures, dass die Figur moonwalkt oder über den Boden rutscht. Das lässt sich relativ leicht vermeiden.
Man muss seine walk cycle-Frames so pixeln, dass die Füße sich von Frame zu Frame immer um die gleiche Anzahl Pixel nach hinten bewegen, z.B. 4. Dann stellt man genau diese Zahl bei Speed ein und rührt sie nicht mehr an.
Die Geschwindigkeit des Charakters stellt man jetzt nur noch mit Animation speed ein.
Sobald der Hintergrund mit SetBackgroundFrame(x); auf 0, 1, 2, 3 oder 4 gesetzt wurde, bleibt's dabei. Die Animation geht erst wieder bei einem SetBackgroundFrame(-1); los.
Zwei Möglichkeiten:
1.: Du gibst dem Raum eine repeatedly_execute, indem Du das i bei Settings anklickst und bei Repeatedly execute eine RunScript-Interaction einfügst.
Dort schreibst Du Folgendes rein:
Code: Alles auswählen
if (GetGlobalInt(x)==1) SetBackgroundFrame(a);
else SetBackgroundFrame(b);
Code: Alles auswählen
function on_call (int value) {
if (value==1) SetBackgroundFrame(a);
if (value==2) SetBackgroundFrame(b);
}
Logischerweise musst Du deswegen auch bei weiteren Räumen, in denen man die Lampe benutzen kann, nur die on_call()-Funktion einfügen.
#2:
Das kannst Du über die Custom properties machen.
Geh zu Room -> Objects, klick auf den Button "Properties" und erstelle zwei neue properties vom Typ "Number". Als Namen verwendest Du "x" und "y", als Beschreibung kannst Du irgendwas eintragen, z.B. "WalkTo-X von Objekten", als Default value würde ich -1 eintragen.
Schließe jetzt den Schema Editor und trage bei allen Objekten die Koordinaten ein.
Auf diese kannst Du jetzt mit Object.GetProperty("x") und Object.GetProperty("y") zugreifen.
#3:
Falls dieses fliegende Objekt in mehreren Räumen zu sehen sein wird, ist es sinnvoll, einen Character zu verwenden, ansonsten würde ich ein Object nehmen.
Aber bleiben wir beim Character:
Es gibt zwei Speed-Einstellungen, Speed und Animation speed. Lustigerweise ist keines der beiden eine Geschwindigkeit.
Sagen wir, AGS soll einen Charakter, der bei den Koordinaten (100:150) steht, nach (200:150) bewegen, also 100 Pixel nach rechts. AGS nimmt die X-Koordinate, zählt den (X-)Speed dazu und stellt das erste Frame des walk cycles dar. Jetzt wartet AGS soviele gameloops, wie in Animation speed eingestellt ist. Nun wird erneut der (X-)Speed zur X-Koordinate dazugezählt und das zweite Frame des walk cycles dargestellt. Dann wartet AGS erneut die Anzahl gameloops, die durch Animation speed festgesetzt wurde, usw., usw., bis der Charakter bei (200:150) angekommen ist.
Angenommen, der Speed ist 4, und der Animation speed 2. Normalerweise hat eine Sekunde 40 gameloops, d.h. pro Sekunde bewegt AGS den Charakter 20x (40/2) um 4 Pixel nach rechts, macht also 80 Pixel pro Sekunde. Der Charakter würde also 4 Sekunden für die komplette (320er-)Bildschirmbreite brauchen.
Würde man den Animation speed auf 1 herabsetzen, verdoppelt sich die Geschwindigkeit, da AGS zwischen zwei Bewegungen nur noch 1/40 Sekunde statt 2/40 Sekunden wartet.
Setzt man dagegen den Speed herab, wird der Charakter langsamer, da er jetzt in der gleichen Zeit weniger Pixel zurücklegt.
Wenn Du also Deinen Charakter langsamer werden lassen möchtest, setze speed auf 1 und Animation speed auf 10, dann arbeite dich langsam Richtung 1 herunter, bis die Geschwindigkeit passt.
Zum Schluß noch ein allgemeiner Hinweis zu den Speeds:
Sehr oft sieht man in Fanadventures, dass die Figur moonwalkt oder über den Boden rutscht. Das lässt sich relativ leicht vermeiden.
Man muss seine walk cycle-Frames so pixeln, dass die Füße sich von Frame zu Frame immer um die gleiche Anzahl Pixel nach hinten bewegen, z.B. 4. Dann stellt man genau diese Zahl bei Speed ein und rührt sie nicht mehr an.
Die Geschwindigkeit des Charakters stellt man jetzt nur noch mit Animation speed ein.
Use gopher repellent on funny little man
- AlphaBolley
- Verpackungs-Wegwerfer
- Beiträge: 53
- Registriert: 07.03.2006, 15:52
- Wohnort: Iserlohn
- Kontaktdaten:
- Rayman
- Logik-Lord
- Beiträge: 1388
- Registriert: 07.01.2006, 20:08
Hallo,
ich weiß, das hier im Forum noch so ein andere Thread mit der einen Frage ist, wo ich die Antwort wissen will, aber da ich den nicht mehr finden konnte hatte ich diesen alten Thread hier aufgemacht.
Die Frage ist für mich sehr, sehr, sehr wichtig.
Wie muss man bei einer Tür Scripten, dass man mit einem Schlüssel sie auf- und abschließen kann?
Ich hatte es mit GlobalInts versucht, aber wahrscheinlich habe ich nur falsche Kombinationen verwendet oder es muss mit einem einfacheren Script gehn.
ich weiß, das hier im Forum noch so ein andere Thread mit der einen Frage ist, wo ich die Antwort wissen will, aber da ich den nicht mehr finden konnte hatte ich diesen alten Thread hier aufgemacht.
Die Frage ist für mich sehr, sehr, sehr wichtig.
Wie muss man bei einer Tür Scripten, dass man mit einem Schlüssel sie auf- und abschließen kann?
Ich hatte es mit GlobalInts versucht, aber wahrscheinlich habe ich nur falsche Kombinationen verwendet oder es muss mit einem einfacheren Script gehn.