Skocz do zawartości

Konrad-GM

Użytkownicy
  • Postów

    2 728
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    44

Odpowiedzi opublikowane przez Konrad-GM

  1. Bezmyślne kopiowanie kodu jest Twoim największym wrogiem teraz :P Postaraj się, powoli ale do przodu, zrozumieć jak działa Twój kod i dlaczego on tam w ogóle jest. Sprawdź każdy skrypt, każde wywołanie funkcji, gdzie masz przechodzenie do następnego poziomu room_goto, prześledź, co i dlaczego Ci wykonuje ten skrypt. Ja tu widzę dwa główne problemy:

     

    1. W obj_game_controler w evencie Step masz taką linijkę:

    if (global.life > 0) 
    {
    global.life -=1;
    }
    // (...)

    Czy to Cię nie niepokoi? Przecież co Step tracisz życie, czyli 60x na sekundę tracisz życie. Czy na pewno tak to powinno wyglądać?

     

    2. Nie trzymasz żadnego formatowania kodu, co dzieląc się kodem tutaj z nami na forum, to kompletnie nie mam ochoty tego czytać, ale pewnie inni też tak mają :P Szanuj nas i nasz czas w zrozumieniu Twojego kodu, jeżeli Ty nie możesz tego zrobić/nie chcesz, to tym bardziej komuś się nie będzie chciało.

  2. Kod jest jak najbardziej poprawny, ale kolejność wykonywania zdarzeń Step tutaj Ci już przeszkadza. Zrób poruszanie planetą (keyboard_checki) w Begin Step zamiast Step.

     

    Kolejność wykonywanych zdarzeń w tym wypadku jest ważna, ponieważ wygląda to tak:

    1. Aktualizuj Drzewa - ustaw pozycję i użyj stary obrót planety

    2. Aktualizuj Planetę - ustaw nowy obrót planety

    3. Rysuj scenę - rysuje Ci Drzewa i Planetę, ale Drzewa pamiętają tylko stary obrót Planety

     

    Jak w obiekcie Planeta zmienisz Step na Begin Step, to będzie wyglądać to tak:

    1. Aktualizuj Planetę - ustaw nowy obrót

    2. Aktualizuj Drzewa - ustaw pozycję i użyj nowy obrót planety

    3. Rysuj scenę - Drzewa jak i Planeta już są dobrze rysowane

  3. Przetestuj różne ustawienia, które najlepiej będą działać dla Twojego projektu. Tutaj nie ma najlepszego, jedynie słusznego wyboru, staraj się, żeby wykonywać jak najmniej tzw. "draw calls", jeżeli chcesz optymalizować rendering oczywiście.

     

    Rozmiar tekstur do potęgi dwójki ma na celu zoptymalizowanie rysowania jak i zachować kompatybilność z prawie każdym GPU. Większość nowszych GPU wspiera tekstury NPOT, ale najwyraźniej GM idzie bardziej w kompatybilność sprzętową.

  4. Nie zostaną pewnie nawet podzielone na texture pages, bo dwie tekstury 3840x2160 (i więcej oczywiście) nie mieszczą się w atlasie o rozmiarze 4096x4096. Chyba, że inne sprite dołączą się do tego samego texture page. Tła musiałyby być podzielone na 2048x2048 (a właściwie to 2046x2046, ale to poniżej dlaczego), żeby zmieściły się 4 w jednym atlasie, bądź po prostu trzymaj się rozmiarów 4096x4096 na tła. To już decyzja którą sam musisz podjąć mając na uwadze wymagania projektu.

     

    Jeszcze pozostaje kwestia obramowania - jeżeli zmieścisz więcej jak jedną teksturę na atlasie, to pozostaje problem z wrapowaniem pikseli przy interpolacji. Defaultowo GM2 używa opcji 'clamped' co rozwiąże Ci większość problemów z interpolacją pikseli. A więc wynikowy rozmiar wrzucony do texture page i tak będzie większy niż 3840x2160 (zapewne zostanie rozszerzony do 3842x2162):

    texture_page_results.png

     

    Opcję tę można wyłączyć wymuszając ładowanie tła na oddzielnym texture page.

     

    Pamiętaj również, że jak tekstura będzie większa jak texture page, to zostanie zeskalowana w dół.

  5. 1. Tekstura i tak zapewne zostanie przydzielona do texture page 4096x4096, ale trzymałbym się pociętych tekstur, żeby w razie zmniejszenia texture page (każdy export ma inny limit) GM nie rzygał błędami przy kompilacji.

    2. Nie widzę przeciwwskazań.

    3. Texture page jest inaczej zwanym atlasem tekstur, a rozmiar ograniczony jest na każdy export ponieważ niektóre GPU nie obsłużą Ci tak dużych rozmiarów tekstur.

    https://docs2.yoyogames.com/source/_build/1_overview/3_additional_information/texture_pages.html

  6. To tak jeszcze dodam od siebie przy postinkrementacji (ta sama zasada przy postdekrementacji) :P 

    var a = 3;
    show_message(string(a++) + ", " + string(a++));
    show_message(a);

    Da wynik "3, 4" i "5", ponieważ postinkrementacja (jak i również postdekrementacja) działa jak funkcja, bo po każdym a++ zwracana jest stara wartość i dopiero dodawana 1. Gdyby w GM istniały referencje, to wyglądałoby to mniej-więcej tak (kod dla przykładu w C):

    int postinc(int &var) {
      int temp = var;
      var += 1;
      return temp;
    }

    I wywołanie postinc wygląda tak:

    // A tutaj kod w pseudo-C, więc też nie do kopiowania :)
    int a = 3;
    show_message(string(postinc(a)) + ", " + string(postinc(a)));
    show_message(a);

     

    Dlatego czasami może być szybsze używanie ++a zamiast a++ (względem wykonywania kodu, nie jego tworzenia ;)), bo pomijamy etap kopiowania wartości do zmiennej tymczasowej. Chociaż taka mikro-optymalizacja w GM jest bezużyteczna, z wiadomych chyba względów. Oraz warto pamiętać, że używanie kilka razy a++ w jednym wywołaniu skryptu/funkcji może dać nieoczekiwany wynik.

  7. Niestety sporo drobnych, acz użytecznych funkcji brakuje Visual Studio, które by mi ułatwiły z pisaniem w C++ i TypeScript/JavaScript. Dlatego w większości czasu i tak korzystam z VisualStudio Code. Chociażby wyświetlanie białych znaków, żeby nie commitować tabulatorów zamiast spacji (ofc. linter przed commitem też może pomóc, ale jakoś wygodniej mi mieć bieżący podgląd co robi IDE), albo zamiana zakończeń linii z CRLF (Windows) na LF (Uinx like) to po prostu koszmar pod Visual Studio, to samo dotyczy się kodowania znaków na UTF-8...

  8. A więc to "problem" z IDE a nie samym językiem czy kodem. Z tą globalną funkcją to zasugerowałem się Twoim ostatnim pytaniem więc stąd ta nadinterpretacja :P Podejrzewam, że używasz Visual Studio - IMO w takim razie jedyne co możesz zrobić, to wyłączyć wyświetlanie wyjątków (PPM na "Output Window", odznacz "Exception Messages") a informacje które Cię interesują wypisywać do konsoli samemu, np. możesz użyć klasy System.Diagnostics.Debug żeby pisać do strumienia "Output Window".

     

    xjOgYf0.png

     

    Nie widzę, żeby Visual Studio miał jakąś funkcję do filtrowania wyjątków np. po nazwie, niestety.

  9. Przekierowanie domeny to akurat nie problem. Jeżeli masz domenę wykupioną na dhosting to możesz dalej ją tam opłacać (poza hostingiem) albo kupić/przenieść gdzieś indziej np. nazwa.pl czy godaddy.pl - jedyne co musisz zrobić, to dodać domenę (virtual host) na swoim hostingu www i zmienić DNS żeby przekierowały na nowy hosting.

  10. Zapewne niewłaściwie podchodzisz do łapania wyjątków. Globalna funkcja łapiąca WSZYSTKIE wyjątki to chyba najgorsze rozwiązanie na które mogłeś wpaść - właśnie przez to masz ten problem. Jeżeli API zapewnia rzucanie wyjątkami, powinieneś je obsługiwać z poziomu swojego kodu już w aplikacji, podczas wykonywania jakiejś funkcji, zwłaszcza jeżeli nie chcesz "pewnych" wyjątków propagować w górę. Minimalizuj korzystanie z globalnej funkcji do łapania wyjątków.

     

  11. Cześć, można się dostać do zasobów przeglądarki poprzez rozszerzenia. Żeby strona miała dostęp do ciasteczek czy localstorage, to musi pochodzić z tej samej domeny co Twój skrypt logowania, bo inaczej przeglądarka Ci nie pozwoli dostać się do ciasteczek czy zasobów innych witryn. Dotyczy to chociażby Facebooka czy Google, jak pojawia Ci się popup z logowaniem to musisz je obsłużyć po stronie swojego serwera i wtedy możesz wymienić się danymi, ale równocześnie nie możesz się dostać bezpośrednio do zasobów Fb czy Google (chociażby przez sesję).

  12. Cześć, nie widzę, żeby w GMie były takie opcje z drag & drop, ale to dość łatwo osiągnąć kodem, wystarczy, że dodasz klocki z takim kodem:

     

    Kod na końcu gry (np. ekran game over) aby dodać gracza do tabeli w obiekcie obj_koniec np. w Create Event:

    /// Dodaj gracza do tabeli wynikow
    var imie = get_string("Wprowadz swoje imie", "");
    highscore_add(imie, score);

     

    Kod w obiekcie obj_tabela do wyświetlania tabeli wyników w Draw Event:

    /// Rysuj tabele wynikow
    draw_highscore(100, 100, room_width - 100, room_height - 100); 

     

  13. Cześć, chyba najprościej będzie zrobić zmienną np. w Create Event obiektu obj_gracz:

    has_gun = false;

     

    Po zebraniu broni ustawiasz zmienną has_gun na Prawda:

    has_gun = true;

     

    A jak masz już strzelanie, to dajesz ten kod do bloku IF, np.:

    if (has_gun) {
    	// kod na strzelanie
    }

     

  14. 24 minuty temu, Patryqss napisał:

    Właśnie się zastanawiam, czy nie dodać każdemu wrogowi paska życia nad głową. Nie wiem tylko czy gra nie będzie przez to brzydko wyglądać. Z dźwiękiem to samo - jak atakujesz czterema strzałami, to czterokrotnie powtórzone "ała" też może słabo brzmieć.

    Nie przejmuj się, że gra będzie "brzydko" wyglądać, lepiej popróbować z różnymi rozwiązaniami a przy tym pouczyć się środowiska.

  15. 8 minut temu, gnysek napisał:

    Webbrowser nie jest oparta o jakiegoś starego Explorera bez trybu porno?

    Używa IE w rzeczy samej, ale chyba żadna wersja IE nie miała trybu porno, przynajmniej ja nie widzę takiej opcji w IE11 na Win10.

     

    A czy to koniecznie musi być M$-owy WebBrowser? Ja bym próbował szczęścia z innymi browserami jak np.http://cefsharp.github.io/ CEF więcej opcji ma i powinien ogólnie lepiej działać imo.

  16. Cześć, możesz użyć funkcji instance_place w obiekcie nadrzędnym np. o_dashboard (o mniejszym Depth, żeby zawsze rysowało tekst na pierwszym planie). Funkcja ta zwraca ID instancji pod danymi współrzędnymi X,Y - mogą to być też współrzędne kursora. Można cały kod zamieścić w Draw Event obiektu o_dashboard:

    var inst = instance_place(mouse_x, mouse_y, o_gwiazda);
    
    if (inst != noone) {
        draw_set_halign(fa_center);
        draw_set_valign(fa_bottom);
    
        var text = 'Star at ' + string(inst.x) + ', ' + string(inst.y);
        draw_text_colour(inst.x, inst.y - 16, text, c_white, c_white, c_white, c_white, 1.0);
    
        draw_set_valign(fa_top);
        draw_set_halign(fa_left);
    }

     

    Jeżeli obiekty o_gwiazda nie mogą mieć z jakiegoś powodu większej maski (żeby nie musieć precyzyjnie myszką nakierowywać), to możesz użyć funkcji instance_nearest w ten sposób:

    var inst = instance_nearest(mouse_x, mouse_y, o_gwiazda);
    
    if (inst != noone && point_distance(mouse_x, mouse_y, inst.x, inst.y) < 10.0) {
        draw_set_halign(fa_center);
        draw_set_valign(fa_bottom);
    
        var text = 'Star at ' + string(inst.x) + ', ' + string(inst.y);
        draw_text_colour(inst.x, inst.y - 16, text, c_white, c_white, c_white, c_white, 1.0);
    
        draw_set_valign(fa_top);
        draw_set_halign(fa_left);
    }

     

×
×
  • Dodaj nową pozycję...