Clonk-Center Titelbild

Texte / VHVST




Valles hoffnunslos verschrobene Script Tutorials
Teil I: Parallax

Wie ihr vielleicht wisst, arbeite ich jetzt seit über einem Jahr an Vampire Hunt,
wobei ich immer wieder auf mit völlig unbekannte Scriptfunktionen und Möglichkeiten
treffe, wenn ich was neues ausprobiere. Eines der meiner Meinung nach nützlichsten
Dinge sind Parallaxe Objekte.
Dinge wie Himmelskörper, Statusanzeigen, ect, können seit GWE4 ohne lästige Aufrufe
wie SetPosition() oder Attachs an den ausgewählten Clonk bequem umgesetzt werden.
Dieses leicht verworrene Tutorial befasst sich mit Parallaxen Objekten im Allgemeinen,
was für Anfänger interresant sein sollte, und mit dem Scripten von sich bewegenden
Himmelskörpern, worauf man auch als erfahrener Scripter einen kleinen Blick werfen
könnte ;-)


1.Ein Tutorial zum Erstellen von Hintergrund/HUD-Objekten.

Was ist denn überhaupt ein Parallaxes Objekt?
Parallaxe Objekte sind Objekte mit der Kategorie C4D_Parallax.
Ihre Position ist nicht wie gewöhnlich relativ zur oberen linken Kartenecke,
sondern zur linken oberen Bildschirmecke. Das Bedeutet,
ein normales Objekt mit Position (200/200) ist 200 Pixel rechts von und 200 Pixel
unter der oberen linken Ecke der Karte. Bei einem Parallaxen Objekt bedeutet
der Abstand 200 Pixel von der oberen linken Bildschirmecke,
egal wo diese sich gerade befindet.
Das ist ein wichtiger Unterschied, denn egal auf welcher Position der Clonk des
Spielers sich befindet, der Bilschirm "folgt" ihm, und damit auch die parallaxen
Objekte. Ein parallaxes Objekt kann demnach nie außer Sicht geraten,
aus der Karte geschleudert oder eingesammelt werden.

Und wie mache ich das jetzt?
Das ist der einfachere Teil ;-)
Zunächst muss die Kategorie C4D_Parallax für das Objekt gesetzt werden.
Seit neuestem kann man die Kategorien in der Defcore auch in Worten angeben,
das sieht dann z.B. so aus:

Category = C4D_StaticBack | C4DParallax

Alternativ kann man auch in der Entwicklerdoku unter Objektkategorien durch
Anklicken der gewünschten Kategorien die richtige Zahl ausgeben lassen.
Danach sind im Prinzip nur noch drei Zeilen Script nötig.

Local(0)=0;
Local(1)=0;
SetPosition(x,y);

Warum man Local 0 und 1 setzen muss, erkläre ich jetzt nicht, das würde zu weit
ausschweifen, wers genau wissen will soll in der Doku unter C4D_Parallax schauen.
Die Position des Objekts ist jetzt der gewünschte Abstand von der linken oberen
Bilschirmecke. Durch etwas Probieren kann man das Objekt jetzt irgendwie unter das
Clonkporträt lotsen, und da hängt es nun, gut sichtbar für alle Spieler auf ihren
Bildschirmen.

Und was soll das jetzt bringen?

Es gibt natürlich eine Menge verwendungen für diese Art von Objekt.
Die einfachste sind Wertanzeigen.
Dazu muss man zusätzlich den Besitzer des Objekts und seine Sichtbarkeit verändern.
Beispiel:

SetOwner(0);
SetVisibility(VIS_Owner());

Dieser Script sorgt dafür dass das Objekt dem ersten Spieler gehört und nur von
diesem Gesehen werden kann. Denn was hilft es, wenn andere Spieler eine
Statusanzeige sehen, die gar nichts mit ihrem Clonk zu tun hat? Zusätzlich sollte
das Objekt die Kategorie C4D_IgnoreFoW bekommen, damit man es auch sieht wenn der
Fog of War aktiviert ist und es grade nicht im Sichtfeld liegt.

Eine Andere Verwendung sind Hintergründe.
Man nehme einfach ein Bild von einer Berglandschaft, das so groß ist wie das
Spielfester von Clonk (der genaue Wert ist mir leider unbekannt) mache es parallax
und schon sehen alle Spieler unabhängig von dieser Position auf der Karte im
Hintergrund Berge. Dazu empfiehlt sich die Kategorie C4D_Background,
da das Objekt sich sonst böse mit Gebäuden und ähnlichem beißen würde.

zu Beachten:
1.Parallaxe Objekte können einige Positionbezogenen Scriptbefehle nicht umsetzen, z.B
-CreateObject()
-FindObject() ,zumindest nicht mit Suchbereich

2.bei negativen Positionswerten bezieht sich die Position auf die untere rechte Bildschirmecke.



2.Mathematik + Clonk: Parallaxe Himmelskörper

