Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Tablica dynamiczna zawierająca tablicę dynamiczną


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
2 odpowiedzi w tym temacie

#1 Fili:P

    Godlike

  • Power User

Reputacja: 754
Guru

  • Postów:1 679
  • Imię:Darek
  • Lokalizacja:Warszawa
Offline

Napisano 19.07.2014 11:56

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


  • +
  • -
  • 0

#2 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 19.07.2014 12:49

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).
  • +
  • -
  • 1

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#3 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 459
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 22.07.2014 17:37

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

  • +
  • -
  • 1
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych