[Tutorial] Usando matrizes para agilizar o desenvolvimento
#1

Usando matrizes para aumentar a produtividade


Нndice
  • Introduзгo
  • Importante
  • Matrizes: Teoria
  • Criando um sistema de GangZones dominбveis
Introduзгo

Decidi fazer este tutorial porque nгo aguentava mais ver cуdigos como:

PHP код:
new 
    
donocasarao,
    
donopista
ou entгo:

PHP код:
public OnPlayerEnterCheckpoint(playerid)
{
if (
estaemtallugar)
    
SetPlayerCheckpoint(...);
if (
estaemoutrolugar)
    
SetPlayerCheckpoint(...);

Mas qual o problema de cуdigos como este? Alйm do claro problema de manutenзгo (й muito trabalhoso atualizar um sistema desse), й muito complicado adicionar um novo local, sгo necessбrias muitas linhas de cуdigo para fazer algo simples como uma rota completa de motorista, ou uma carga de caminheiro. Sim, todos estes sгo sistemas extremamente simples de serem feitos, e se forem feitos da forma correta, й possнvel adicionar uma nova rota ou um novo territуrio dominбvel com apenas um linha.

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]; 
Porйm poucos sabem o que de fato fazem quando criam uma matriz como esta. Uma matriz nada mais й que uma tabela. Portanto, o cуdigo acima pode ser visualmente descrito como:



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

    {
3480.000.005.00},
    {
3501238.00542.0010.00}
}; 
Aqui relacionamos IDs de pickups com seus respectivos modelos e suas coordenadas X, Y e Z. Baseando-se nesta matriz, podemos criar um sistema que automaticamente cria todas as pickups declaradas nesta matriz:

PHP код:
CreatePickups()
{
    for (new 
0<= sizeof(gPickups) - 1; ++i)
        
CreatePickup(gPickups[i][modelo], 1gPickups[i][x], gPickups[i][y], gPickups[i][z]);

Agora com muita calma vou explicar o que estб acontecendo. O loop FOR estб percorrendo a matriz inteira, independente de seu tamanho. Por quк? Porque ele comeзa em 0 e vai atй sizeof(gPickups) - 1, que й a ъltima posiзгo da matriz (ou seja, seu tamanho - 1, pois os нndices comeзam em 0. Portanto uma matriz com SIZEOF = 5, tem a posiзгo inicial = 0 e final = 4). Concluindo, o FOR passa por cada нndice da matriz.

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], 1gPickups[0][x], gPickups[0][y], gPickups[0][z]);
CreatePickup(gPickups[1][modelo], 1gPickups[1][x], gPickups[1][y], gPickups[1][z]); 
Espero ter sido claro, й fundamental entender este mecanismo do FOR para continuar com o tutorial. Qualquer coisa me avisem, por favor.

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

Acho que tudo й auto explicativo, sу vou dar uma atenзгo para o vetor OrgsPodemDominar. Este vetor possui 10 posiзхes, onde cada uma delas й uma org que pode dominar o territуrio atual (ID atual). Nгo й obrigatуrio que todas as posiзхes sejam usadas!
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", {547910}, 042.0045.2454.2012.3false},
    {-
1"Favela", {547910}, 042.0045.2454.2012.3false},
    {-
1"Casarгo", {12,  5}, 042.0045.2454.2012.3false},
    {-
1"Groove Street", {18142675}, 042.0045.2454.2012.3false}
}; 
Os prуximos cуdigos farгo com que ao adicionar uma linha nesta matriz, um novo territуrio dominбvel e funcional seja criado:

PHP код:
CreateTerritorios()
{
    for (new 
i<= sizeof(Territorios) - 1; ++i)    
        
Territorios[i][GangZone_ID] = GangZoneCreate(Territorios[i][MinX], Territorios[i][MinY], Territorios[i][MaxX], Territorios[i][MaxY]);
    

Certo, a gangzone foi criada segundo a lуgica anterior. Agora basta uma funзгo para verificar se um jogador pode dominar o territуrio, e o sistema sу precisa ser adaptado em um comando:

PHP код:
bool:PlayerPodeDominar(playeridtrid//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 i10; ++i)
        if (
Territorios[trid][OrgsPodemDominar][i] == PlayerInfo[playerid][pOrg])
            return 
true;
    return 
false;

Outras funзхes que podem ser facilmente criadas com esta matriz, e funcionarгo com todo territуrio declarado na matriz:

PHP код:
//Lembrando que trid й o ID do territуrio, nгo da gangzone criada
boolIsPlayerInGangZone(playeridtrid); 
boolEstaEmGuerra(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 
Espero ter demonstrado como as matrizes podem ser ъteis e como todo gamemode deveria aproveitб-las melhor. Um bom exemplo de gamemode que usa as matrizes de forma inteligente й o PPC Trucking, onde criar uma rota de caminhгo, motorista de фnibus e piloto й extremamente simples, pois ele segue esta lуgica de matrizes. Quem tem um servidor neste estilo e jб se dedicou a estudб-lo, percebeu a "mбgica" que ele faz quando se altera as matrizes dele, tudo й integrado ao gamemode sem que mais coisas tenham que ser feitas. Na minha opiniгo, vale a pena se dedicar a adaptar seu gamemode no que for possнvel a este sistema, pois serб mais fбcil adicionar coisas nele, dar manutenзгo e corrigir bugs, pois uma vez atualizado, tudo que depender dele (comandos, dialogs, etc) ficarб atualizado e desbugado.


Por favor, deem dicas para melhorar o tutorial no que for possнvel e deem sugestхes. Obrigado.
Reply


Messages In This Thread
Usando matrizes para agilizar o desenvolvimento - by Juniiro3 - 26.06.2015, 19:44
Re: Usando matrizes para agilizar o desenvolvimento - by pWesley - 26.06.2015, 19:57
Re: Usando matrizes para agilizar o desenvolvimento - by MacMillan_ - 26.06.2015, 20:02
Re: Usando matrizes para agilizar o desenvolvimento - by Juniiro3 - 26.06.2015, 20:06
Re: Usando matrizes para agilizar o desenvolvimento - by zSuYaNw - 26.06.2015, 20:10
Re: Usando matrizes para agilizar o desenvolvimento - by Dayvison_ - 26.06.2015, 20:20
Re: Usando matrizes para agilizar o desenvolvimento - by MacMillan_ - 26.06.2015, 20:26
Re: Usando matrizes para agilizar o desenvolvimento - by HaRdiiZin - 26.06.2015, 20:31
Re: Usando matrizes para agilizar o desenvolvimento - by Juniiro3 - 26.06.2015, 21:11
Re: Usando matrizes para agilizar o desenvolvimento - by MacMillan_ - 27.06.2015, 01:11

Forum Jump:


Users browsing this thread: 1 Guest(s)