Bloqueo Cerebral: Arrays
#1

Tengo una especie de bloqueo cerebral (lol) y no puedo pensar con claridad, tal vez es porque no he comido bien estos dнas, En fin..

Tengo este array:

pawn Код:
new Float:SpawnsZona1[NTOTAL][X_Y_Z] =
{
{X,Y,Z},
{X,Y,Z},
{X,Y,Z}
};
Que vendria siendo

NTOTAL = 2 Comenzando desde el 0
X_Y_Z = 2 Comenzando desde el 0

Y lo que quiero hacer es bбsicamente Spawns por Zonas.


El dilema esta en que, por ejemplo..

Tengo 3 zonas, y quiero meterlas todas en el array...
pawn Код:
#define ZONA1 0
#define ZONA2 1
#define ZONA3 2

new Float:ZoneSpawns[][] =
{
{ ZONA1, 459.5250,2465.1338,23.2761 },
{ ZONA1, 306.6323,2457.8225,16.4766 },
{ ZONA1, 355.1518,2456.6694,16.4844 },

{ ZONA2, -863.4147,1493.9531,20.2046 },
{ ZONA2, -819.0140,1542.0616,27.1172 },
{ ZONA2, -760.0897,1592.1648,27.1172 },

{ ZONA3, 1438.0864,-1709.9441,13.5469 },
{ ZONA3, 1435.2863,-1585.1759,13.3828 },
{ ZONA3, 1483.6156,-1629.5308,14.1484 },

};

new CZone;

(...)
CZone = ZONA1;
OK, entonces quiero hacer spawns random dependiendo de la variable "CZone".
Osease que quiero solamente tomar todos los spawns del array ZoneSpawns que tengan el valor de CZone, es decir,

Si CZone es igual a ZONA2, entonces tomar todas las coordenadas del array ZoneSpawns y a partir de ellas revolverlas para obtener spawns random,
Utilizando un cуdigo como este:
pawn Код:
new Random = random(sizeof(ARRAY_RESULTANTE));
        x = ARRAY_RESULTANTE[Random][1];// 1 = X
        y = ARRAY_RESULTANTE[Random][2];// 2 = Y
        z = ARRAY_RESULTANTE[Random][3];// 3 = Z
No sй si me di a entender.. Gracias!

edito:

Si hay una mejor forma de hacer esto que quiero hacer, tambien me interesaria saberla, gracias.
Reply
#2

Esto pasara por todos las zonas que esta entre "CZone":
pawn Код:
new bool:start_found = false;
for(new i = 0, j = sizeof(array); i <= j; i ++)
{
    if(array[i][zone_id] != CZone)
    {
        if(start_found)
        {
            break;
        }
        continue;
    }

    // Zona esta entre el valor de CZone.

    start_found = true;
}
Nomas asegurate que queden ordenados como lo tienes (lo de ZONA(ID)):
Код:
{ ZONA1, 459.5250,2465.1338,23.2761 },
{ ZONA1, 306.6323,2457.8225,16.4766 },
{ ZONA1, 355.1518,2456.6694,16.4844 },

{ ZONA2, -863.4147,1493.9531,20.2046 },
{ ZONA2, -819.0140,1542.0616,27.1172 },
{ ZONA2, -760.0897,1592.1648,27.1172 },

{ ZONA3, 1438.0864,-1709.9441,13.5469 },
{ ZONA3, 1435.2863,-1585.1759,13.3828 },
{ ZONA3, 1483.6156,-1629.5308,14.1484 },
Reply
#3

Quote:
Originally Posted by SickAttack
Посмотреть сообщение
Esto pasara por todos las zonas que esta entre "CZone":
pawn Код:
new bool:start_found = false;
for(new i = 0, j = sizeof(array); i <= j; i ++)
{
    if(array[i][zone_id] != CZone)
    {
        if(start_found)
        {
            break;
        }
        continue;
    }

    // Zona esta entre el valor de CZone.

    start_found = true;
}
Nomas asegurate que queden ordenados como lo tienes (lo de ZONA(ID)):
Код:
{ ZONA1, 459.5250,2465.1338,23.2761 },
{ ZONA1, 306.6323,2457.8225,16.4766 },
{ ZONA1, 355.1518,2456.6694,16.4844 },

{ ZONA2, -863.4147,1493.9531,20.2046 },
{ ZONA2, -819.0140,1542.0616,27.1172 },
{ ZONA2, -760.0897,1592.1648,27.1172 },

{ ZONA3, 1438.0864,-1709.9441,13.5469 },
{ ZONA3, 1435.2863,-1585.1759,13.3828 },
{ ZONA3, 1483.6156,-1629.5308,14.1484 },
Gracias por responder,

pawn Код:
stock SpawnsForZone(CZone)
{
    new Float:rArray;
    for(new i = 0, j = sizeof(ZoneSpawns); i <= j; i ++)
    {
        if(ZoneSpawns[i][0] == CZone)
        {
            //Como aсadir o hacer un array aqui??
            //algo como:
            rArray[] = x,y,z
        }
    }
    return rArray;
}
Adaptado quedaria de esa manera, pero tengo una pregunta, їComo construyo un array si el valor es igual a Zone para que lo retorne?

creo que no es posible en samp verdad? їExiste otra forma?

Tal vez almacenar el lugar donde se encuentra el spawn,

pawn Код:
new Float:SpawnsFiltrados[][];

stock SpawnsForZone(CZone)
{
    for(new i = 0, j = sizeof(ZoneSpawns); i <= j; i ++)
    {
        if(ZoneSpawns[i][0] == CZone)//id_zona
        {
                          //almacenar lugar?

                         SpawnsFiltrados[i][0] = ZoneSpawns[i][1];//x

                         SpawnsFiltrados[i][1] = ZoneSpawns[i][2];//y

                         SpawnsFiltrados[i][2] = ZoneSpawns[i][3];//z

        }
    }
}
Reply
#4

Quote:
Originally Posted by iSanchez
Посмотреть сообщение
Gracias por responder,

pawn Код:
stock SpawnsForZone(CZone)
{
    new Float:rArray;
    for(new i = 0, j = sizeof(ZoneSpawns); i <= j; i ++)
    {
        if(ZoneSpawns[i][0] == CZone)
        {
            //Como aсadir o hacer un array aqui??
            //algo como:
            rArray[] = x,y,z
        }
    }
    return rArray;
}
Adaptado quedaria de esa manera, pero tengo una pregunta, їComo construyo un array si el valor es igual a Zone para que lo retorne?

creo que no es posible en samp verdad? їExiste otra forma?

Tal vez almacenar el lugar donde se encuentra el spawn,

pawn Код:
new Float:SpawnsFiltrados[][];

stock SpawnsForZone(CZone)
{
    for(new i = 0, j = sizeof(ZoneSpawns); i <= j; i ++)
    {
        if(ZoneSpawns[i][0] == CZone)
        {
                          //almacenar lugar?

                         SpawnsFiltrados[i][0] = ZoneSpawns[i][1];

                         SpawnsFiltrados[i][1] = ZoneSpawns[i][2];

                         SpawnsFiltrados[i][2] = ZoneSpawns[i][3];

        }
    }
}
Sera mejor hacer arrays separados por cada zona, y lo unico que harias es:
pawn Код:
new selected = random(sizeof(array));
Reply
#5

Quote:
Originally Posted by SickAttack
Посмотреть сообщение
Sera mejor hacer arrays separados por cada zona, y lo unico que harias es:
pawn Код:
new selected = random(sizeof(array));
Mm creo que tienes razуn, pero no recuerdo porque habia querido hacerlo de esta forma.. comenzare a escribir todo el cуdigo y si funciona vengo xD y si no pues vengo y escribo para que lo habia hecho de la forma de arirba..
Reply
#6

a lo mejor porque querнas tener un control distinto de el array, o porque tenнas pensado en hacerlo en la ejecuciуn, o sea setear las variables del array en OnGameModeInit por ejemplo, ya estando en un array no es necesario etiquetarle un ID pues ya tiene el ID del index del array, salvo que sean de un tipo de zona y quieras hacer randoms para bъsqueda por tipos entre tipos. el NTOTAL no serб necesario porque ya estбs tomando ese espacio en la memoria desde compilar, y sуlo usas el sizeof
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)