Guten Abend liebe Brotfische,
mir war mal wieder langweilig und ich habe ein kleines Include erstellt, mit dessen Hilfe, man extrem schnell & einfach Routen erstellen kann mit Checkpoints.
Egal ob RaceCheckpoints oder normale Checkpoints nun geht alles zack zack.
Grundsätzliche Vorteile:
- Das Include besteht nur aus Makros. Das bedeutet, man hat 0 Performanz einbußen während der Laufzeit. Es lässt sich nur alles leichter erstellen und verwalten.
- Viele erstellen z.B. dafür immer so counter Variablen: new checkPoint1[MAX_PLAYERS]; und reservieren massig speicher..nur um einen index mitzuzählen. Das entfällt hier komplett, das bedeutet, man spart hier speicher
- Man benötigt viel weniger Code.
- Wenn man z.B. mit new die zähler Variable setzt, muss man sie auch wieder resetten, hier wird das automatisch gemacht.
So, um das besser leserlich zu machen, teile ich den Post nun in Checkpoint & Race-Checkpoints auf:
Checkpoints:
StartCheckpoint<Route>(playerid, start_index, struct[], size);
/*
Route = Die Routenid...wird im unteren erklärt werden
playerid = Die Spielerid dem der Checkpoint angezeigt werden soll
start_index = Der Index, wo die Route starten soll (Standard Fall=0)
struct[] = Hier wurden alle Punkte der Route deklariert.
size = Checkpoint größe :)
*/
IsInCheckpoint(playerid, struct[]<Route>);
/*
playerid = Spielerid bei der geprüft wird, in welchem Checkpoint er ist.
struct[] = Wie oben, wo die Routen Punkte deklariert wurden.
Route = Routenid
*/
NextCheckpoint(playerid, struct[]<Route>, size);
/*
playerid = Spielerid dem der Checkpoint angezeigt wird.
struct[] = Wie oben, wo die Routen Punkte deklariert wurden.
Route = Routenid
size = Die größe vom Nächsten Checkpoint :)
*/
GetRouteCounter<Route>(playerid);
/*
playerid = Spielerid bei der geprüft wird, in welchem Checkpoint er ist.
Route = Routenid
*/
ClearCheckpoint<Route>(playerid);
/*
playerid = Spielerid dem der Checkpoint verschwindet & speicher frei gemacht wird.
Route = Routenid
*/
Alles anzeigen
Beispiel:
//Das hier oben ins Skript
//Sieht bei Race & Normal Checkpoint gleich aus :)
enum //So definiert man Routen :)
{
TEST_ROUTE,
TUT_ROUTE,
KP_ROUTE
};
struct ~Points~ //Das wäre die Route "Points"
{
{0.0, 5.0, 3.0},
{0.0, 10.0, 3.0},
{0.0, 15.0, 3.0},
{0.0, 20.0, 3.0},
{0.0, 25.0, 3.0},
{0.0, 30.0, 3.0},
{0.0, 40.0, 3.0},
{0.0, 50.0, 3.0},
{50.0, 60.0, 3.0}
};
//So startet man die Route:
StartCheckpoint<TEST_ROUTE>(playerid, START_CHECKPOINT, Points, 4.0);
//4.0 = Checkpoint größe (size)
//START_CHECKPOINT ist in der Route eben [0] (damit die Route am Anfang anfängt)
//Und die Routen id hier ist TEST_ROUTE
public OnPlayerEnterCheckpoint(playerid)
{
switch(IsInCheckpoint(playerid,Points<TEST_ROUTE>)) //Prüft ob er überhaupt drinnen ist (wenn nicht wird -1 ausgegeben) FINAL_CHECKPOINT (1) und NORMAL_CHECKPOINT (0) :)
{
case FINAL_CHECKPOINT: //Springt halt hier rein, wenn der Spieler im Finalen Checkpoint ist
{
SendClientMessage(playerid,0xFF0000FF,!"* Finalen Checkpoint von TEST_ROUTE erreicht!");
ClearCheckpoint<TEST_ROUTE>(playerid); //SEHR WICHTIG!! Lässt den Checkpoint verschwinden & räumt den Speicher auf.
}
case NORMAL_CHECKPOINT:
{
new string[64],x = GetRouteCounter<TEST_ROUTE>(playerid); //x = gibt an, im wie vielten Checkpoint er ist. Kann man auch über einen switch laufen lassen, wenn man z.B. für jeden bestimmten Checkpoint verschiedene Aktionen ausführen will.
format(string,sizeof(string),"Checkpoint %d betreten, von TEST_ROUTE",x);
SendClientMessage(playerid,-1,string);
NextCheckpoint(playerid, Points<TEST_ROUTE>, 5.0); //Sagt, dass der Nächste Checkpoint aufgerufen werden soll.
}
}
return 1;
}
Alles anzeigen
Race-Checkpoints:
StartRaceCheckpoint<Route>(playerid, type, start_index, struct[], size);
/*
Route = Die Routenid...wird im unteren erklärt werden
playerid = Die Spielerid dem der Checkpoint angezeigt werden soll
type = RaceCheckpoint Type
start_index = Der Index, wo die Route starten soll (Standard Fall=0)
struct[] = Hier wurden alle Punkte der Route deklariert.
size = Checkpoint größe :)
*/
IsInRaceCheckpoint(playerid, struct[]<Route>);
/*
playerid = Spielerid bei der geprüft wird, in welchem Checkpoint er ist.
struct[] = Wie oben, wo die Routen Punkte deklariert wurden.
Route = Routenid
*/
NextRaceCheckpoint(playerid, struct[]<Route>, size, type);
/*
playerid = Spielerid dem der Checkpoint angezeigt wird.
struct[] = Wie oben, wo die Routen Punkte deklariert wurden.
Route = Routenid
size = Die größe vom Nächsten Checkpoint :)
type = RaceCheckpoint Typ für Nächsten Checkpoint :)
*/
GetRaceRouteCounter<Route>(playerid);
/*
playerid = Spielerid bei der geprüft wird, in welchem Checkpoint er ist.
Route = Routenid
*/
ClearRaceCheckpoint<Route>(playerid);
/*
playerid = Spielerid dem der Checkpoint verschwindet & speicher frei gemacht wird.
Route = Routenid
*/
Alles anzeigen
Beispiel:
//Oben im Skript:
enum //So kann man ganz viele Routen definieren
{
TEST_ROUTE,
TUT_ROUTE,
KP_ROUTE
};
struct ~Points~ //Test Route..mit dem Namen "Points"
{
{0.0, 5.0, 3.0},
{0.0, 10.0, 3.0},
{0.0, 15.0, 3.0},
{0.0, 20.0, 3.0},
{0.0, 25.0, 3.0},
{0.0, 30.0, 3.0},
{0.0, 40.0, 3.0},
{0.0, 50.0, 3.0},
{50.0, 60.0, 3.0}
};
//Da wo die Route starten soll:
StartRaceCheckpoint<TEST_ROUTE>(playerid, NORMAL_TYPE, START_CHECKPOINT, Points, 4.0);
//Normal_TYPE kann man im wiki nachlesen
//START_CHECKPOINT ist in der Route eben [0] (damit die Route am Anfang anfängt)
//Und die routenid hier ist TEST_ROUTE
public OnPlayerEnterRaceCheckpoint(playerid)
{
switch(IsInRaceCheckpoint(playerid,Points<TEST_ROUTE>)) //Prüft ob er den letzten Checkpoint erreicht hat..oder nur einen normalen
{
case FINAL_CHECKPOINT: //Hier hätte er den letzten erreicht!
{
SendClientMessage(playerid,0xFF0000FF,"* Finalen Race Checkpoint von TEST_ROUTE erreicht!");
ClearRaceCheckpoint<TEST_ROUTE>(playerid); //Ganz WICHTIG! Zum checkpoint verschwinden lassen & memory free
}
case NORMAL_CHECKPOINT:
{
new string[64],x = GetRaceRouteCounter<TEST_ROUTE>(playerid); //x = gibt an, welchen Checkpoint er betreten hat (beginnt bei 0)...das könnte man auch über einen switch laufen lassen und somit verschiedene aktionen pro checkpoint ausführen lassen :)
format(string,sizeof(string),"Race-Checkpoint %d betreten, von TEST_ROUTE",x);
SendClientMessage(playerid,-1,string);
NextRaceCheckpoint(playerid, Points<TEST_ROUTE>, 5.0, (IsNextFinish(x,Points)) ? FINISH_TYPE : NORMAL_TYPE); //hintere Bedingung prüft ob er kurz vor dem letzten Checkpoint steht, wenn ja soll FINISH_TYPE (diese Flagge da) im Checkpoint angezeigt werden.
}
}
//Falls diese Route nicht gestartet wurde..wird der switch übersprungen :)
//Wichtig, dass man nicht mehrere Routen startet xD
//Und keine Angst, beim login werden die Daten zurückgesetzt!
return 1;
}
Alles anzeigen
Schluss:
Bei Fragen oder Problemen gerne einfach melden
Natürlich freue ich mich jederzeit über ein kleines Feedback
In den jeweiligen case Szenarien unter OnPlayerEnter(Race)Checkpoint, könnt ihr auch jeweils am ende ein return 1; setzen, damit nachfolgender Code nicht mehr aufgerufen wird
Download:
Source-Code: Pastebin
Direkter-Download: MediaFire
Mit freundlichen Grüßen