Como funciona CreateDynamicPolygon y CreateDynamicRectangle
#1

Como me metн al mundo de lo dinбmico, ahora quiero hacer бreas con йstas funciones dichas, si alguien sabe como funciona o como puedo crear, etc se le agradecerнa mucho, si es posible con fotos xd, .

Gracias, espero aprender y salir de la noobesa.

Код:
CreateDynamicPolygon y CreateDynamicRectangle
Reply
#2

Buenas, para empezar... їestбs hablando del Streamer de Incognito?
Reply
#3

Para empezar tienes que saber que: un polнgono es una figura plana compuesta por una secuencia finita de segmentos rectos consecutivos que cierran una regiуn en el plano.

Es decir, una cantidad de segmentos rectos que se juntan por los extremos y encierran una superficie llamada бrea. Dependiendo de la cantidad de segmentos, nuestro polнgono recibirб distintos nombres (triбngulo, pentбgono, octбgono, etc.).

Entonces, concluyo que un polнgono ha de tener mнnimo tres lados para poder encerrar una superficie.



[*] Por ejemplo:

Esta figura es un polнgono de cuatro lados, a su vez, recibe el nombre de cuadrilбtero. Cada esquina (donde se juntan dos rectas) es un punto, entonces en este caso, tenemos cuatro puntos.

Entonces, llevбndolo al mundo del SA-MP, tendrнamos cuatro puntos de coordenadas:
  • Punto A: ax, ay, az
  • Punto B: bx, by, bz
  • Punto C: cx, cy, cz
  • Punto D: dx, dy, dz


Vayamos ahora al tema de Incognito, donde nos ha dejado esta nota interesante:
Quote:
Originally Posted by Incognito
The points in CreateDynamicPolygon and CreateDynamicPolygonEx need to be specified as a sequence of ordered pairs (x1, y1, x2, y2, ..., xn, yn). The number of elements in the array must be divisible by two for this reason. The first point must also be equal to the last point to form a closed path.
Quote:
Originally Posted by Incognito
Los puntos en CreateDynamicPolygon y CreateDynamicPolygonEx deben estar definidos como una secuencia de parejas ordenadas (x1, y1, x2, y2, ..., xn, yn). Debido a lo anterior, el nъmero de elementos de la matriz ha de ser divisible por dos. El primer punto ha de ser igual al ъltimo para formar un camino cerrado.
Entonces, entendemos que tenemos que crear una matriz de la siguiente manera:
pawn Код:
new Float:Puntos[] = {
    x1, y1,
    x2, y2,
    x3, y3,
    ......,
    xn, yn
};
En nuestro caso, como tenemos cuatro puntos, serнa asн:
pawn Код:
new Float:Puntos[10] = {
    ax, ay,
    bx, by,
    cx, cy,
    dx, dy,
    ax, ay /* El ъltimo punto, ha de ser igual al primer punto para cerrar la figura. */
};

/* Como tenemos 10 valores en total (dos valores por cada posiciуn), le damos un tamaсo de 10 a nuestra matriz. */
En definitiva, deducimos que:
  • un polнgono ha de tener como mнnimo tres lados para encerrar un бrea.
  • no podemos definir la altura del бrea ya que usamos posiciones en dos dimensiones (x, y).
  • el ъltimo punto ha de ser igual al primer punto para trazar una recta que encierre el бrea del polнgono.


Una vez entendido esto podemos seguir adelante, vamos a mirar la funciуn en sн:
pawn Код:
native CreateDynamicPolygon(Float:points[], Float:minz = -FLOAT_INFINITY, Float:maxz = FLOAT_INFINITY, maxpoints = sizeof points, worldid = -1, interiorid = -1, playerid = -1);
Quote:
  • Points: puntos que hemos definido anteriormente.
  • minz/maxz: esto define la altura de nuestro polнgono, aquн podemos introducir valores del eje Z para definir una altura determinada, o bien poner -FLOAT_INFINITY/FLOAT_INFINITY para detectar cualquier posiciуn por encima/debajo del polнgono.
  • maxpoints: nъmero total de puntos que definen nuestro polнgono.
  • worldid/interiorid: si se introduce un valor distinto de -1, el polнgono solo tendrнa efecto en ese Virtual World o Interior. Si dejamos -1, actuarб en todos los Virtual Worlds e Interiores.
  • playerid: Si se introduce un valor distinto de -1, solo actuarнa para el jugador con esa ID. Si dejamos -1, actuarб para todos los jugadores.
