Skocz do zawartości

Threef

Moderatorzy
  • Postów

    2 911
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    14

Treść opublikowana przez Threef

  1. Nie musisz tworzyć nowego obiektu. Ten kod ma się wykonać raz więc w Create wystarczy... Chyba że room jest persistent, wtedy w room start. Przerób tamten co już stworzyłeś. No i jak masz więcej takich obiektów to: GML if(instance_exists(TEN OBIEKT KTÓRZY PSUJE WSZYSTKO)){with(TEN OBIEKT KTÓRZY PSUJE WSZYSTKO){instance_destroy()}} if(instance_exists( INNY OBIEKT KTÓRZY PSUJE WSZYSTKO)){with(INNY OBIEKT KTÓRZY PSUJE WSZYSTKO){instance_destroy()}} surface_resize(application_surface,room_width,room_height) display_set_gui_maximise()
  2. Więc jak próbujesz to zrobić? Co robisz źle? Pokaz.
  3. Nie pomaga bo któryś obiekt jest persistent i pomimo że nie masz go wstawionego w room to on w nim jest. Nie możesz tego odznaczyć bo przestanie Ci działać kupa innych rzeczy. Przerób na to: GML if(instance_exists(TEN OBIEKT KTÓRZY PSUJE WSZYSTKO)){with(TEN OBIEKT KTÓRZY PSUJE WSZYSTKO){instance_destroy()}} surface_resize(application_surface,room_width,room_height) display_set_gui_maximise()
  4. No i to są ciekawe dane. Nie zapytałem się nigdzie wcześniej ale domyślam się gra jest odpalana na fullscreen. Z tego powodu przed jakąkolwiek ingerencją w zmiany rozmiarów menu na początku ma taki rozmiar application_surface. view_hport[0] jest zależne od rozmiaru okna. 1041 jest dość dziwną wartością, ale okno można rozszerzać więc nie powinno to dziwić. view_hview[0] w samej grze ma wartość po przecinku. Ogółem wszystkie wartości dotyczące kamery przepuszczałbym przez funkcję round(). Room game_over zachowuje się dziwnie. Wartość jest inna i zwalam winę na te dziwne operacje z lerp(). Jeżeli game_over ma zachowywać się tak samo jak menu to możesz tu wykorzystać to samo rozwiązanie co dałem wcześniej. Powinno działać. Jeżeli nie to we wszystkich obiektach w tym room sprawdź czy gdzieś nie zmieniasz view_hview[0] albo surface_resize(application_surface, ...) Wciąż wydaje mi się że to nie jest rozwiązanie. Czy masz jakieś obiekty albo room z zaznaczonym "Presistent"? Jak tak to które? W nich też sprawdź czy nie masz surface_resize().
  5. Hmm... GML with(obiekt) { if(point_distance(x,y,other.x,other.y)<64) { //warunek spełniony! Pamiętaj o other!. } }
  6. Nie potrzebujemy kodu. Wszystko już od dawna w nim wyczytaliśmy. Twoje widoki są zależne od rozmiaru okna gry. Te nie jest określone więc nie znamy rzeczywistych wymiarów jakie potrzebujemy. O czym mówię? O tym fragmencie: GML view_wport[0] = window_get_width(); view_hport[0] = window_get_height(); view_hview[0] = view_wview[0]/view_wport[0]*view_hport[0]; surface_resize(application_surface,view_wview[0],view_hview[0]); display_set_gui_size(view_wport[0],view_hport[0]); Wszystkie dane jakie potrzebujemy do rozwiązania problemu są wyliczane z tych prostych obliczeń, ale nie znamy danych wejściowych, bo są zależne od rozmiaru okna które może mieć wymiary dowolne. Trzeci raz odwołuję cię do mojej poprzedniej odpowiedzi. Nie będę już odpisywał jeżeli nie będę mieć dostępu do danych.
  7. GML nie rozróżnia = i ==. Rozróżnia tylko miejsce w jakim jest użyte i na podstawie tego wykonuje albo porównanie albo przypisanie. Więc = użyte wewnątrz warunku to porównanie.
  8. Jeden z artystów których wspieram od początku jego kariery: Alexandre Bergheau - Cling on to your thoughts
  9. Funkcja zwróci true oraz przypisze nowo wygenerowany path do podanego w argumencie. Jeżeli droga nie istnieje funkcja nic nie zrobi... ale ten path musi wcześniej istnieć! I to jest problem, bo nawet pusty path ma 2 wierzchołki. Więc być może warunek z jakiegoś powodu jest spełniony i rozpoczynasz path. Czemu się to dzieje? Może twój statek tworzy się i wykonuje sprawdzenie ścieżki zanim wszystkie ściany się pojawią? Postawiłeś go w room na początku, a potem dopiero dodałeś ściany? A potem dodałeś drugi statek i ten już działa? Tak? To masz rozwiązanie.
  10. in=noone czyli tak na prawdę in=-4, to przypisanie do zmiennej wartości która na pewno odpowiada za "brak instance". Dzięki temu potem funkcja instance_exists(in) może działać bez błędów. Bo gdyby bomba wybuchła w miejscu tuż obok ściany to od razu chciałoby wykonywać kod w else i wywaliło by błąd. Ogółem ten kod co podałem już widzę że jest źle właśnie z tego powodu. Bo jeżeli wybuch był pod ścianą to usunie ostatni element z innego kierunku. Radzę zrobić 4 osobne for dla każdego z kierunków i przerywać je break. Dziedziczenie jest tutaj dla Ciebie niezwykle ważne. Wystarczy że zrobisz jeden "wspólny" obiekt wybuchu a każdy inny który ma inną grafikę ustawisz jako jego dziecko. Tylko ten jeden obiekt rodzic powinien zawierać jakikolwiek kod, dzieci będą zachowywać się tak samo. Więc jeżeli w rodzicu ustawisz event "Animation end" to nie musisz tego ustawiać w dzieciach, a nawet nie powinieneś. Dzieci same przejmą event po rodzicu. (Ale właśnie w wypadku gdy dziecko też będzie miało ten sam event to dziecko nie będzie dziedziczyć tego po rodzicu). Akurat z tego nie skorzystasz za bardzo, ale warto o tym pamiętać. Za to skorzystasz z tego że nie musisz teraz sprawdzać kolizji z każdym obiektem eksplozji, a masz ich kilka. Teraz wystarczy że będziesz sprawdzać kolizję z rodzicem. Twoich eksplozji masz chyba 7 różnych obiektów. Jeżeli chciałbyś sprawdzać kolizję bez dziedziczenia to musiałbyś robić 7 różnych eventów kolizji.
  11. No to: GML in=noone; prawo=1; lewo=1; gora=1; dol=1; for (i=1;i<global.zasieg;i+=1){ if (position_meeting(x-i*32,y) && lewo==1) { in=instance_create(x-i*32,y,obj_bomba_po);//Stwórz nowy obj_bomba_po i zapisz jego id do zmiennej } else {//Gdy napotkałeś ścianę lewo=0; if(instance_exists(in)){with(in){instance_destroy()}}//Usuń już istniejący obiekt. Ten zapisany w zmiennej, czyli ostatni utworzony instance_create(x-i*32,y,obj_bomba_l);//W jego miejsce wstaw obiekt kończący } (...) } Przy okazji patrząc na twoje obiekty pozwolę sobie zapytać: Używasz dziedziczenia (parent/child)?
  12. Używaj position_meeting() jest alternatywą dla instance_place(). Różnią się tym że pierwszy zwraca true/false, a drugi id instance. place_free() i place_meeting() sprawdzają kolizję z użyciem maski aktualnego obiektu. position_meeting() i instance_place() sprawdzają czy instance jest na danej pozycji x/y. Ogółem wydaje mi się że to co pokazałeś powinno działać. W czym jest błąd? W tych zakończeniach? Wartość "i" może być inna niż oczekujesz poza pętlą. I na pewno jest.
  13. To samo co wtedy. Musimy znać wymiary wszystkich powierzchni. Twój błąd pojawia się po zmianie rozmiaru application_surface. Musisz sprawdzić jakie są dobre i jakie są złe wymiary. Dopiero wtedy będzie można coś robić.
  14. Nie, nie pomogło. To jest tylko łatka, a problem wciąż gdzieś pozostaje i jest związany z niezrozumieniem.
  15. Jak pisałem wcześniej, musisz sprawdzić wartości wszystkich tych zmiennych we wszystkich warunkach gdy dzieje się coś źle oraz dobrze. Dopiero wiedząc co jest nie tak będzie można cokolwiek zaradzić, teraz strzelamy na ślepo. Dobrze wiem co powoduje problem ale nie mamy pojęcia gdzie i czemu. Nawet nie wiem czy twoje menu jest w zwykłym Draw czy w GUI, ale wydaje mi się teraz że nie masz w tych room ustawionych view. Dlatego zmień wszystko z tego twojego nowego obiektu na: GML surface_resize(application_surface,room_width,room_height) display_set_gui_maximise() To wciąż jest strzelanie na ślepo! Potrzebujemy danych!
  16. Pytanie teraz czy usunąłeś resztę? Wygląda na to że nie i teraz wszystko ma inne rozmiary. Dodaj jeszcze GML view_wport[0]=view_wview[0] view_hport[0]=view_hview[0] albo po prostu wyłącz view jeżeli nie jest potrzebny. Oczywiście nie zapominając o ustawieniu ponownie application_surface. Ogółem twój problem bierze się z tego że wartości window_get_width(), window_get_height(), view_wport[0], view_hport[0], view_wview[0], view_hview[0], oraz rozmiary application_surface i GUI są różne. Musisz zacząć śledzić te wartości tj. debugować je, i sprawdzać czemu w poszczególnych wypadkach są złe. Wtedy dopiero możesz się zastanawiać czym to jest spowodowane.
  17. Oczywiście że nie pomogło bo nie wpisałeś tego co Ci dałem tylko znów to co było. Rozmiar okna jest inny od rozmiaru tego co widzisz w grze. W twoim wypadku będzie się pewnie różnił o piksel albo nawet 6. Wklej dokładnie to co dałem. Musisz zresetować do domyślnego widoku.
  18. GML surface_resize(application_surface,view_wview[0],view_hview[0]); //display_set_gui_size(view_wview[0],view_hview[0]); //wersja alternatywna display_set_gui_size(view_wport[0],view_hport[0]); //wersja podstawowa</span> To są linijki które odpowiadają za to że później wszystko jest rozjechane. Po prostu sami zmieniacie rozmiar rysowanej powierzchni gry (application_surface) wg rozmiaru okna gry. Potem w menu wszystko jest skopane i rozciągnięte. Żeby wszystko było w porządku musisz to zresetować do "domyślnych" rozmiarów. W create twojego menu czy gameover w jakimś obiekcie daj znów: GML surface_resize(application_surface,view_wview[0],view_hview[0]); display_set_gui_size(view_wport[0],view_hport[0]); //wersja podstawowa</span>
  19. Więc potrzeba nam więcej danych. O wiele więcej. Pierwsze prostsze: Sprawdź czy gdziekolwek w tym nie twoim kopiowanym kodzie masz słowa jak "view_wport", "draw_set_alpha_test" albo "application_surface". Możesz w GM:S wybrać z menu u góry opcję przeszukania wszystkich obiektów. Drugie: Podaj nam wartości view_hview[0] i view_hport[0] w trzech przypadkach. Na początku w działającym menu, w grze, a potem w zepsutym menu. Wystarczy że gdzieś w draw dodasz: GML draw_text(mouse_x,mouse_y,"view_hview[0]: "+string(view_hview[0])+"#view_hport[0]: "+string(view_hport[0]))
  20. A może rozmiar świata fizycznego masz powiązany jakoś z rozmiarem okna? Warto sprawdzić, bo to drobnostka.
  21. Po pierwsze: Twój grid może być globalny. Każdy instance może korzystać z jednego wspólnego. Dopiero samo mp_grid_path() wykorzystuje inne argumenty. Po drugie zacznij sprawdzać co się dzieje z tymi obiektami. Albo odpal debuger albo wypisuj na ekranie co się teraz dzieje. Polecam do szybkiego testowania robić tak: show_debug_message(path_speed) Wtedy w tej czarnej konsoli na dole IDE GameMakera pojawi się wartość danej zmiennej.
  22. Prawdopodobnie gdzieś w grze zmieniasz aspect ratio. Pokaż 2 screenshoty z menu. Jeden jak jest dobrze i drugi jak jest źle. Wtedy zobaczymy co to może dokładnie być. I proszę Cię, przestać dopisywać do tematów to długie "Game Maker Studio". Temat ma służyć do szybkiego zidentyfikowania wątku. Szczegóły takie jak te podawaj w samym poście. Tak samo z opisem tematu, jest on całkiem zbędny.
  23. Też będzie na osobnym. Szansa na to że YYG zrobiło coś takiego że nowa grafika będzie wskakiwała w miejsce starej na texture page, jest nijaka. Poza tym niektóre atlasy (tak to się nazywa btw!) mogą mieć dorysowane do sprite trochę kolorków na krawędziach. Ogółem skoro już jesteśmy przy takich technicznych sprawach. Na tech blogu YYG jest opisane żeby nie skalować view. Zamiast tego skalować application_surface. To bardzo dobry tip. ;)
  24. Nah, dla jednego palca na ekranie GM nie widzi różnicy pomiędzy tymi dwoma. Różnica jest właśnie ogromna przy evencie GUI bo tam pozycje wszystkiego są inaczej liczone.
×
×
  • Dodaj nową pozycję...