Tablica dynamiczna zawierająca tablicę dyn...
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 ).
sebul
19.07.2014
enum eOsiagniecie { EONazwa[32], EOOpis[128], Array:EOZmienne, Array:EOCele, EOBron }; new Array:handle; handle = ArrayCreate(eOsiagniecie, 10); // lub _:eOsiagniecieTylko 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).
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:
• Bardzo szybki dostęp do danych
Wady:
• Sztywna ilość danych
• Obszerna zmienna osiagniecie
2. Zmienna osiagniecie to wskaźnik na jednowymiarową tablice Array:
• 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)
• 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
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