[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
#2

Creio que nгo seja sу um jeito mais agilizado, tambйm, um jeito mais organizado de produzir sistemas. Deixei uma reputaзгo para vocк, pois foi bastante interessante essa explicaзгo do uso de matrizes.
Reply
#3

Como eu posso usar isso em diбlogos? Vejo muita gente fazendo isso, colocando as mensagens do diбlogo em matrizes, sу que nгo entendi direito como faz, poderia explicar-me?
Reply
#4

Quote:
Originally Posted by JaumVitor
Посмотреть сообщение
Como eu posso usar isso em diбlogos? Vejo muita gente fazendo isso, colocando as mensagens do diбlogo em matrizes, sу que nгo entendi direito como faz, poderia explicar-me?
Nгo entendi direito sua pergunta, vocк diz gerar uma mensagem para colocar no diбlogo a partir de uma matriz ou deixar a mensagem pronta em uma matriz?
Reply
#5

Quote:
Originally Posted by JaumVitor
Посмотреть сообщение
Como eu posso usar isso em diбlogos? Vejo muita gente fazendo isso, colocando as mensagens do diбlogo em matrizes, sу que nгo entendi direito como faz, poderia explicar-me?
Lembrando que, Matrizes seriam a mesma coisa que em uma array/variavel normal..\


pawn Код:
enum DIR{
     string[128],
     variavel
}
new PlayerData[MAX_PLAYERS][DIR];
Seria a mesma coisa que:
pawn Код:
new PlayerString[128];
new PlayerVariavel;

Porem mais organizado.
Reply
#6

Bom tutorial.
Gostei deste exemplo >

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
}; 
Reply
#7

Quote:
Originally Posted by Juniiro3
Посмотреть сообщение
Nгo entendi direito sua pergunta, vocк diz gerar uma mensagem para colocar no diбlogo a partir de uma matriz ou deixar a mensagem pronta em uma matriz?
Deixar uma mensagem pronta, acho q й isso.
Reply
#8

Уtimo tutorial, parabйns..
Reply
#9

Quote:
Originally Posted by JaumVitor
Посмотреть сообщение
Deixar uma mensagem pronta, acho q й isso.
Vocк nгo precisa de uma matriz para deixar uma mensagem pronta. Mas vou dar um exemplo, um cуdigo que gera um dialog com todos os territуrios criados:

PHP код:
new string[128];
for (new 
i<= sizeof(Territorios) - 1; ++i)
    
format(string128"%s%s\n"stringTerritorios[i][NomeTerritorio]);
ShowPlayerDialog(playeridDialogTerritoriosDIALOG_STYLE_LIST"Territуrios:"string"Ok""Sair"); 
Reply
#10

Quote:
Originally Posted by Juniiro3
Посмотреть сообщение
Vocк nгo precisa de uma matriz para deixar uma mensagem pronta. Mas vou dar um exemplo, um cуdigo que gera um dialog com todos os territуrios criados:

PHP код:
new string[128];
for (new 
i<= sizeof(Territorios) - 1; ++i)
    
format(string128"%s%s\n"stringTerritorios[i][NomeTerritorio]);
ShowPlayerDialog(playeridDialogTerritoriosDIALOG_STYLE_LIST"Territуrios:"string"Ok""Sair"); 
Bom, eu jб tinha entendido mais o menos vendo esse codigo:
http://pastebin.com/tKt3Z489
Obrigado
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)