Jak napisać Managera ? 5003 14

O temacie

Autor Siemekk

Zaczęty 17.06.2016 roku

Wyświetleń 5003

Odpowiedzi 14

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Tak więc mój upragniony system powiadomień jest niemal na ukończeniu ^^.Pozostało jedno, najgorsze co może być ;-; czyli Manager, który by ustawiał kolejkę moich wiadomości i renderował je gdy poprzednia się zakończy. Udało mi się ogarnąć taki myk:
func void UIMsg_OneLine_Position(var int hndl, var int value) {
    var UIMsg ptr; ptr = get(hndl);
    var zCViewText text; text = get(ptr.Text);
text.posY = value;
if(text.PosY<3089 && state!=RenderMsg)
{
state=RenderMsg;
Print("Render Msg'a");
}
else if (text.PosY==3089)&&(state==RenderMsg && state!=WaitMsg)
{
state=WaitMsg;
Print("Msg Czeka");
}
else if (text.PosY>3089)&&(state==WaitMsg && state!=EndMsg)
{
state=EndMsg;
Print("Koniec Msg");
};
if(text.PosY==3589)
{
Print_DeleteText(ptr.Text);
state=0;
Print("Return to 0");
};
};
Printy się pojawiają, state zawraca na 0 więc stany wiadomości są gotowe. Tylko że takie rozwiązanie:
if(!state)
{
RenderMsg(text,col,chars);
};
Nic nie da bo ignoruje inne wiadomości... Więc proszę, o podpowiedzi jak (jak jest możliwość to jakimi pakietami) to ogarnąć. Oczywiście rozdam standardowy worek   :ok:
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Taki ofensywny odkop he he ;P
Mniejsza... Teraz powracam z pytaniem już dość prostszym :)
Mam zapisane w zmiennych atrybuty, a raczej w klasie:
class aCMsg
{
var string text;
var int color;
var int first;
var int second;
var int duration;
};
I teraz tak... Zostaje wysłana pierwsza wiadomość gitara. Ale jak potem zachować te zmienne z klasy np. do zmiennej?
Coś w stylu:
var int zapis_zapiszmiennych1; zapiszmiennych1 = cośtam...
i później jak je wyczytać?

Za bardzo nie rozumiem jak by to fajnie ogarnąć :<
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Robisz klasę tej funkcji, a potem tylko zmienna = _@(klasa);

Nie wiem czy aby na pewno, ale powinno zadziałać.
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Chyj :F Leżę na matematyce XD Ale powoli bo już jestem bardzo blisko celu!
Zacznijmy od początku:
Mam zmienną oraz tablicę:
var int aCManager_Next;
var string aCManager_NextText[30]; //Zapisana jako Const
Więc po wysłaniu wiadomości (skrót: msg) dodaję zmiennej aCManager_Next + 1 do wartości. Gdy zmienna jest użyta(ma jakąś wartość) to wiadomości nie renderują się dalej, tylko zostają zapisane do jednej z tablic (Matematycznie to: aCManager_Next - 1;)
Gdy ta zmienna jest większa niż 1 (aCManager_Next > 1) to w funkcji usuwającej Msg'a ma się zrenderować kolejny.
I tutaj pytanie mistrza XD Nie mam pomysłu jak to ogarnąć ale... Jak zrobić (bez x warunków) aby następna renderowana wiadomość była liczona w sposób od 0 do 30, a nie od 30 do 0. Ten drugi sposób jest prosty do zrealizowania... Wystarczy, że zrobię tak:
//Kod
_Manager_RenderNext(aCManager_Next); //Jako argument podaję numer tablicy
//Dalszy kod
Ale jak to zrobić by czytał nie od końca, a od początku  :hmmm: Zapewne jakiś prosty zapis matematyczny, ale ja jestem amebą nie nie mogę wpaść na to rozwiązanie :F
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Zapewne starczy użyć Repeat(x, y); bla bla bla end;, lecz nie wiem do końca o co Ci chodzi. Chcesz żeby gra czytała coś od 0 do 30, a potrafisz tylko zrobić od 30 do 0. Podaj jakiś sensowny przykład (albo swój skrypt).

Chyba, że chodzi Ci o to, ze zmienna (tablica) wynosi już 30 (jest pełna) i chcesz kasować od początku do końca?

zmienna i kawałek matematyki:
tbl = zmienna tablicy, której używasz:

if (tbl == 30) //tutaj tylko prowizorka
{
     repeat(zmienna, tbl);

     //zmienna musi być resetowana do 0 przed repeat. Tutaj dodajesz wszystko co chcesz, żeby działo się od 0 do 30.

     end;
};
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Wiadomo, że jak dodam wartość zmiennej to ma inną wartość xD
To dajmy że wysłałem 10 wiadomości... One muszą się wyświetlić w kolejności w jakiej zostały wysłane...
Oto mi chodzi (Nie wiem jak czytać wartość od początku tablicy, nie od końca)
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Zrób zmienną, która się nalicza od 0 do X (x = twoj maximum wiadomości) i odczytuj na bazie tej zmiennej. Sprawdzaj czy array z numerem takim jak numer zmiennej jest zapełniony, a potem po prostu odczytuj wartość.

Przykład:
zmienna += 1;
ReadStatArray(x, zmienna);
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

Mark56

Mark56