Una vez sabemos todo esto, y con los datos que tenemos, podrнamos crear nuestro polнgono:
pawn Код:
new Float:Puntos[10] = {
    ax, ay,
    bx, by,
    cx, cy,
    dx, dy,
    ax, ay
};

CreateDynamicPolygon(Puntos, -FLOAT_INFINITY, FLOAT_INFINITY, sizeof(Puntos), -1, -1, -1);
Y ya con esto tendrнamos un polнgono definido, y con las demбs funciones de las бreas podemos programar lo que queramos.

Respecto al rectбngulo, OTACON explica aquн perfectamente como sacar Float:minx, Float:miny, Float:maxx, Float:maxy.

Un saludo.


PD: explicaciуn a groso modo.
pawn Код:
new Float:Puntos[10] = {
    ax, ay,
    bx, by,
    cx, cy,
    dx, dy,
    ax, ay
};

/*
1є. Recta de (ax, ay) a (bx, by).
2є. Recta de (bx, by) a (cx, cy).
3є. Recta de (cx, cy) a (dx, dy).
4є. Recta de (dx, dy) a (ax, ay).
*/


/* De esta manera, encerramos un бrea, eso explica estos puntos que hemos usado. */
Reply
#4

Huy papasito te pasaste, logrй a comprender esto y me hize en la playa una area en rectangulo y funciona tan precisamente que si das un paso ya entras al area, jeje esto me servirб para muchisimas cosas como para los que estбn en la carcel jeje, ufff te pasaste, gracias por enseсarme corazуn :* +1
Reply
#5