Mit C4D_Parallax kann man natürlich auch ganz genial Dinge wie Sonne und
Mond umsetzen. An dieser Stelle lasse ich einfach einen Script von mir für mich
sprechen, den ihr im Endrelease von Vampire Hunt finden werdet ^^
Der Screenshot erklärt einige der Variablen.

/*-- Mond --*/

#strict

func Initialize()
{
SetAction("Loom");
//Parallax machen
Local(0)=0;
Local(1)=0;
}

func Wander() //Timer Call
{
/* Moon Phase ist eine Local die von TIME jede Nacht geändert wird.
Das Objekt hat eine Aktion mit 10 Phasen, die Neumond bis Vollmond
darstellen. preiset den großen Graphikmeister Speed ;-) */

SetPhase(MoonPhase);

/* Wir wollen eine langgezogene Kreisbewegung, deren obere
Hälfte im Bildschirm liegt, diese soll nachts ablaufen, also
von TimeResolution()/4 bis TimeResolution()*3/4 */

var time = FindObject(TIME);
var tRm= time -> TimeResolution(); //Siehe Script von TIME, = "maximale" Tageszeit
var tR= time -> ActualDayTime()-tRm/4;//Tageszeit
var ScreenResX = 600; //Geratene Werte, Bildchirmauflösung von Clonk
var ScreenResY = 300*2; //y doppelt, damit man nur die obere Hälfte sieht
var alpha = (tR*360)/tRm; //Verhältnis von tR zu tRm in form eines Winkels
var xp = Cos(alpha,ScreenResX/2);
var yp = Sin(alpha,ScreenResY/2);
var x = ScreenResX-xp;
var y = ScreenResY-yp;
SetPosition(x,y);

return(1);
}

func Switch()
{
//Loom Back = Loom mit Reverse. nicht weiter wichtig.
if(GetAction() eq "Loom") SetAction("LoomBack");
else SetAction("Loom");
return(1);
}




Dieser Script hat mich ca 4 Stunden und 3 Wutanfälle gekostet =.=
... und das war der einzige Nutzen den Mathematik bisher für mich hatte.
Zum besseren Verständnis empfehle ich Eisbeutel und die Entwicklerdoku.
Ich hoffe VHVST hilft den Scriptern unter euch weiter, immerhin lebt
Clonk praktisch von seiner Community (=

Bis zum nächsten mal,
Valle


13 Kommentare


02.08.2008 9:37 von Dragonclonk:
Sieht schön aus^^

03.04.2008 20:42 von Berglurch:
omg

31.03.2008 11:05 von Speed:
nein valle du hast grafik wieder einmal falsch geschrieben *mitsanktumgrafikverdresch*

aber ja danke für das tutorial ich hab schon ein wenig probiert o0
Zuletzt geändert: 31.03.2008 11:05

31.03.2008 11:01 von Valle:
... weil MoonPhase ne vom Zeitobjekt definierte Globale Variable is?
Ich benutz ein eigenes TIME.

31.03.2008 9:10 von Speed:
das  script hat nen fehler xD

>/* Moon Phase ist eine Local die von TIME jede Nacht geändert wird.

>Das Objekt hat eine Aktion mit 10 Phasen, die Neumond bis Vollmond

>darstellen. preiset den großen Graphikmeister Speed ;-) */


Grafik mit f bitte :C
Zuletzt geändert: 31.03.2008 09:10

29.03.2008 11:44 von Valle:
War ja klar, Speed und Gwizdo überschütten sich wieder mit Nettigkeiten ^^

@ Cäsar
Findest du? Ich wollte halt was griffiges schreiben, mit dem Anfänger auch
was anfangen können.

Wem ein gutes Thema einfällt, das ner Erklärung/Anleitung bedarf, her damit, ich glaube
schlau daherlabern liegt mir ^^

28.03.2008 19:37 von Speed:
es geht auch powned

28.03.2008 19:32 von Deffi:
*pwned

28.03.2008 18:26 von Speed:
ja du bist eine ausnahme *läster*

28.03.2008 18:08 von Chocobo:
Ich erkenn keinen SToff aus der 10 klasse Geometrie :O oO ich war auch noch nie in der 10.klasse :O

28.03.2008 17:55 von Speed:
omg das motiviert mich für vampir hunt weiter zu grafikern bzw das hast du mir mal schon geschickt per word dokument @ icq *insiderbin*

>Das Objekt hat eine Aktion mit 10 Phasen, die Neumond bis Vollmond

darstellen. preiset den großen Graphikmeister Speed ;-)


pwned by speed ;)
ich hab einen mit 30 phasen der ist noch kuhler!!
Zuletzt geändert: 28.03.2008 19:37

28.03.2008 17:48 von Cäsar:
Nunja, etwas viel HowTo, etwas wenig hintergrund, finde ich.
Und der Mond Script... Naja, das ist eher eine Sonne, ein Mond steht nämlich auchmal Tagsüber am Himmel.

28.03.2008 16:31 von Deffi:
Danke.