Koordinaten
Aus Clonk Wiki
Koordinaten sind in Clonk an vielen Stellen wichtig und man wird beim Entwickeln nicht drumherum kommen, sich mit Koordinaten auseinander zu setzen.
Inhaltsverzeichnis |
Globale Koordinaten
Als "globale Koordinaten" wird die Position eines Objekts in einem Szenario bezeichnet.
Das Koordinatensystem des Szenarios hat seinen Ursprung (Position 0,0) in der oberen linken Ecke. Nach rechts hin werden die X-Werte größer, nach unten hin die Y-Werte. Negative Y-Werte sind möglich, jedoch werden ansonsten alle Objekte gelöscht, die rechts, links oder unten aus der Landschaft geraten.
Globale Koordinaten sind immer dann wichtig, wenn Scripte nicht von Objekten, sondern an anderer Stelle ausgeführt werden (z.B. Szenarioscripte oder DefinitionCalls), was als "globaler Kontext" bezeichnet wird. Wenn also in einem Szenario zu Beginn Objekte erstellt werden sollen, müssen sie an den globalen Position erstellt werden.
Sollte ein Szenario über eine Landscape.bmp verfügen, so kann man dort auch globale Koordinaten rauslesen. Die gängigen Grafikprogramme (auch Microsoft Paint) zeigen die Koordinaten automatisch an. Damit man die entsprechenden Koordinaten im Spiel selbst erhält, muss man die ausgelesenen noch mit dem Wert von MapZoom multiplizieren, der in der Scenario.txt definiert ist (Standard bei keinerlei Angabe ist 10).
Globale Koordinaten werden auch von manchen Funktionen explizit gefordert (z.B. PathFree, siehe Anmerkung). Ist dies der Fall, muss selbst bei einem Aufruf aus einem Objekt heraus die globale Position mit GetX bzw. GetY ermittelt und übergeben werden.
Lokale Koordinaten
Wenn Scripte von einem Objekt ausgeführt werden, dass sich in einem Szenario an einer bestimmten Position befindet, so sind die meisten Koordinatenangaben "lokal". D.h. dass die Position des Objekts selbst zu allen Koordinaten dazugerechnet wird. Dies ist für jede Funktion auch in der Doku vermerkt (z.B. CreateObject: Bei lokalen Aufrufen dieser Funktion wird die angegebene Position zu Offset-Koordinaten zum aufrufenden Objekt.).
Das bedeutet also, dass beispielweise der Aufruf von CreateObject(ROCK, 10, 10, -1); in einem Objekt nicht bewirkt, dass der Stein an der Position 10,10 des Szenarios entsteht, sondern 10 Pixel weiter rechts und 10 unterhalb des aufrufenden Objekts.
Um globale Koordinaten in lokale Koordinaten umzuwandeln, gibt es die Hilfsfunktionen AbsX und AbsY. Der gleiche Aufruf wie oben würde in dieser Form CreateObject(ROCK, AbsX(10), AbsY(10), -1); also bewirken, dass der Stein wirklich an der Position 10,10 erzeugt wird, völlig egal, wo sich das aufrufende Objekt zu diesem Zeitpunkt befindet.
Offset
In der DefCore muss man für jedes Objekt ein Offset definieren. Diese Werte bestimmen, wo genau sich der Objektmittelpunkt befindet (die globalen Koordinaten eines Objekts sind immer dort, wo der Objektmittelpunkt ist, lokale Koordinaten werden auf den Mittelpunkt draufgerechnet). Der Mittelpunkt muss demnach nicht genau in der Mitte des Objektrechtecks liegen, welches man mit Width und Height definiert, sondern kann ganz woanders sein (meistens macht dies jedoch keinen Sinn).
Die Offset-Koordinaten sind meist negativ, da man mit den zwei Werten definiert, wo sich die links obere Ecke des Objekts vom Mittelpunkt aus gesehen befindet.
Viele weitere Koordinaten eines Objekts bauen auf dem Offset auf (Vertices, Eingangs- und Aufnahmebereiche, die Bereichsangabe bei FindObject u.a.).
ActMap
Im Gegensatz zu den Koordinaten in der DefCore, bauen die Koordinaten der ActMap nicht auf dem Offset eines Objekts auf, sondern auf der oberen linken Ecke der Grafik. Alle Angaben werden von dort aus gemacht.