Moderator
som veľký magič
posty1632
Propsy1846
ProfesjaAnimator
  • Moderator
  • som veľký magič
Użyj list z LeGo.  Pierwszy element zrób placeholder by nie stracić handle na list. Jak lista ma więcej niż jeden element (List_HasLength) to wyświetlasz ten drugi (List_Get). Po wyświetleniu go skasujesz (List_Delete).
Nowe elementy sa dodane na sam koniec listy (List_Add).

 


Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Coś w tym stylu? (Nigdy nie bawiłem się Listami)
var int aCManager_List;
/*
func int aCMsg_Create(var string txt, var int col, var int dur)
{
var int mptr; mptr = new (_UIMsg);
var UIMsg msg; msg = get(mptr);
msg.text = txt;  
msg.durTicks = dur;
msg.color = col;
msg.next = 0;
msg.msgView = 0;
msg.next = 0;
return mptr;
};
*/

func void aCManager_Push(var int MsgPtr)
{
aCManager_List = List_Create(MsgPtr); //Zawartość obiektu klasy UIMsg (kolor, tekst etc.)  argumentem jest funkcja "aCMsg_Create"

//To raczej w funkcji  niszczącej View
if(List_HasLength(aCManager_List,1))
{
var UIMsg msg; msg = get(List_Get(list,1));
_SendMsg(msg); //argumentem jest klasa UIMsg...

};
List_Add(aCManager_List, MsgPtr);
};
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Mark56

Mark56

Moderator
som veľký magič
posty1632
Propsy1846
ProfesjaAnimator
  • Moderator
  • som veľký magič

Mark56
Moderator

Jak napisać Managera ?
#9 2017-01-29, 10:14(Ostatnia zmiana: 2017-01-29, 10:24)
Nie. Liste tworzysz tylko raz. A potem kazdy message tylko do niej wsadzasz pomocą Add.
Jeden framefunction sprawdza czy cos jest w liscie, a jak jest to vybiera pierwszy, pokazuje i skasuje.

Chodzi o to by zbudować proste queue
https://www.youtube.com/watch?v=6QS_Cup1YoI
 


Cruc

Cruc

Użytkownicy
posty667
Propsy236
Profesjabrak
  • Użytkownicy
Nie wiem gdzie skierować pytanie, a nie chcę tworzyć nowego tematu.

Czy bez Ikarusa/LeGo jestem w stanie dynamicznie zarządzać pamięcią?
 
while (!success) try{...}

Najlepszy modder od gothic multiplayer - polecam pytać go o wszystko!

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Czy chodzi o coś takiego?
var int Manager_List;
func void MsgManager_Push(var int acmsg)
{
if(Manager_List)
{
List_Add(Manager_List, acmsg);
}
else
{
Manager_List = List_Create(acmsg);
};
};


func void MsgManager_Pop()
{
List_Delete(List_Get(Manager_List));
};

func void DoFrame()
{
if(MsgManager.state == STATE_NONE && List_HasLength(Manager_List))
{
var int hndl; hndl = List_Get(Manager_List);
var UIMsg ptr; ptr = get(hndl);
MsgSend(ptr);
};
};
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Mark56

Mark56

Moderator
som veľký magič
posty1632
Propsy1846
ProfesjaAnimator
  • Moderator
  • som veľký magič
Tak.
Mała rada, chyba nie możesz wyciągnąć pierwszy element listy i go kasować, bo kasowanie pierwszego elementu go tak naprawde nie usunie  (wada implementacji )
 


Lehona

Lehona

Użytkownicy
posty196
Propsy190
  • Użytkownicy
@Siemekk: While your first function looks fine, the other functions show that you haven't looked at the documentation very closely. I'm not sure whether you understood what List_Get() even does (you did... sort of), but in no way does it take only one argument (there'd be no point). You need to specify the node nr (again - first node is 1. I should clarify this on the wiki), too.

Tak.
Mała rada, chyba nie możesz wyciągnąć pierwszy element listy i go kasować, bo kasowanie pierwszego elementu go tak naprawde nie usunie  (wada implementacji )

Kind of. First of all: List nodes are numbered beginning with 1 (really I wish I could undo this... don't know what I was thinking) and deleting the first node does do something: The data value will be set to zero. What it should do (and I thought it did) was just move the next value into its place, iff it exists.

Here's where the problem arises: What do I do if there is no next node? If I just free the node, the handle will be in an invalid state (pointing to free'd memory), but if I just set the value to zero - what is there to distinguish it from the actual value 0?

I don't quite know how to elegantly resolve this and I fear I may have to introduce "managed lists", which will be implemented via the current list functions (there just need to be a couple more lines to account for this special case).
 
Unless specified otherwise, my posts are always about Gothic 2 Night of the Raven.

Mark56

Mark56

Moderator
som veľký magič
posty1632
Propsy1846
ProfesjaAnimator
  • Moderator
  • som veľký magič
I would suggest to fix that issue with brute force.
I mean, shifting the next element in is very reasonable, if there is one. (right now, my queues have to have placeholder element just not to loose handle).
Also I would not worry about making invalid handle, since it is good practise to chceck whether they have valid handle... otherwise you are just writing error prone code.

Tell me about elegancy, if my queues have to have placeholder element, and allways work on second element :D

Solution number 2, would be to make new list package which would eliminate previous errors, also supporting root element with first and last element, for optimalisation. And leave lists as they are.
 



0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry