06.01.2017, 02:26
En un principio lo mбs fбcil es usar el streamer de Incognito, para entender lo que te voy a escribir, te recomiendo que leas primero mi tutorial sobre la manipulaciуn de datos.
Empecemos creando un cuadrado en el centro del mapa:
Obviamente usamos OnPlayerLeaveDynamicArea para detectar cuando el jugador abandona un бrea:
Como puedes ver, hemos utilizado SetPlayerPos para colocarlo justo en el margen del cuadrado. En caso de que la posiciуn no sea muy exacta y el jugador quede fuera podrнas hacer algo como esto: max_x - 1.0 o min_y + 1.0.
Este es un ejemplo muy bбsico, no lo he probado pero deberнa funcionar. En caso de tratarse de una zona mбs compleja, las cosas se complicarнan.
Si el бrea fuese un circulo habrнa que trazar una recta desde la posiciуn del jugador al centro de la circunferencia, y detectar donde corta dicha recta con la circunferencia para poder colocar al jugador en dicha posiciуn. Para ello habrнa que desarrollar un algoritmo, no es complicado, pero sн que serнa algo mбs avanzado que el ejemplo anterior.
Empecemos creando un cuadrado en el centro del mapa:
PHP код:
new mi_area;
public OnGameModeInit()
{
mi_area = CreateDynamicRectangle(-100.0, -100.0, 100.0, 100.0);
return 1;
}
PHP код:
public OnPlayerLeaveDynamicArea(playerid, areaid)
{
/* Obtenemos las coordenadas usadas para crear el бrea. */
new Float:min_x;
new Float:min_y;
new Float:max_x;
new Float:max_y;
min_x = Streamer_GetFloatData(STREAMER_TYPE_AREA, areaid, E_STREAMER_MIN_X);
min_y = Streamer_GetFloatData(STREAMER_TYPE_AREA, areaid, E_STREAMER_MIN_Y);
max_x = Streamer_GetFloatData(STREAMER_TYPE_AREA, areaid, E_STREAMER_MAX_X);
max_y = Streamer_GetFloatData(STREAMER_TYPE_AREA, areaid, E_STREAMER_MAX_Y);
/* Obtenemos la posiciуn del jugador. */
new Float:p_x;
new Float:p_y;
new Float:p_z;
GetPlayerPos(playerid, p_x, p_y, p_z);
/* Detectamos donde se encuentra el jugador respecto al бrea. */
if(areaid == mi_area)
{
if(p_x > max_x) // El jugador se encuentra a la derecha del cuadrado
{
SetPlayerPos(playerid, max_x, p_y, p_z);
}
else if(p_x < min_x) // El jugador se encuentra a la izquierda del cuadrado
{
SetPlayerPos(playerid, min_x, p_y, p_z);
}
if(p_y > max_y) // El jugador se encuentra por encima del cuadrado
{
SetPlayerPos(playerid, p_x, max_y, p_z);
}
else if(p_y < min_y) // El jugador se encuentra por debajo del cuadrado
{
SetPlayerPos(playerid, p_x, min_y, p_z);
}
return 1;
}
return 1;
}
Este es un ejemplo muy bбsico, no lo he probado pero deberнa funcionar. En caso de tratarse de una zona mбs compleja, las cosas se complicarнan.
Si el бrea fuese un circulo habrнa que trazar una recta desde la posiciуn del jugador al centro de la circunferencia, y detectar donde corta dicha recta con la circunferencia para poder colocar al jugador en dicha posiciуn. Para ello habrнa que desarrollar un algoritmo, no es complicado, pero sн que serнa algo mбs avanzado que el ejemplo anterior.