Skocz do zawartości

Jeremiah

Użytkownicy
  • Postów

    145
  • Dołączył

  • Ostatnia wizyta

Odpowiedzi opublikowane przez Jeremiah

  1. Dałem w pytania zaawansowanych :))

     

    Ponieważ pewien bug od kilku lat jest zgłoszony i na razie chyba nie będzie naprawiany (http://bugs.yoyogames.com/view.php?id=16962), a Game Maker nie ma żadnej funkcjonalności, która sprawdzi, czy capslock jest włączony, czy nie, chciałem was zapytać, czy macie jakieś rozwiązanie tego problemu? Potrzebuję to do chatu na serwerze, ręcznie ustawiłem, że alt + A wrzuci nam w keyboard_string znak "ą", a z przytrzymanym shiftem "Ą", ale nie dam rady tego zrobić dla capslocka. Może jakieś rozszerzenia?

  2. Pomoże ktoś z jakimś dziwnym błędem? Opieram się na tym opisie:

     

    https://forum.gmclan.org/index.php?showtopi...p;hl=networking

     

    ale nie działa mi wysyłanie.

     

    Gdy ktoś się łączy mam:

     

    GML
    sok++

    ds_list_add( global.socketlist, sock )

    ds_map_add( global.clients, sock, sok )

     

    Ale gdy coś wysyłam:

     

    GML
    var buff = buffer_create(256, buffer_grow, 1)

    buffer_seek(buff, buffer_seek_start, 0)

    buffer_write(buff, buffer_s16,99)

    buffer_write(buff, buffer_string, mesedz)

    for (var i = 0; i < ds_list_size(global.socketlist); i++)

    {

    network_send_packet(ds_list_find_value(global.clients, i), buff, buffer_tell(buff));

    }

     

    ... w ogóle nie wysyła, wywala błąd "network_send_packet argument 1 incorrect type (5) expecting a Number (YYGI32)"

    A gdy sobie zerkam co jest pod ds_list_find_value(global.clients, i) to okazuje się, że "undefined". Dlaczego?

     

    Jak podmieniam na "network_send_packet(i+1, buff, buffer_tell(buff));" to niby wysyła, ale dlaczego nie chce mi działać to powyżej?

  3. 1. No właśnie nie. W create jest tylko zadeklarowanie prędkości, kierunku i jeszcze jednej zmiennej.

    2. Mam odznaczone ;/

    3. Super, dzięki! Niby oczywiste rozwiązanie, a nie pomyślałem o tym.

     

    Hm... co jakiś czas tworzyły się małe obiekty rysujące przezroczysty okrąg... po ich wywaleniu fps-y jakby trochę lepsze, na razie nie spadały poniżej 25. Co i tak nie jest rewelacją, bo widziałem bardziej rozbudowane i ambitne projekty na telefony wykonane dzięki GM. Niemniej, projekt traci trochę na tym wizualnie. Nie da się w ogóle przezroczystych obiektów stosować czy jak? I czy trzeba się z tym pogodzić, czy też kiedyś zostanie to załatane w jakiejś aktualizacji?

    Coś mi tu ciągle nie pasuje, a nie wydaje mi się, bym miał aż tak źle zoptymalizowany kod. Zwłaszcza, że wiele go nie ma :P

     

    Potestuję jeszcze później i zobaczę, czy przy okazji eksport do YYC w końcu wyrobi więcej niż 20 fps. Sytuacja i tak trochę załamuje.

  4. Witam!

     

    Majstruję sobie czasem po robocie małą gierkę na telefony. Nic specjalnego, taki tower defense. Co jakiś czas z góry ekranu nacierają przeciwnicy i toczą walkę z ustawionymi przez nas jednostkami.

    Niemniej trochę zaskoczyło mnie jak bardzo trzeba się skupić na optymalizacji nawet bardzo prostych projektów. Chyba że jest coś nie tak z samym GM lub jego konfiguracją...

     

    Napotkałem następujące problemy:

     

    1. Fala przeciwników pojawia się 10 sekund po pokonaniu ostatniego wroga z poprzedniej. Wtedy co sekundę, w zależności od aktualnej rundy, realizowany jest kod:

    GML
    repeat (5) instance_create(choose(15,60,105,150,195,240,285,330,375,420),(random(200)*-1),corsair)

    Na PC działa normalnie, na zwykłym eksporcie do Androida też było ok (stałe 30 fps). Przy użyciu YYC fps-y spadają do około 20... niby gry miały być szybsze, a tu co? To problem optymalizacji czy konfiguracji GM? Bo plany biorą w łeb, jeśli będę musiał ograniczyć ilość wrogów.

     

    2. Kolejny problem. Przeciwnik może wpaść w obiekt jego wielkości, który ma spowolnić jego ruch. Kod w step jest następujący:

    GML
    if !place_meeting(x,y,wodorosty) then speed=3 else speed=1

    Tutaj też zauważyłem spadek FPS i to również mnie dziwi, ponieważ kod nie jest zbyt skomplikowany.

     

    3. Kolejna sprawa. Aby przeciwnicy nie nachodzili na siebie zastosowałem poniższy kod:

    GML
    var rendz;

    for (rendz=0;rendz<8;rendz+=1)

    {

    if place_meeting(x,y+rendz,enemy)

    {

    speed=0

    }

    }

    Być może trochę łopatologiczny, ale nie wpadłem na lepszy pomysł, w jaki sposób obiekt miałby reagować na inny o tej samej wartości x, a większej do 8 wartości y.

    Podejrzewam, że to może być kolejną przyczyną spadku fps-ów, jedna z jednostek gracza na tej samej zasadzie oblicza dystans przeciwnika od siebie, aby oddawać strzały.

    Normalnie zastosowałbym po prostu "distance_to_object", ale aby doszło do jakiejś interakcji oba obiekty muszą posiadać tę samą wartość x.

     

    4. Stosuję surface na całym ekranie, ale kiedy go usuwam, to nie zauważam dużej różnicy w fps-ach. Swoją drogą, czy na PC i Androidzie używamy inaczej surface czy tak samo?

     

    Na razie to tyle. Generalnie jestem zaniepokojony, bo na ekranie naraz znajdować się będzie co najmniej kilkadziesiąt integrujących ze sobą obiektów, a jeśli gm-owy eksport do Androida nie daje rady przy ledwie kilku-kilkunastu, to plan się strasznie sypie. W dodatku co wnosi YYC, jeśli działa wolniej od zwykłego eksportu?...

     

    Liczę na to, że to nie problemy z kiepskim kodem, tylko coś nie tak z konfiguracją GM.

  5. Rozważam przerobienie swojej gierki na wersję dla trzech graczy i póki co zabrałem się za tworzenie najzwyklejszego w świecie menu. Potrzebuję paru wskazówek i informacji.

    Generalnie połączenie się trzeciego gracza raczej działa. Każdy gracz ma nadane prawidłowe ID, widzi ilu jest graczy na serwerze.

    "global.otherplayer" czyli gracz, do którego wysyłamy informacje to dla hosta drugi gracz, a dla obydwu graczy host.

    "global.otherplayer2" to dla hosta i drugiego gracza gracz numer 3, a dla gracza numer 3 gracz numer 2

     

    Gracze wysyłają do siebie prośby o przesłanie ich nicku. Między hostem i drugim graczem oraz hostem i graczem numer 3 jest on wysyłany bezproblemowo. Ale między graczem 2 i 3 nie da się nic wysłać. Założyłem więc, że bez pośrednictwo hosta się to po prostu nie da. Poprawcie mnie, jeśli się pomyliłem w tym założeniu.

    No to zrobiłem coś takiego, że jeśli host otrzyma od gracza numer 3 informacje o jego nicku (działa bezproblemowo) to wysyła do gracza numer 2 nick gracza numer 3.

    Tutaj już kompletnie się pogubiłem... z jakichś przyczyn gracz numer 2 chyba nie uznaje tego, by przesłać mu nick gracza numer 3 nawet za pośrednictwem hosta xp przesyłam kod"

     

    Host otrzymuje informację o nicku gracza numer 3 i przesyła ją do gracza numer 2:

     

    GML
    case 211:

    global.gracz3nick=readstring()

    clearbuffer()

    writebyte(212)

    writestring(global.gracz3nick)

    sendmessage(global.otherplayer)

    break;

     

    Gracz numer 2 otrzymuje tę informację.

     

    GML
    case 212:

    global.gracz3nick=readstring()

    break;

     

    Nie wiem czemu, ale to nie działa.

     

    EDIT coś gdzieś tam zmieniłem i działa, muszę tylko ogarnąć co :D

     

    Niemniej pozostaje pytanie: nie da się wysyłać informacji między graczem 2 i 3 bez pośrednictwa hosta?

  6. Czy ktoś wykonuje pracę na ten konkurs? Ja kończę jeden projekt, ale kompletnie nie wiem do kiedy powinienem go zrobić... niby czas do 31 stycznia, ale to jest czas na wysłanie gry do certyfikacji czy jej przejściu przez certyfikację? Jak mniemam, to drugie. I tu pytanie brzmi - ile ona trwa? Bo jak tydzień to już nie mam co przy tym siedzieć...

  7. Witam, problem jest następujący"

     

    GML
    kolor=choose(4030946,924927,4414207)

     

    Powyższy kod w Create zawsze wybiera ostatnią wartość z podanych ;)

    Żeby było śmieszniej, łaskawie losuje kolor dopiero gdy kod wykonuje się po wciśnięciu jakiegoś klawisza, a nie w create ;)

     

    Niech mi ktoś to logicznie wytłumaczy i napisze, czy gdzieś coś trzeba w Game Makerze odznaczyć, żeby to znowu działało, czy też mam zmienić kod i losowy wybór dwóch wartości rozpisać na dwadzieścia linijek zamiast jednej?

     

    EDIT: NOTE: This function will return the same value every time the game is run afresh due to the fact that GameMaker:Studio generates the same initial random seed every time to make debugging code a far easier task. To avoid this behaviour use randomize or random_set_seed at the start of your game.

     

    Kiedyś życie było prostsze...

  8. No właśnie przerabiam teraz kod tak, że pozycja gracza wysyłana będzie tylko po wciśnięciu klawiszy ruchu, a raz na jakiś czas (sekunda będzie ok?) wysyłać będzie dokładną pozycję x i y.

     

    Tak prawdę powiedziawszy wydaje mi się to dziwną metodą na likwidację lagów. Nie siedziałem nigdy jeszcze w kodzie multi, więc może to normalne, a tylko mi wydaje się dziwne.

     

    Hipotetyczna sytuacja. Czy wysyłane co step info o pozycji obiektu tak samo obciąża serw co tworzenie co step jakiegoś obiektu, na przykład pocisku?

  9. Cóż, to wiele tłumaczy. Spróbuję jeszcze jednej sztuczki, a jeśli nie pomoże to niestety, będę musiał porzucić projektu. Pozycje postaci muszą być jednak aktualizowane dość często ;/ chyba, że jest jakiś sposób, żeby zachować płynność ruchów graczy, którzy dynamicznie zmieniają swoją pozycję? I czy ten faucet networking byłby tutaj lepszy?

     

    Jedno mnie tylko dziwi - dlaczego praktycznie we wszystkich tutorialach autorzy wysyłają coś co step?

     

    Edit: a jak to wygląda z tymi nowymi funkcjami do tworzenia gier sieciowych, które zawarto w Studio?

  10. Ogarnąłem tamto jakoś. Teraz problem to lagi XD

     

    Co step wysyłam pozycje x i y postaci graczy. W dodatku serwer wysyła w ciągu sekundy około kilkunastu informacji z pozycjami x, y, a czasem speed i direction tworzonych w grze obiektów. Czy tak monstrualne rozmiary informacji mogą być przyczyną tego, że gra laguje?

     

    Na localu działa ok. Przekierowywałem porty, wyłączałem jakieś pierdoły, hamachi i takie tam. Wątpię, by to była wina routera, jeśli z gościem, z którym gram w o wiele bardziej wymagające gry bez lagów ten dziwaczny problem występował.

  11. O ile master nadaje ID, a wysylajac informacje o zrobieniu obiektu wysyla dokladnie takie samo ID, aby klient je sobie ustawil, nie powinno byc problemu.

    No tak mam zrobione. WSZYSTKIE obiekty tworzone są przez serwer, serwer nadaje im ID i wysyła do klienta. Podczas testów wyświetlam sobie przy obiektach ich id i jego nadawanie działa poprawnie :/

     

    Nie wiem co jeszcze może być nie tak. Pewnie po prostu jak jest 10 lub więcej obiektów na ekranie to 39dll nie wyrabia. Na to gubienie pakietów można jakoś poradzić?

  12. Ogarnę kiedyś ten faucet networking, bo ten 39dlll chyba faktycznie do niczego się nie nadaje.

     

    Po przypisaniu własnych id problem nie zniknął choć jest trochę rzadszy. Z jakichś powodów czasem obiekt zamiast się usunąć przyklei się do celu i tak sobie do ciężkiej cholery tkwią... mam wrażenie, że cały wysiłek na marne idzie.

     

    Co może być jeszcze przyczyną? To, że w roomie jest do kilkudziesięciu obiektów naraz? Tylko pozycje x i y postaci graczy wysyłane są co step, WSZYSTKIE inne wysyłane są wyłącznie w momencie tworzenia. Mnie zaraz szlag z tym trafi.

  13. Ogarniam sobie 39dll i w ramach tego majstruję małą gierkę. Z góry schodzą przeciwnicy i rzucają piłeczkami w postacie graczy. Generalnie ruch postaci, botów i pocisków ogarnąłem. Przy graczach wysyłam co stepa info o pozycjach x i y, przy pociskach i botach informacja jest wysyłana tylko raz z serwera do klienta - z informacjami na temat początkowych pozycji x, y oraz speed i direction. Generalnie raczej działało cacy i nie było problemów.

     

    Problemy mam, kiedy dochodzi do trafienia bota przez pocisk gracza. Czasem działa poprawnie, ale cóż... raz na jakiś czas zdarzy się, że klient będzie widział tylko pocisk "przyklejony" do przeciwnika i obydwa nie raczą się usunąć z mapy.

     

    Dobra, a teraz jak to wygląda technicznie.

     

     

    Obiekt: bot; event: kolizja z pociskiem

     

    if global.host

    {

    with (other) instance_destroy()

    clearbuffer()

    writebyte(13)

    writeint(id)

    sendmessage(global.otherplayer)

    instance_destroy()

    }

     

     

    Obiekt: pocisk; event: destroy

     

    if global.host

    {

    clearbuffer()

    writebyte(9)

    writeint(id)

    sendmessage(global.otherplayer)

    }

     

     

    Obiekt: gracz 2; event: step

     

    case 9:

    var delette;

    delette=readint()

    with (delette) instance_destroy()

    break;

     

    Co do case 13 to tak samo to wygląda. Z początku we wszystkich usuwanych obiektach wysyłało 9, ale szukając rozwiązania dodałem dodatkowe, sądząc, że być może po prostu za dużo tego wysyła czy coś.

    Tak to wygląda, ma ktoś jakiś pomysł, radę? Przypomnę, że czasem pocisk i bot nie usuną się po kolizji na ekranie klienta.

  14. Odświeżam sobie zabawę z 39dll i bazując na starych przykładach podczas testowania gierki wyskakują mi w GM błędy tego typu:

     

    In Object object0, in Event UserEvent0 action number 1 at line 6 : function "sendmessage" expects 4 arguments, 1 provided

     

    Co ciekawe, po wyeksportowaniu aplikacji do exe działa prawidłowo i bez jakichkolwiek problemów. Błąd pojawia się tylko w okienku "Compile Errors" podczas testowania gry bez exportu. Jak się pozbyć tego problemu, aby móc normalnie testować grę, a nie za każdym razem exportować do exe?

×
×
  • Dodaj nową pozycję...