Skocz do zawartości

Ranking

Popularna zawartość

Treść z najwyższą reputacją w 06.06.2024 uwzględniając wszystkie działy

  1. Tego kodu jest trochę za dużo, żeby przeanalizować, zwłaszcza, że większość zmiennych nie ma w sumie w przypadku tego pytania związku z sednem problemu (tworzenie krwi, wybranie armora). Spójrz na pętlę z WhatSee. Tam jest takie fajne sprawdzanie po kolei na typach obiektów i JEŚLI zaszła kolizja z danym typem obiektu, to wtedy wybierane jest state (i pętla jest kontynuowana!!!!), ale jeśli nie, to state zmienia się na "idź na środek". } else { show_debug_message("----------------------------NO COLLISION GO TO MIDDLE"); ActualState = WarriorState.GoToMiddle; } Wygląda więc tak, że możesz w jednej pętli znaleźć Enemy[0], ale wtedy nadal sprawdzisz Enemy[1], potem nie znajdzie Enemty[2] więc state będzie na GoToMiddle, ale potem pętla nadal szuka pozostałych obiektów i np. jeśli jest kolizja z o_DroppedHealPotion to do niego podejdzie, a jak nie to znów trafi na state GoToMiddle. Błąd polega więc na tym, że po pierwsze pętla przechodzi wszystkie typy obiektów i nie jest kończona, gdy znajdziesz kolizje, a po drugie, że state ustawia się na GoToMiddle za każdym razem, jak jednego z typów obiektów nie znajdzie (i kolejny typ może to nadpisać). Rzeczy, które można by zrobić to: a) wyjście z pętli for (WhatSee) jak zmieniono state b) ustawienie state na GoToMiddle przed pętlą, żeby pętla ewentualnie nadpisała ten stan, wtedy nie będzie potrzebny ten else (można też zrobić wariant z dodatkową zmienną tymczasową, która sprawdza, czy została znaleziona jakaś kolizja i jeśli nie, to wtedy ustawia GoToMiddle, nie ma tutaj to większego znaczenia, chodzi jednak o to, żeby to nie był else na każdym typie tego co przeszukujesz w pętli WhatSee). Może napiszę nieco jaśniej jak rozumiem Twoją pętlę: var search = [obj_enemyA, obj_enemyB, obj_healhtpack, obj_item]; for(var i = 0; i < array_length(search); i++) { if (collision_circle(...)) { state = <zrob_cos>; // to by się przydał break; w pętli :) } else { state = <idz_na_srodek>; } } I powinno być widać problem. Jeśli np. istnieje obj_enemyA, a nie istnieje obj_item, to zawsze state będzie wybrany, aby iść na środek Np. coś w ten deseń: var search = [obj_enemyA, obj_enemyB, obj_healhtpack, obj_item]; state = <idz_na_srodek>; // domyślny, pętla go ewentualnie nadpisze for(var i = 0; i < array_length(search); i++) { if (collision_circle(...)) { state = <zrob_cos>; break; } } Myślę, że gdyby w debuggerze postawić breakpoint, to byś to bez problemu znalazł Btw. do celów debugowych string(NearObj.object_index) zamienić można chyba na object_get_name(NearObj.object_index)
    1 punkt
Ten Ranking jest ustawiony na Warszawa/GMT+01:00
×
×
  • Dodaj nową pozycję...