Skocz do zawartości

I am vader

Użytkownicy
  • Postów

    1 887
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    20

Odpowiedzi opublikowane przez I am vader

  1. No, brawo brawo! Ale mnie zastanawia ten wydawca, niczego "dużego" nie wydał, wszędzie są tylko garstki ocen tu i tam. Ani jedna gra przez nich wydana nie przebiła 100 ocen.

  2. Aktualizacja pingu:

    ///NetServerGetPing(Socket);
    var _sckpos = ds_list_find_index(PlayerSocket,argument0);
    if _sckpos!=-1{
     var ct = floor(get_timer()/1000);
     PlayerTimeout[| _sckpos] = ct;
     PlayerPing[| _sckpos] = ct - PlayerPingStamp[| _sckpos];
     PlayerPingStamp[| _sckpos] = ct;
     NetServerSendPing(argument0);
    }

     

    Po wykonaniu NetServerSendPing(argument0); serwer oczekuje wiadomości zwrotnej która ponownie wywoła powyższy skrypt. Innymi slowy liczony czas to czas od wywołania aktualizacji do wywołania aktualizacji.

    Kod nie wykonuje się w stepie tylko w Asynchronous Networking, więc powinien działać POZA stepem, szybciej od niego, tak szybko jak szybko przychodzą pakiety.

    Chyba że czegoś nie wiem o asynchronousie i wykonuje on się tylko tyle razy na sekundę co step.

  3. Czy jest jakiś dokładniejszy sposób na pomiar aktualnego czasu niż get_timer()? Nie chodzi mi o jeszcze drobniejszą skalę czasu, tylko coś co faktycznie obecny "moment" zwraca.

    Bo get_timer i current_time aktualizują swoje wartości co step, a ja potrzebuje czegoś co zwróci czas pomiędzy stepem. Po co mi to? Do obliczenia pingu. Jak licze (czas obecny - czas wysyłki) to zawsze wynik jest wielokrotnością 16 lub 17, bo 1 step zabiera 16.66ms przy 60 stepach na sekundę.

     

    Edit: Alternatywnie to może być jakiś błąd GM'a bo kiedyś sprawdzałem jak długo wykonuje się skrypt używając get_timer przed i po skrypcie i działało - wyświetlało mikrosekundy różnicy. A jak używam tego w funkcji do asynchronous to już nie działa tak.

  4. Jakkolwiek nazwałeś zmienną w lini 1 w stepie ObjNPC, istnieje WBUDOWANA zmienna o takiej nazwie i nie można jej redefiniować(jest tylko do odczytu).

    Zmień nazwę zmiennej.

     

    Edit: A i poprzednia pozycja to xprevious, nie xprev, chyba ze chcesz ręcznie zaprogramować zapisywanie ostatniej pozycji

  5. Zazwyczaj w przypadku błędów lepiej jest zostawić je w oryginalnym języku, aby byly zrozumiałe dla tych którzy już znają(i rozumieją) błędy GM'a. Plus, oryginalne błędy da się wygooglować. To co napisałeś nic mi nie mówi.

    Znaczy, poza drugim błędem który brzmi jak błąd w INNYM miejscu w kodzie. Najlepiej wklej cały error bo mam wrażenie że zchrzaniłeś w innej części kodu.

  6. Wiesz, nie każda rasa musi mieć unisexową klasę militarną, nie było kobiet(poza USSR) w trakcie 2 wojny światowej, na ten przykład. Z drugiej strony może i być rasa a'la amazonki. Zależy jak na to patrzeć.

  7. Może to kwestia modelu? clamped sugeruje ze jest to zamkniete miedzy dwiema wartosciami i wartosc minimalna moze byc malo plynna, probowales uzyc nieclampniętego liniowego albo exponent?

     

    Edit: Z dokumentacji wychodzi że clamp działa na minimalny dystans, nie maksymalny. Nie mam pojęcia jak temu zaradzić w łatwy sposób. Możesz zawsze ręcznie zaprogramować listener robiąc grupę audio i zmieniając jej głośność w zależności od dystansu.

  8. Widzisz, są dwa sposoby na kolizje:

     

    1. Wszystko sie rusza jak chce, a jesli wykryje ze cos w cos wlazlo, to wypycha jedna z rzeczy zeby sie juz nie stykaly.

    2. Wszystko sprawdza czy moze sie ruszyc bez kolidowania z innymi obiektami. Jezeli nie ma kolizji, ruch jest dozwolony.

     

    Ty korzystasz z metody 1szej, która jest...słaba, żeby się nie wyrażać, a w każdym razie ja nie jestem jej fanem.

    Proponuję Ci zrobić ruszanie się i kolizje na nowo, używając metody #2, a ruszanie się po skosach wyjdzie Ci automagicznie samo z siebie po dodaniu drobnych poprawek. do kodu poruszania się.

     

    Przykładowo, ruch w prawo może wyglądać na jeden z dwóch poniższych sposobów:

    if place_free(x+5,y) x+=5; //Metoda 1sza, dziala na wszystkie obiekty SOLID
    if !place_meeting(x+5,y,Parent_Obiektow_Solidnych) x+=5; //Metoda 2ga, dziala na obiekt Parent_Obiektow_Solidnych i ich wszystkie dzieci

     

    Dla płynnego poruszania się możemy użyć pętli for:

    for(var i=0;i<5;i++){
     if !place_meeting(x+1,y,Parent_Obiektow_Solidnych) x+=1;
    }

     

    Nastepnym krokiem jest dodanie "co jeśli jednak jest kolizja" czyli:

    for(var i=0;i<5;i++){
     if !place_meeting(x+1,y,Parent_Obiektow_Solidnych) x+=1;
     else{
      //Co jeśli jest kolizja na x+1
     }
    }

     

    Ten kod musimy wypełnić sprawdzeniem czy jeżeli podniesiemy się o Y pikseli do góry czy nie będzie kolizji. W ten sposób powstaje ruch po skosie!

    for(var i=0;i<5;i++){
    if !place_meeting(x+1,y,Parent_Obiektow_Solidnych) x+=1;
    else{
    var _max = 4; //Maksymalny skos to 4 piksele do gory i 1 piksel w bok. Zamien na dowolna liczbe ktora Ci pasuje.
     for(var j=0;j<_max;j++){ 
      if !place_meeting(x+1,y-j-1,Parent_Obiektow_Solidnych) //Jezeli znalazlo wolna przestrzen
      {
       x+=1;
       y+=j-1;
       break; //Przerwij te petle bo juz znalezlismy skos.
      } 
     }
    }
    }

     

    Takie ostrzezenie, pisze to 100% z głowy więc może nie działać, w najgorszym wypadku po małych poprawkach powinno działać.

    Edit: Ciagle zapominam ze nie ma juz tagu gml.

    Edit2: Poprawiono kod na dzialajacy i poprawiono czytelnosc kodu dla potomnych i inncyh zagubionych duszyczek szukajacych rozwiazania.

     

×
×
  • Dodaj nową pozycję...