←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Tablica dynamiczna zawierająca tablicę dyn...

  • +
  • -
Fili:P - zdjęcie Fili:P 19.07.2014

Witam, otóż ostatnimi czasy naszła mnie chęć powrotu do zabawy z pluginami. 

Postanowiłem utworzyć osiągnięcia związane z każdą z broni. Aby ułatwić sobie pracę chce utworzyć prosty system działający przy pomocy tablic dynamicznych. Jaki jest mój problem ? Otóż zwykle przy takich systemach mamy do dyspozycji jedną zmienną "postępu w zadaniu" oraz jedną zmienną "celu zadania" ( Postęp == Cel, osiągnięcie zdobyte ). Chciałbym móc dla każdego osiągnięcia utworzyć dowolną liczbę zmiennych oraz celów. Przedstawiony poniżej rysunek przedstawia przykład kiedy utworzyłem docelowo 2 zmienne postępu i celu ( Oczywiście ilość zmiennych postępu będzie równa ilości zmiennych celu ).

 

projekt.png

Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 19.07.2014

enum eOsiagniecie {
	EONazwa[32],
	EOOpis[128],
	Array:EOZmienne,
	Array:EOCele,
	EOBron
};

new Array:handle;

handle = ArrayCreate(eOsiagniecie, 10); // lub _:eOsiagniecie
Tylko nie wiem, czy na pewno nie wywali jakichś błędów, ale musisz pamiętać o rzutowaniu typów, czyli chociażby
new tmp[eOsiagniecie];
tmp[EOZmienne] = any:ArrayCreate(1, 10);
Ewentualnie próbować z drzewami (trie).
Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 22.07.2014

Fili:P mam dla ciebie conajmniej trzy mozliwości:

1. Zmienna osiagniecie to zwykła tablica ale ma niezwykłe komórki:
#include <amxmodx>


enum _osiagniecie
{
	Nazwa[32] = 0,
	Opis[128],
	Array:Zmienne,
	Array:Cele,
	Bron
}

new osiagniecie[_osiagniecie]

public plugin_init()
{
	copy(osiagniecie[Nazwa],31,"Nazwa osiagnięcia")
	copy(osiagniecie[Opis],127,"Opis osiagnięcia")

	//Tylko przy zmianie wartości trzeba pamiętać o typie danej wartości
	osiagniecie[Zmienne] = _:ArrayCreate(1,2)
	osiagniecie[Cele] = _:ArrayCreate(1,2)
	
	//Przy pobieraniu wartości już pięknie nam pamięta o jej typie
	ArrayPushCell(osiagniecie[Zmienne],15)
	ArrayPushCell(osiagniecie[Zmienne],10)
	
	ArrayPushCell(osiagniecie[Cele],10)
	ArrayPushCell(osiagniecie[Cele],5)

	osiagniecie[Bron] = CSW_KNIFE
}
Zalety:
• Bardzo szybki dostęp do danych

Wady:
• Sztywna ilość danych
• Obszerna zmienna osiagniecie
 
2. Zmienna osiagniecie to wskaźnik na jednowymiarową tablice Array:
#include <amxmodx>


enum _osiagniecie
{
	Nazwa = 0,
	Opis,
	Zmienne,
	Cele,
	Bron
}

new Array:osiagniecie

public plugin_init()
{
	new Array:Data = ArrayCreate(1,_osiagniecie)
	osiagniecie = ArrayCreate(1,1)
	ArrayPushCell(osiagniecie,Data)
	
	ArrayPushCell(Data,ArrayCreate(32,1))
	ArrayPushCell(Data,ArrayCreate(128,1))
	ArrayPushCell(Data,ArrayCreate(1,2))
	ArrayPushCell(Data,ArrayCreate(1,2))
	
	new Array:Handle = Array:ArrayGetCell(Data,Nazwa)
	ArrayPushString(Handle,"Nazwa osiagnięcia")
	
	Handle = Array:ArrayGetCell(Data,Opis)
	ArrayPushString(Handle,"Opis osiagnięcia")

	Handle = Array:ArrayGetCell(Data,Zmienne)
	ArrayPushCell(Handle,15)
	ArrayPushCell(Handle,10)
	
	Handle = Array:ArrayGetCell(Data,Cele)
	ArrayPushCell(Handle,10)
	ArrayPushCell(Handle,5)

	ArrayPushCell(Data,CSW_KNIFE)
}
Zalety:
• Malutka zmienna osiagniecie
• Dynamiczna ilość danych
• Brak potrzebny tworzenia nowych zmiennych przy pobieraniu danych

Wady:
• Złożony proces operacji nad wartościami

3. Zmienna osiagniecie to wskaźnik na wielowymiarową tablicę Array:(Tak jak napisał sebul)
#include <amxmodx>

enum _osiagniecie
{
	Nazwa[32] = 0,
	Opis[128],
	Array:Zmienne,
	Array:Cele,
	Bron
}


new Array:osiagniecie;

public plugin_init()
{
	osiagniecie = ArrayCreate(_osiagniecie, 1)

	new Data[_osiagniecie]
	copy(Data[Nazwa],31,"Nazwa osiagnięcia")
	copy(Data[Opis],127,"Opis osiagnięcia")

	//Tylko przy zmianie wartości trzeba pamiętać o typie danej wartości
	Data[Zmienne] = _:ArrayCreate(1,2)
	Data[Cele] = _:ArrayCreate(1,2)
	
	//Przy pobieraniu wartości już pięknie nam pamięta o jej typie
	ArrayPushCell(Data[Zmienne],15)
	ArrayPushCell(Data[Zmienne],10)

	ArrayPushCell(Data[Cele],10)
	ArrayPushCell(Data[Cele],5)

	Data[Bron] = CSW_KNIFE
	
	ArrayPushArray(osiagniecie,Data)
}
Zalety:
• Malutka zmienna osiagniecie
• Dynamiczna ilość danych

Wady:
• Za każdym razem gdy chcesz operować nad danymi musisz tworzyć wielką tablicę (lub zrobić raz globalną)

Powyższe przykłady robią praktycznie robią to samo gdyż wrzucam do pamięci te same dane ale za to różnymi sposobami/w różne miejsca. Osobiście używam sposobu nr. 2
Użytkownik BlackPerfum edytował ten post 22.07.2014 17:40
Odpowiedz