Skakanie po kolei po obiektach 1501 8

O temacie

Autor Bogdan Zwei

Zaczęty 11.11.2017 roku

Wyświetleń 1501

Odpowiedzi 8

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy537
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Ostatnio zastanawiałem się i kombinowałem, jak to osiągnąć? Chodzi mi o to, że jest sobie lista (powiedzmy na podstawie gry) npc, którzy nie są poukładani chronologicznie, tzn. Andrzej jest na numerze 1 tej listy, ale za jakiś czas może być na numerze 186. Teraz chcę, żeby błyskawica przechodziła z przeciwnika na przeciwnika, dobra, robię zapętlenie itd, ale zauważam, że jeden npc jest parę razy uderzany, bo podczas odświeżania listy ten jeden gościu zmienił numer z 4 na 15 i dostał dwa razy. Jak pozbyć się takiego problemu?

Jedyne co mi przychodzi do głowy to tworzenie nowej listy obiektów i kasowanie ich jak zostali uderzeni błyskawicą. Problem w tym, że np. chcę żeby funkcja wywołała się parę razy, np. 15, a jest tylko 12 obiektów i chciałbym, żeby jakieś losowe npc dostały z tej błyskawicy ponownie. Troszkę pointless wydaje mi się robienie nowej listy podczas kiedy poprzednia się skończyła, albo wypełnianie jej ponownie trzema ludkami. Jest jakieś inne rozwiązanie?
 
: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.

mathsicist

mathsicist

Użytkownicy
posty213
Propsy269
NagrodyV
Profesjabrak
  • Użytkownicy
Nie jestem pewien czy do końca zrozumiałem przykład, ale imo może wystarczy dodać atrybut shock który domyślnie miałby flage false i przy uderzeniu błyskawicy sprawdzana byłaby ta flaga. Jeżeli false - uderz; jeżeli true - znajdź inną ofiarę. Po zakończeniu pętli zmieniałbyś atrybut dla wszystkich obiektów z powrotem na false
 

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy537
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Też to jest jakieś wyjście. Nie pomyślałem o tym. Jest tylko problem, jeśli pętla będzie miała się wywołać z opóźnieniem, np. błyskawica będzie przechodziła z przeciwnika na przeciwnika z opóźnieniem, to będzie problem z resetowaniem zmiennej, nie? Z drugiej strony można dodać zmienną "isFinished" jeśli pętla się zakończy i potem kasować z flag "shocked" jeśli "isFinished" będzie na true.

Dziękuję, jeśli ma ktoś inne pomysły, niech śmiało pisze.
 
: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.

mathsicist

mathsicist

Użytkownicy
posty213
Propsy269
NagrodyV
Profesjabrak
  • Użytkownicy
No nie wiem, wydaje mi się że możesz to tak zaimplementować że reset flagi shock/shocked następuje w ostatniej iteracji pętli albo dopiero po wyjściu z pętli.

Poza tym nie rozumiem twojej obiekcji do stworzenia buforu, czyli skopiowania listy na czas ataku błyskawicy. Kopiujemy listę, wrzucamy ją w obieg i usuwamy po zakończeniu pętli. Będzie prawdziwa pseudolosowość, bo Andrzej będzie mógł dostać błyskawicą dwa razy bo miał pecha
 

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer
Jaki to język?
Mi to wygląda na klasyczny wyścig danych. Tzn podczas "uderzenia pioruna" modyfikujesz listę w innym wątku (Ty lub silnik pod spodem). Działanie programu jest niezdefiniowane.
Za mało napisałeś jak to wygląda w kodzie, więc mogę się po prostu mylić :)
Ale na podstawie tego co napisałeś, myślę że, dobrym rozwiązaniem będzie klasyczny mutex.
Czyli gdy jest wykonywana operacja typtu "write" to żaden inny wątek/program nie ma dostępu do sekcji chronionej przez mutex.
 

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1486
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Ledwo rozszyfrowałem o co chodzi OP.

Mi się nie wydaje, że to kwestia wątków, tylko tego że lista obiektów jest generowana od nowa co klatkę przez silnik i ta lista nie jest posortowana.

Ale ogólnie to potrzebne by były jakieś konkrety na temat tego jak Ty obecnie to napisałeś i na jakiej technologii pracujesz.
 
Popisuje się ciągle menda jedna...

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy537
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Obecnie skryptu nie mam, kiedyś coś robiłem, co działało jak łańcuch błyskawic (czyli przeskakiwało po obiektach, które są w liście) i ostatnio do tego wróciłem. Moim problemem właśnie było odpowiednie skakanie po obiektach, problemem zawsze był przeskok z A do B do C do A do C do D itd. Nie miało to tak wyglądać i nie do końca wiedziałem, co z tym zrobić (przez co dodałem zmienną, która to blokowała).

Skrypt wyglądał tak: Obiekt A rozpoczynał to skakanie z obiektu na obiekt, szukał pobliskie obiekty w liście i sprawdzał, czy ten obiekt ma być celem, dostawał także blokadę, która uniemożliwiała powrót do początku, każdy kolejny obiekt także dostawał taką blokadę. Wtedy mi się nie podobało, że czasami obiekt, który był dalej był "priorytetem" dla tej funkcji, więc mierzyłem zasięg i wymuszałem skakanie do bliższego obiektu, ale wtedy pojawiły się problemy, bo skrypt "zamrażał się" na chwilę, żeby znaleźć bliższy obiekt (nie były to jako tako długie freezy, do pół sekundy, ale pół sekundy to cholernie dużo jak chcesz coś szybkiego). Dlatego zastanawiam się, jak osiągnąć to bez opóźnień czy innych problemów.

Dlatego właśnie dałem przykład łańcucha błyskawic. Opisuje on dokładnie efekt który chcę osiągnąć.
 
: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.

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1486
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Szczerze?

Zrób to i się nie pierdol.
Cytuj
Jedyne co mi przychodzi do głowy to tworzenie nowej listy obiektów i kasowanie ich jak zostali uderzeni błyskawicą. Problem w tym, że np. chcę żeby funkcja wywołała się parę razy, np. 15, a jest tylko 12 obiektów i chciałbym, żeby jakieś losowe npc dostały z tej błyskawicy ponownie. Troszkę pointless wydaje mi się robienie nowej listy podczas kiedy poprzednia się skończyła, albo wypełnianie jej ponownie trzema ludkami. Jest jakieś inne rozwiązanie?
Ewentualne zmiany to byłyby tylko uzgrabnienia kodu. Jak chcesz uzgrabnienia, to wrzuć to co masz, to wtedy się pomyśli.
 
Popisuje się ciągle menda jedna...

mathsicist

mathsicist

Użytkownicy
posty213
Propsy269
NagrodyV
Profesjabrak
  • Użytkownicy
 


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