26.06.2015, 19:44
(
Последний раз редактировалось Juniiro3; 28.06.2015 в 17:06.
)
Usando matrizes para aumentar a produtividade
Нndice
- Introduзгo
- Importante
- Matrizes: Teoria
- Criando um sistema de GangZones dominбveis
Decidi fazer este tutorial porque nгo aguentava mais ver cуdigos como:
PHP код:
new
donocasarao,
donopista;
PHP код:
public OnPlayerEnterCheckpoint(playerid)
{
if (estaemtallugar)
SetPlayerCheckpoint(...);
if (estaemoutrolugar)
SetPlayerCheckpoint(...);
}
Importante
Este tutorial й um tutorial intermediбrio, se vocк nгo tem nenhuma noзгo de o que seja uma matriz, um enum, um loop FOR, este tutorial nгo й pra vocк. Aprenda o que sгo os itens anteriores primeiro, ou tente a sorte lendo o tutorial. Este tutorial pressupхe que vocк sabe pelo menos o bбsico de matrizes
Matrizes: Teoria
Talvez o cуdigo mais comum em todos os gamemodes seja a matriz/array PlayerInfo (e variantes):
PHP код:
enum PlayerData
{
pMoney,
pScore,
pJob,
...
}
new PlayerInfo[MAX_PLAYERS][PlayerData];
Onde para cada playerid existe um elemento do enum PlayerData.
Porйm este raciocнnio, de relacionar IDs com um Enum, pode ser expandido e usado de outras formas:
PHP код:
enum E_PICKUPS
{
modelo,
Float:x,
Float:y,
Float:z
}
new const gPickups[][E_PICKUPS] = //As coordenadas usadas sгo aleatуrias
{
{348, 0.00, 0.00, 5.00},
{350, 1238.00, 542.00, 10.00}
};
PHP код:
CreatePickups()
{
for (new i = 0; i <= sizeof(gPickups) - 1; ++i)
CreatePickup(gPickups[i][modelo], 1, gPickups[i][x], gPickups[i][y], gPickups[i][z]);
}
O CreatePickup cria uma pickup baseada nas informaзхes do нndice da matriz atual. O que este for faz, em outras palavras, й:
PHP код:
CreatePickup(gPickups[0][modelo], 1, gPickups[0][x], gPickups[0][y], gPickups[0][z]);
CreatePickup(gPickups[1][modelo], 1, gPickups[1][x], gPickups[1][y], gPickups[1][z]);
Criando um sistema de GangZones dominбveis
Se a lуgica dos IDs x Enum ficou clara pra vocк, nгo serб difнcil entender como este sistema serб feito. Primeiramente, vamos definir o Enum dos territуrios:
PHP код:
enum E_TERRITORIOS
{
GangZone_ID, //Nгo confundir ID do territуrio com o ID da gangzone que serб criada
NomeTerritorio[30],
OrgsPodemDominar[10],
OrgDona,
Float:MinX,
Float:MinY,
Float:MaxX,
Float:MaxY,
bool:TerritorioEmGuerra
}
Vamos agora а declaraзгo da matriz: (lembrando: cada linha й um territуrio)
PHP код:
new Territorios[][E_TERRITORIOS] = //Novamente, coordenadas aleatуrias
{
{-1, "Pista de Skate", {5, 4, 7, 9, 10}, 0, 42.00, 45.2, 454.20, 12.3, false},
{-1, "Favela", {5, 4, 7, 9, 10}, 0, 42.00, 45.2, 454.20, 12.3, false},
{-1, "Casarгo", {12, 5}, 0, 42.00, 45.2, 454.20, 12.3, false},
{-1, "Groove Street", {18, 14, 2, 6, 75}, 0, 42.00, 45.2, 454.20, 12.3, false}
};
PHP код:
CreateTerritorios()
{
for (new i; i <= sizeof(Territorios) - 1; ++i)
Territorios[i][GangZone_ID] = GangZoneCreate(Territorios[i][MinX], Territorios[i][MinY], Territorios[i][MaxX], Territorios[i][MaxY]);
}
PHP код:
bool:PlayerPodeDominar(playerid, trid) //ID do territуrio, nгo da gangzone criada
{
//Para um player poder dominar um territуrio, uma das orgs do territуrio tem que ser a org dele. Portanto, vamos percorrer todo o vetor OrgsPodemDominar e ver se algum deles й a org do player
for (new i; i < 10; ++i)
if (Territorios[trid][OrgsPodemDominar][i] == PlayerInfo[playerid][pOrg])
return true;
return false;
}
PHP код:
//Lembrando que trid й o ID do territуrio, nгo da gangzone criada
bool: IsPlayerInGangZone(playerid, trid);
bool: EstaEmGuerra(trid); //basta retornar o valor de TerritorioEmGuerra
ColocarEmGuerra(trid); //basta alterar o valor de TerritorioEmGuerra, e piscar a gangzone criada
AtualizarTerritorios(playerid); //Mostra as gangzones para o playerid, com as cores da org que a domina
Por favor, deem dicas para melhorar o tutorial no que for possнvel e deem sugestхes. Obrigado.