Skocz do zawartości

Konrad-GM

Użytkownicy
  • Zawartość

    2614
  • Rejestracja

  • Ostatnia wizyta

  • Wygrane w rankingu

    13

Zawartość dodana przez Konrad-GM

  1. HTML5 i przycisk "wstecz"

    Panowie, a co z window.addEventListener? Można przecież podpiąć eventy tj. 'beforeunload' albo/i 'unload'. Jeżeli chodzi o attachEvent, to IE i canvasy to i tak odpadają, więc można pominąć w ogóle.
  2. Hosting dla GM'owego programu

    Cześć, podeślij jeszcze konfigurację GM Web-api. Znak '%' oznacza po prostu "dowolny ciąg znaków" w tym wypadku adres klienta kończący się na ".devil" (to pewnie jakiś wewnętrzny DNS MyDevila). Jeżeli @gnysek używał MyDevila to powinien wiedzieć jak odpowiednio skonfigurować bazę.
  3. 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...
  4. 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 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". Nie widzę, żeby Visual Studio miał jakąś funkcję do filtrowania wyjątków np. po nazwie, niestety.
  5. Hosting dla GM'owego programu

    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.
  6. 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.
  7. Jeszcze natknąłem się na taki artykuł o js. Dodając prefix gmcallback_ do skryptów w GMie można wywoływać te skrypty z poziomu innych javaskryptów na stronie, np. gml_Script_gmcallback_moj_skrypt(); powinien odpalić Ci skrypt z gry.
  8. 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ę).
  9. Jak stworzyć tabele wyników?

    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);
  10. Bron i strzelanie

    Tak, w drag and drop masz bloki od IF. Powinno to mniej-więcej tak wyglądać:
  11. Bron i strzelanie

    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 }
  12. 12 Prac Herkulesa

    Nie przejmuj się, że gra będzie "brzydko" wyglądać, lepiej popróbować z różnymi rozwiązaniami a przy tym pouczyć się środowiska.
  13. 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.
  14. adresowanie zmiennych

    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); }
  15. Grupowanie obiektów

    To super, że rozwiązałeś problem. Tak dodam jeszcze, że można sprawdzić, czy inst[ i ] nie jest ścianą (np. czy należy do grupy/teamu "walls"), jeżeli tak, to można przerwać pętlę break-em.
  16. Jaką wersję GameMakera używasz? Bodajże wersja 1.4 miała jakieś problemy z losowaniem liczb. Może ktoś bardziej obeznany wie coś więcej na ten temat. PS. Funkcję randomize(); musisz wywołać tylko raz, może w create jakiegoś obiektu?
  17. Grupowanie obiektów

    Moje skrypty są tylko przykładem kompozycji, pomysłem jak można rozwiązać problem z wielokrotnym dziedziczeniem. Nie bardzo rozumiem, dlaczego nie możesz wykonywać skryptu: if collision_line_list(x, y-hot_spot, x+sight_range, y-hot_spot, "grupa", false, true, spotted_list, true){ //seeing closest object var closest = spotted_list[|0]; spotted_point = closest.x-x; ds_list_clear(spotted_list); if (instance_exists(obj_player)) && (closest == obj_player.id) && !(status = state.attack){ // change state to attack status = state.attack; angry = 30; attack_buffer = 60; } else { // not seeing spotted_point = 0; } } W każdym obiekcie z osobna. Dodatkowo żeby sprawdzić "grupę" obiektów, to możesz zrobić coś takiego: var spotted_list = ds_list_create(); var instances = collision_line_list(x, y - hot_spot, x + sight_range, y - hot_spot, par_entities, false, true, spotted_list, true); var enemy_spotted = false; for (var i = 0; i < instances; i++) { var inst = spotted_list[| i]; // sprawdzamy przynaleznosc do teamu if (inst.team == "red" && status != state.attack) { enemy_spotted = true; spotted_point = inst.x - x; status = state.attack; angry = 30; attack_buffer = 60; break; } } if (!enemy_spotted) { spotted_point = 0; } ds_list_destroy(spotted_list); Jeżeli boisz się o optymalizację, możesz ten fragment kodu zamiast wykonywać w Step Event, np. ustawić Infinite Alarm (alarm ustawiający sam siebie) i np. uruchamiać ten skrypt co jakiś czas np. 100ms. (16ms to jedna klatka przy 60fps) Jeżeli chcesz dodać kilka team-ów, możesz zamiast zmiennej team dodawać zmienną teams jako tablicę, np. teams[0] = "red"; teams[1] = "green"; Stworzyć skrypt do sprawdzania zawartości tablicy: /// scr_array_includes(arr, value) var arr = argument0; var len = array_length_1d(arr); for (var i = 0; i < len ; i++) { if (arr[i] == argument1) { return true; } } return false; I wtedy powyższy skrypt z collision_line_list można przerobić na: var spotted_list = ds_list_create(); var instances = collision_line_list(x, y - hot_spot, x + sight_range, y - hot_spot, par_entities, false, true, spotted_list, true); var enemy_spotted = false; for (var i = 0; i < instances; i++) { var inst = spotted_list[| i]; // sprawdzamy przynaleznosc do teamu (z grupy teamow) if (scr_array_includes(inst.teams, "red") && status != state.attack) { enemy_spotted = true; spotted_point = inst.x - x; status = state.attack; angry = 30; attack_buffer = 60; break; } } if (!enemy_spotted) { spotted_point = 0; } ds_list_destroy(spotted_list);
  18. Cześć, może masz jakiś inny skrypt co powoduje znikanie obiektów - instance_destroy albo sprite ma animację która się nie loopuje i przeskakuje na pustą klatkę animacji. W debuggerze sprawdź, czy Ci znikają instancje z room-a.
  19. Grupowanie obiektów

    W zasadzie nie opisałeś problemu, a problem ze swoim rozwiązaniem, które z założenia może być niepoprawne. W GMie, tak jak w wielu innych językach programowania, paradygmat pojedynczego dziedziczenia jest dość powszechnie stosowany. Nie powinieneś myśleć w kategoriach wielodziedziczenia tak jak chociażby pozwala na to C++ tworząc logikę gry. Nawet w C++ wielodziedziczenie jest dość powszechnie uznawane jako złe podejście do rozwiązania większości problemów, częściej stosuje się po prostu kompozycje obiektów - proste i efektywne. Z tego co widzę, tworzysz jakiś obiekt "system" odpowiedzialny za obsługę innych instancji w jakiejś dziwacznej pętli - a w zasadzie nie widzę tutaj sensownego wyjaśnienia, dlaczego. A nie możesz przenieść po prostu logiki do tych obiektów? Możesz chociażby napisać skrypty scr_unit_* i komponować z nich obiekty, np.: /// scr_unit_create(team) team = argument0; some_crazy_variable = 10; /// scr_unit_step() some_crazy_variable++; /// scr_unit_draw() draw_self(); Potem w obiektach np. obj_enemy, obj_player wykonujesz odpowiednio skrypty scr_unit_create w Event Create, scr_unit_step w Event Step i scr_unit_draw w Event Draw.
  20. Błąd z "or"

    Faktycznie, nie przemyślałem tego, że w GML shadowing wbudowanych zmiennych może nie działać w taki sposób. A po uproszczeniu to w sumie można wyrzucić funkcję power: var t = floor(obj_gracz_widoczny.image_index) - 2; if (t*t - 4 == 0) { // kod }
  21. Błąd z "or"

    Można też w ten sposób: var t = floor(obj_gracz_widoczny.image_index); if (power(t - 2, 2) - 4 == 0) { // kod }
  22. Temat zbiorczy na drobnostki

    Bo bez nawiasów zwraca Ci inta, ale jest to identyfikator skryptu. Czasami użyteczne jak masz skrypt i jego ID przypisujesz do zmiennej. Wtedy możesz wywoływać ten skrypt funkcją script_execute. Np. var skrypt = scr_arrow_can_hit; // nie ma tutaj nawiasów script_execute(skrypt, parametr1, parametr2);
  23. Temat zbiorczy na drobnostki

    Cześć, nie wykonujesz skryptu, tylko porównujesz jego ID. Skrypty wywołujesz jak każdą inną funkcję, czyli w pierwszym if-ie daj: if(scr_arrow_can_hit() == 1) (...) Dodatkowo dodam od siebie, że zamiast używać other w skryptach, to powinieneś przesyłać dane poprzez parametry. Poprawia czytelność kodu oraz pozwala używać tego skryptu w różnych miejscach a nie tylko w Collision Event: ///scr_arrow_can_hit(array, against_id) var arr = argument0; var inst = argument1; var i, al = array_length_1d(arr); for(i=0; i<al; i++) { if(arr[i] == inst) return 0; } return 1; Potem używasz tego skryptu w ten sposób: if(scr_arrow_can_hit(other.array_objectID, id) == 1) (...)
  24.  1bit_arena

    Kilka razy przyblokowałem się na krawędzi ściany, kilka razy musiałem zresetować przez to grę. Ten bug był dla mnie szczególnie uciążliwy. Poza tym to grało się całkiem przyjemnie, ale przez bugi przeszedłem do max 2 poziomu.
  25. Problem z kompilacją na androida

    Podejrzewam, że masz niepoprawnie skonfigurowane środowisko, spróbuj skonfigurować Android SDK jak opisano w artykule https://help.yoyogames.com/hc/en-us/articles/216753498-GameMaker-Studio-Android-SDK-and-NDK-setup- Edit: Możliwe też, że masz zainstalowany najnowszy pakiet NDK w wersji r19 - wprowadzili zmiany do toolchainów i może GMS ich już nie rozpoznawać. Jeżeli po skonfigurowaniu SDK dalej Ci nie działa, spróbuj przywrócić ndk-bundle do wersji r18b pobierając ze strony https://developer.android.com/ndk/downloads/older_releases.html i zastąp tym ndk-bundle w Android SDK.
×