Si vas hacer un sistema de prision. Te recomiendo q uses
PHP код:
IsPlayerInArea(playeridFloat:MinXFloat:MinYFloat:MaxXFloat:MaxY
en un timer por ejemplo yo hice asi


PHP код:
IsPlayerInArea(playeridFloat:MinXFloat:MinYFloat:MaxXFloat:MaxY)
{
    new 
Float:XFloat:YFloat:Z;
    
GetPlayerPos(playeridXYZ);
    if(
>= MinX && <= MaxX && >= MinY && <= MaxY) {
        return 
1;
    }
    return 
0;

PHP код:
timer Global[1000]()
{
   foreach(
Playeri)
   {
      if(
PlayerInfo[i][pEnPrision] == 1)
      {
         new 
mjeadm[128];
         if(!
IsPlayerInArea(i213.3539,106.9929,229.4050,113.0358))
         {
           
LlevarloDeNuevo(i);
           
format(mjeadm,sizeof(mjeadm),"[PRECAUCION]: El jugador %s (ID: %d), se salio de la celda, posible Cheater."NombrePlayer(i), i);
           
MensajeAdmin(Blanco,mjeadm);
         } 
Y con respecto a CreateDynamicPolygon y CreateDynamicRectangle
Usa este programa

http://www.******************/post/S...er_tool-14561/
Reply
#6

Quote:
Originally Posted by Alvaro89
Посмотреть сообщение
Si vas hacer un sistema de prision. Te recomiendo q uses
PHP код:
IsPlayerInArea(playeridFloat:MinXFloat:MinYFloat:MaxXFloat:MaxY
en un timer por ejemplo yo hice asi


PHP код:
IsPlayerInArea(playeridFloat:MinXFloat:MinYFloat:MaxXFloat:MaxY)
{
    new 
Float:XFloat:YFloat:Z;
    
GetPlayerPos(playeridXYZ);
    if(
>= MinX && <= MaxX && >= MinY && <= MaxY) {
        return 
1;
    }
    return 
0;

PHP код:
timer Global[1000]()
{
   foreach(
Playeri)
   {
      if(
PlayerInfo[i][pEnPrision] == 1)
      {
         new 
mjeadm[128];
         if(!
IsPlayerInArea(i213.3539,106.9929,229.4050,113.0358))
         {
           
LlevarloDeNuevo(i);
           
format(mjeadm,sizeof(mjeadm),"[PRECAUCION]: El jugador %s (ID: %d), se salio de la celda, posible Cheater."NombrePlayer(i), i);
           
MensajeAdmin(Blanco,mjeadm);
         } 
Y con respecto a CreateDynamicPolygon y CreateDynamicRectangle
Usa este programa

http://www.******************/post/S...er_tool-14561/
mUCHISIMAS GRACIAS tambien un beso rico para ti +1
Reply
#7

Bueno la verdad no quiero abrir un post cuando lo mio se trata de algo,parecido.Siguiendo los tutoriales de Otacon y de irinel ,hize un area radioactiva.Funciona bien,pero me fludea el chat,alguien sabe porque?Se que es un error en OnPlayerUpdate pero no encuentro forma de arreglarlo.Dejo mi OnPlayerUpdate
pawn Код:
public OnPlayerUpdate(playerid)
{
     if(IsPlayerInArea(playerid,-70.06725, 1634.903, 525.5044, 2195.441))
    {
        SendClientMessage(playerid, Azul, "Siente un olor raro y empiezas a marearte...!.");
        SendClientMessage(playerid, Azul, "El mareo es intenso...!.");
        SendClientMessage(playerid,Amarillo, "Al parecer es una zona radioactiva");
        SetPlayerDrunkLevel (playerid, 20000);
    }
    else
    {
        SendClientMessage(playerid, Azul, "Empiezas a sentirte mejor,el mareo baja .Al parecer saliste de la zona peligrosa!.");
        return 1;
    }
    return 1;
}
Reply
#8

Quote:
Originally Posted by Smoke123
Посмотреть сообщение
Bueno la verdad no quiero abrir un post cuando lo mio se trata de algo,parecido.Siguiendo los tutoriales de Otacon y de irinel ,hize un area radioactiva.Funciona bien,pero me fludea el chat,alguien sabe porque?Se que es un error en OnPlayerUpdate pero no encuentro forma de arreglarlo.Dejo mi OnPlayerUpdate
pawn Код:
public OnPlayerUpdate(playerid)
{
     if(IsPlayerInArea(playerid,-70.06725, 1634.903, 525.5044, 2195.441))
    {
        SendClientMessage(playerid, Azul, "Siente un olor raro y empiezas a marearte...!.");
        SendClientMessage(playerid, Azul, "El mareo es intenso...!.");
        SendClientMessage(playerid,Amarillo, "Al parecer es una zona radioactiva");
        SetPlayerDrunkLevel (playerid, 20000);
    }
    else
    {
        SendClientMessage(playerid, Azul, "Empiezas a sentirte mejor,el mareo baja .Al parecer saliste de la zona peligrosa!.");
        return 1;
    }
    return 1;
}
Puedes utilizar GetTickCount

pawn Код:
new RadioActivoMSG[MAX_PLAYERS];

public OnPlayerUpdate(playerid)
{
    if((GetTickCount() > RadioActivoMSG[playerid]) && IsPlayerInArea(playerid,-70.06725, 1634.903, 525.5044, 2195.441))
    {
        SendClientMessage(playerid, Azul, "Siente un olor raro y empiezas a marearte...!.");
        SendClientMessage(playerid, Azul, "El mareo es intenso...!.");
        SendClientMessage(playerid,Amarillo, "Al parecer es una zona radioactiva");
        SetPlayerDrunkLevel (playerid, 20000);
       
        RadioActivoMSG[playerid] = GetTickCount() + 10000; // Sustituir en MS el tiempo para que salte de nuevo el mensaje
    }
    else
    {
        SendClientMessage(playerid, Azul, "Empiezas a sentirte mejor,el mareo baja .Al parecer saliste de la zona peligrosa!.");
        return 1;
    }
    return 1;
}
Reply
#9

Quote:
Originally Posted by _Zume
Посмотреть сообщение
Puedes utilizar GetTickCount

pawn Код:
new RadioActivoMSG[MAX_PLAYERS];

public OnPlayerUpdate(playerid)
{
    if((GetTickCount() > RadioActivoMSG[playerid]) && IsPlayerInArea(playerid,-70.06725, 1634.903, 525.5044, 2195.441))
    {
        SendClientMessage(playerid, Azul, "Siente un olor raro y empiezas a marearte...!.");
        SendClientMessage(playerid, Azul, "El mareo es intenso...!.");
        SendClientMessage(playerid,Amarillo, "Al parecer es una zona radioactiva");
        SetPlayerDrunkLevel (playerid, 20000);
       
        RadioActivoMSG[playerid] = GetTickCount() + 10000; // Sustituir en MS el tiempo para que salte de nuevo el mensaje
    }
    else
    {
        SendClientMessage(playerid, Azul, "Empiezas a sentirte mejor,el mareo baja .Al parecer saliste de la zona peligrosa!.");
        return 1;
    }
    return 1;
}
Sigue igual,fludea el chat
Reply
#10

Quote:
Originally Posted by Smoke123
Посмотреть сообщение
Sigue igual,fludea el chat
no le pongas en ese callback ponle en otro que sea de cada segundo o haste un timer que se repita cada segundo.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)