Häufige Fehler
Aus Clonk Wiki
Ein paar mehr oder weniger häufig auftretende Fehler, zur Warnung an nachfolgende Entwickler ;)
Problem: Wenn man etwas im Entwicklermodus in der Konsole ausführt, wird immer 0 zurück gegeben. Was ist los?
Problem: Teile des Scripts scheinen einfach nicht ausgeführt zu werden. Es wird auch kein Fehler angezeigt.
Lösung: Es mag blöd sein: Aber immer zuerst prüfen, ob der Debugmodus an ist (z.B. indem man mit F5 versucht, die Vertices anzuzeigen). Er wird z.B. für Ligaspiele zurückgesetzt und bleibt deshalb nicht dauerhaft an.
Problem: Folgender Code funktioniert nicht wie er soll:
for(var
i;
i
<
10;
i++)
for(var
j;
j
<
10;
j++)
Log("%d %d",
i,
j);Lösung: Variablen werden, wenn man sie mit "var x" deklariert, nicht an dieser Stelle initialisiert. Für die Engine existiert eine Variable immer in der gesamten Funktion, deshalb wird sie nur am Anfang der Funktion auf 0 gesetzt. Das heißt, dass j nach dem ersten Durchlauf auf 10 bleibt. Richtig ist:
for(var
i
=
0;
i
<
10;
i++)
for(var
j
=
0;
j
<
10;
j++)
Log("%d %d",
i,
j);Deshalb: Immer Initialisierungen hinschreiben, wenn man davon ausgeht, dass die Variable einen bestimmten Wert hat!
Problem: Folgender Code ist ein nicht offensichtlicher Typfehler:
var
obj;
while(
obj
=
FindObject(CLNK,
0,
-100,
-100,
200,
200,
0,
0,
0,
0,
obj)
&&
Hostile(obj->GetOwner(),
GetOwner())
)
Explode(obj);Lösung: Der Operator "=" hat eine geringere Priorität als der "&&"-Operator, deshalb wird die Schleifenbedingung wie
obj
=
(FindObject(...)
&&
Hostile(...))ausgeführt. Damit erhält obj einen bool-Wert, was später zu Problemen führt. Richtig ist:
var
obj;
while(
(obj
=
FindObject(CLNK,
0,
-100,
-100,
200,
200,
0,
0,
0,
0,
obj))
&&
Hostile(obj->GetOwner(),
GetOwner())
)
Explode(obj);Problem: Ein Objekt hat eine Aktion, die sich schnell wiederholt (also NextAction ist wieder dieselbe Aktion). Darin wird die Geschwindigkeit des Objekts gesetzt. Allerdings bewegt sich das Objekt nicht von der Stelle.
Lösung: Bei Wechsel der Aktion wird die Position des Objekts intern auf einen Pixel gerundet. Da sich das Objekt in der kurzen Zeit nicht mehr als einen Pixel bewegt, wird es immer wieder zurück gesetzt.
Problem: Ich will ein Flugobjekt machen, aber es fliegt nicht! Lösung: Damit ein Objekt fliegen kann, muss folgendes erfüllt sein
- Es eine Aktivität mit Prozedur FLOAT haben und diese gesetzt sein
- Das Objekt entweder vollständig (GetCon() == 100) sein oder IncompleteActivity=1 in der DefCore gesetzt sein
- Das Objekt darf, wenn es sich bewegen soll, nicht Kategorie 1 haben
- Es muss in der Physical-Sektion eine Float-Physical angegeben sein
- Bei Crewmitgliedern muss auch die Physical-Sektion im Spieler die Float-Physical besitzen. Hat man also die Physicals geändert, sollte man alle Crewmitglieder dieses Typs aus seinem Spieler löschen
- Das Objekt darf mit seinen Vertices nirgends feststecken - insbesondere auch nicht in der eigenen SolidMask!
- Das Objekt muss aktiv sein (nicht C4OS_Inactive)
- Dem Objekt muss entweder ein Bewegungskommando (SetCommand), oder direkt eine Bewegungsrichtung (SetComDir) oder noch direkter eine Geschwindigkeit (SetXDir/SetYDir) gegeben werden
- Bei einem MoveTo-Command ist zu beachten, dass MoveTo-Commands im Standard-Pathfinder-Modus immer auf den Boden gesetzt werden