Skocz do zawartości

Barsztik

Użytkownicy
  • Postów

    17
  • Dołączył

  • Ostatnia wizyta

Osiągnięcia Barsztik

Chicken

Chicken (1/13)

0

Reputacja

  1. Odpowiedź tak na szybko, bo nie mam chwilowo czasu by to dobrze rozkminić, a Wasz odzew jest na tyle duży i rzeczowy, że niemógłbym go zignorować. Im A Vader: Dzięki za gifa, teraz już rozumiem Im A Lord: ten artykuł z wiki znam, ale nie chcę korzystać z tych gotowych algorytmów. Nie żebym uważał mój pomysł za lepszy, bo na dzień dobry widać, że jest słabszy, ale jest mój i czerpię frajdę z zabawy z nim. Chociaż żywię również przekonanie, że nie ja jeden na takie rozwiązanie wpadłem ;-). Threef: flag bitowych używałem niewiedząc nawet, że tak się nazywają. :-) Dzięki. Z Amstradadowego basica pamiętam jeszcze, że w ten sposób definiowało się czcionki. Miały rozmiar 8x8 i uzywało się komnedy Symbol 65,255,255,255,255,255,255,255,255. Pierwsza liczba to kod ascii, a kolejne to dziesiętny zapis wierszy 11111111, czyli jak to mądrze nazwałeś flagi bitowe. A może połączyć oba Wasze rozwiązania? Zamiast zapisywać drzwi w czterech wartościach 1,1,1,1, zapisać z wykorzystaniem tych magicznych flag bitowych jako 15. Oszczędzam w ten sposób 3 wartości, w których mogę zapisywać różne inne pierdółki, np. "biom" - który mógłbym sprawdzać w sąsiednich komnatach analogicznie do przejść/ścian. Chociaż nie sądzę bym zużył wszystkie wartości w ds_list. Dobra. Dziękuję za rady, w wolniejszym czasie muszę to wprowadzić w życie. Dam oczywiście znać co się wykluło. :-)
  2. Tak, wolę wskazówki :) A to dlatego, że bardziej zależy mi na stworzeniu możliwie najprostszego algorytmu prowadzącego do mojego celu(nawet poza gml), niż samej gry. Wymuszanie ścian/drzwi jest bardzo ciekawym pomysłem. Bardzo mi się podoba. Jeśli dobrze Cię zrozumiałem to nie losuję komnat z zapisanych możliwości, tylko same drzwi. Część już stworzoną przechowuję w siatce. (Legenda: 1 ? ściana, 0 ? przejście, ? ? nie interesuje mnie w danej chwili, A ? w danej chwili jest określana) 1. tworzę komnatę o współrzędnych x,y i zapisie 1,1,1,1 ( przyjmijmy, że drzwi są oznaczone począwszy od godziny 12-ej zgodnie z ruchem wskazówek zegara ? góra, prawo, dół, lewo) 2. przechodzę do skryptu losującego drzwi: - sprawdzam, czy komnata x,y-1 istnieje? Jeśli nie losuję drzwi A,?,?,?. Jeśli istnieje to: jeśli ma kształt ?,?,0,? to w tworzonej komnacie wymusza 0,?,?,? Jeżeli ma kształt ?,?,1,? to w tworzonej komnacie wymusza 1,?,?,? - następnie sprawdzam czy komnata x-1,y istnieje i postępuję analogicznie dla tych i kolejnych drzwi. 3. W zależności od wybranej metody: - czekam aż gracz gdzieś przejdzie i wtedy ponownie odpalam skrypt tworząc komnatę powiedzmy x,y+1 (poszedł w dół) ? jeżeli zdecydowałem się tworzyć labirynt w locie - jednorazowo tylko jedna komnata = szybkość:) - przechodzę do tworzenia kolejnej komnaty (x+1,y etc?) ? jeżeli zdecydowałem się losować cały labirynt przy uruchomieniu gry. Wolniej, ale łatwiej będzie porozrzucać w sensowny sposób znajdźki. Np: skrzynia musi być oddalona co najmiej o 5 komnat od klucza itp... Czy to miej więcej miałeś na myśli? [edit] początkowo założyłem, że będę używał ds_grid, ale chyba faktycznie ds_list będzie tu zwyczjanie prostszy [/edit]
  3. Cześć. Przymierzam się do stworzenia labiryntu trochę na zasadzie rogouelike, ale maksymalnie uproszczonego. Wymyśliłem sobie, że świat składałby się z kwadratowych komnat w rzucie top-down, z których każda mogła by mieć 1-4 wyjść w różnych kombinacjach (część z nich widoczna na obrazku ? po zielonym można chodzić, szare symbolizuje ściany) - teoretycznie mogła by nie mieć wyjść wcale, ale to by było bez sensu ;-) . Komnaty byłyby zapisane w systemie 0,1,0,0 (gdzie 1 to ściana, 0 to przejście) - 0,1,0,0 to zapis pomieszczenia widocznego w prawym dolnym narożniku obrazka. Taki system łatwo rozszerzyć o inne struktury np.: 1 ? ściana z kamienia, 2 ? ?ściana? z lasu, 3 ? rzeka.Na raz widoczna jest tylko ta komnata, w której znajduje się gracz. Obrazek 1 Można też komnaty w całkowicie swobodny sposób narysować w programie graficznym i przechowywać w png, a w systemie 0,1,0,0 przechowywać jedynie zapisane przejścia jak na drugim obrazku. Obrazek 2 Problemu nie ma (jakiegoś super dużego) jeśli zapiszę cały labirynt. Robiłem podobnie w basicu na 8-bitowcu, zapisując wszystkie komnaty w systemie 9 liczb: 13, 0,1,1,0, 0,8,12,0 gdzie pierwsza to numer komnaty, następne cztery to zapisane ściany i przejścia, a ostatnie cztery zawierały numery komnat, do których prowadziły przejścia. Jednak teraz chciałbym by świat tworzył się losowo, ale tak by przejścia zawsze pasowały. Na obrazku komnata 1 to komnata startowa, te oznaczone zielonym ptaszkiem pasują, ta czerwonym x nie pasuje. Te z szarymi pytajnikami w zasadzie też nie bo pozwalają wyjść poza świat. Co sądzicie o takim pomyśle, czy prosty wydaje się tylko mojej głowie, ale w implementacji do gml byłby bardzo skomplikowany? Czy lepiej losować komnaty w locie (przy przejściu z jednej do drugiej), czy przy uruchomieniu gry. Czy takie rozwiązanie ma sens?
  4. Dziękuję. Podziałało. Ostatni znak miał numer 380, więc de facto wystarczyło zmienić zakres na 32 - 380. Dodało też pewnie inne niepotrzebne "ogonki", ale myślę, że to nie będzie jakoś znacząco obniżać wydajności. Pozdrawiam Barsztik
  5. Cześć. Piszę tutaj, bo nie chciałem nowego tematu tworzyć. Teraz mam problem z polskimi znakami. Oczywiście tworzę super mega hita, który na steamie pobije Dotę 2 i CS:GO razem wzięte, więc będzie po angielsku, jednak brak polskich znaków mi doskwiera bo: co ja nie zrobię? ;-) Wyświetlany tekst jest w Creation code danej instancji umieszczony w taki sposób: GML tresc = "Zażółć gęślą jaźń."; Napisany w notatniku i przeniesiony metodą Copy'iego-Paste'a. W font z kolei zakres znaków zwiększony do 255. Czcionki próbowałem różne: Arial, Arial Baltic, Arial CE, itp... Niestety po wyświetleniu tekstu polskie znaki są pomijane. Używam GMS:Standart Edition (v1.2.1224). Coś pomijam? Na formu znalazłem jedynie informacje o zmianie zakresu znaków.
  6. Hej. Dziękuję za pomoc, problem rozwiązałem nieco inaczej, acz bez Waszej pomocy pewnie bym się męczył. Zrezygnowałem całkowicie z listy tekstów i używania ID. Każda instancja obj_npc wysyła do skryptu generującego textbox zmienną tresc, w której przechowywana jest wypowiedź danego NPCa lub plakatu itp... Zrobiłem więc tak, że wstawiam instancje obj_npc do rooma w dowolnych miejscach i kolejności. Następnie na już wstawionej instancji w roomie klikam prawym i wybieram Creation code, a w nim wpisuję tresc = "bla bla bla bla"; Dzięki temu każda instancja ma swój własny tekst. Dodatkowo w Stepie obj_npc w if (.....) {.....} gdzie sprawdza czy gracz wszedł w interakcję by wywołać textbox dodałem and (tresc != ""), co zapobiega wywalaniu się lub wyświetlaniu pustego textboxa gdyby dany NPC czy plakat nie miał nic "mówić". Dzięki temu cała numeracja i problemy z id czy fakeID odpadają :D Minus jest taki, że nawet jak dana instancja obj_npc czy obj_plakat nie ma nic "mówić" to i tak w Creation code muszę wpisać tresc = ""; ale to już pikuś. Jeszcze raz dziękuję za Waszą pomoc. Nowa wiedza zdobyta :D Pozdrawiam Barsztik
  7. Dobra myśl. :) Ale i tak poszukam elastyczniejszego rozwiązania. W tym przypadku jeśli wstawię np 20 tych "plakatów" w całej grze i nagle pomyślę by wstawić coś pomiędzy drugi, a trzeci, to będę musiał wszystko zmieniać od trzeciego do ostatniego bo ten nazwijmy go "o numerze 2,5" nie będzie pomiędzy 2 a 3 tylko jako 21. Dodatkowo za każdym razem gdy któryś usunę (choćby przypadkiem) i dodam ponownie to znów się wszystko poprzestawia.
  8. Ok, już mam, działa. Problem polegał na kolejności wstawiania obiektów. obj_start w którym jest global.plakaty = 0; nie był dodany jako pierwszy. Po zachowaniu kolejności wstawiania obiektów (obj_start, obj_npc, obj_npc...) jest ok. Dziękuję. Sądzę jednak, że będę musiał mimo wszystko poszukać innego rozwiązania, bo utrzymywanie właściwej kolejności wstawiania obiektów może być, delikatnie mówiąc, upierdliwe przy tworzeniu prawdziwych poziomów w grze.
  9. Stworzyłem odrębny obiekt, w którym w Create dałem global.plakaty = 0;, a w Create dla poszczególnych plakatów fakeID = global.plakaty ++. Efekt ten sam, wyświetla łączną liczbę plakatów. Gdy usunąłem ten dodatkowy obiekt, a global.plakaty = 0; dałem w room0: Creation code to wywala: Push :: Execution Error - Variable Get -5.plakaty(100000, -1) at gml_Object_obj_npc_CreateEvent_1 (line 1) - fakeID = global.plakaty ++; :/ ds_map jeszcze nie ogarniam, ale przyjrzę się temu. Switch to pierwsze co mi przyszło do głowy :-) Niestety do głowy przyszła mi jeszcze jedna rzecz. Nie mogę tego rozwiązać w taki sposób jak bym chciał (id instancji), bo będzie działało tylko w obrębie jednego rooma. W nowym roomie będzie liczył od nowa. Z kolei w rozwiązaniu proponowanym przez ANtY rozbijam się o fakt, że GM najpierw wykonuje wszystkie Create'y, a potem Stepy i Drawy, więc będzie podawał sumę. Muszę chyba wymyślić inny sposób.
  10. Opcja z fakeID w Create niestety nie działa, dla każdej instancji wyświetla łączną ich liczbę, tak samo jak bym dał to w Step. A potrzebuję tego do identycznych NPCów... już tłumaczę. Robię platformówkę (bo chyba na nich najprościej się uczyć), ale wymyśliłem sobie, by historia w niej była opowiadana przez napotkanych NPCów, obrazy/plakaty na ścianach, regał z książkami itp... kawałek po kawałku. Oczywiście jak na platformówkę przystało fabuła nie będzie zbyt rozbudowana ;-) I tu dochodzimy do sedna. Powiedzmy że na ścianie wiszą trzy obiekty obj_plakat, wyglądają tak samo (mała, pikselowa grafika) bo są trzema instancjami tego samego obiektu. Ale po kliknięciu na każdy z nich pojawiał by się inny tekst, fragment opowieści. Jak w klasycznych RPGach po kliknięciu na różne przedmioty pojawiały się napisy ::cóż, za dziwna księga:: itp... Oczywiście nie chcę tworzyć odrębnych obiektów, więc wymyśliłem sobie, że teksty będę dla wygody trzymał w osobnym skrypcie scr_teksty np. w taki sposób: /// scr_teksty switch (numer) { case 1: tresc = "bla, bla, bla" break; case 2: tresc = "pierdu, pierdu" ...... } a w Stepie dla obj_plakat, we fragmencie opisującym co się dzieje po kliknięciu w plakat: script_execute(scr_teksty, numer); gdzie numer byłby id konkretnej instancji. Być może, będę to musiał rozwiązać inaczej.
  11. Hej, dzięki, jestem już bliżej rozwiązania problemu. I am Lord, z tym stringiem racja, chociaż nie ma to w sumie znaczenia, bo wyświetla i jak jest string(id) i jak samo id. niemniej dodałem string dla higieny. ;-) ANtY, samo id działa dopóki jest tylko jeden obiekt i kilka instancji. draw_text(x,y, id); zlicza wszystkie instancje wszystkich obiektów. O ile w roomie były same obj_npc nie było problemu, ale jak dodałem nic nie robiące obj_wall, one również liczyły się do numeracji. Próbowałem wstawić obj_npc.id, ale wtedy wszystkie miały wartość 1 (w zasadzie 100001).
  12. Hej. Napotkałem problem, którego rozwiązanie musi być proste, ale nie potrafię go znaleźć. Jak sprawić by poszczególnym instancjom danego obiektu przypisać różne wartości, czyli de facto potrzebuję wyłuskać numer konkretnej instancji obiektu? Stworzyłem więc nowy plik "grę", który służy tylko do przedstawienia problemu. W nim jeden domyślny wymagany room oraz jeden obiekt obj_npc. W obiekcie obj_npc dodałem event Draw a w nim taki kod: draw_text(x,y, instance_id); W roomie wstawiłem 5 razy obiekt obj_npc. Po odpaleniu gry w miejscach obiektów pojawia się wszędzie -4. Co powinienem wpisać w: draw_text(x,y, ????????????????????????????); by w miejscach obiektów pojawiły się liczby 1,2,3,4 i 5 zgodnie z kolejnością wstawiania obiektów w roomie? próbowałem instance_number(obj_npc) ale wtedy zlicza mi wszystkie instancje i wszędzie pojawia się 5. Pozdrawiam Barsztik.
  13. Taki banał :D Zadziałało, dziękuję! Temat wyczerpany. Pozdrawiam B.
  14. Cześć. Szukałem na forum i w popularnej wyszukiwarce, ale nie znalazłem prostej odpowiedzi na moje pytanie, być może źle szukałem. Jak przywołać liczbę pseudolosową? (zaznaczam, że jestem laikiem kompletnym w zakresie GML, niemniej wiem, że GM tych liczb nie losuje tylko de facto podstawia do skomplikowanego wzoru z wieloma zmiennymi tak, że wynik jest b.trudny do przewidzenia, dlatego są to liczby pseudolosowe) Nie zależnie czy użyję irandom(); random(); czy floor(random()); wynik mam zawsze ten sam przy kolejnych uruchomieniach. Powiedzmy, że użyję kodu: xx = irandom(room_width); yy = irandom(room_height); instance_create (xx, yy, obj_jakiśtam); Przy uruchomieniu "gry" obiekt zawsze pojawia się w tym samym miejscu. Wydaje się być losowe, np x=125, y=532, ale jak wyłączę "grę" i odpalę jeszcze raz to wylosuje znów te same wartości. Jak wstawię room_restart() pod jakimś klawiszem, to każde kolejne wylosowane wartości będą takie same przy każdym uruchomieniu. Np: przy uruchomieniu x=125, y=532, wciskam "R" (room_restart), x=32, y=15, kolejnym razem x=342, y=197. Niby losowo, ale zamknę "grę" uruchomię jeszcze raz i znów będą te same, "losowe" wartości po kolei. Jak sprawić by losował różne wartości przy kolejnych uruchomieniach?
  15. Ok, dziękuję :) Musze to wszystko przetrawić, więc pewnie odezwę się za kilka dni jak opanuje to co napisaliście :) Ostatnio pisałem cokolwiek z dobre 10 lat temu we flashu 5, a przedtem na cpc464 w basicu, więc mam sporo do nadrobienia :) *** back *** Zrozumiałem dlaczego warto zamienić if mp_potential_move(....)=false na sumę wartości abs lub sumę kwadratów. Jak miałem mp_potential_move w warunku, to działało to 2 krotnie, i ludzik zasuwał za szybko. Aż wstyd, że nie wpadłem na wykorzystanie xprevious. Pamiętam, jak w basicu samodzielnie pisałem coś w stylu "xprevious", by magazynować tam poprzedni x właśnie do porównania z obecnym, a tu jest jak na tacy! Ponadto używałem tego do zatrzymywania ludka przy kolizji ze scianą, skrzynią (przy sterowaniu z klawiatury). Ale mam pewne zastrzeżenie do: GML klatka += 1; animacja1 = klatka mod 5; // będą się odgrywać klatki z zakresu 0 do 4 animacja2 = ( klatka mod 7 )+4; // będą się odgrywać klatki z zakresu 4 do 10 itd Wykorzystanie reszty z dzielenia rzeczywiście jest w tym wypadku prostsze, ale czy nie wymagało by dodawania kolejnych linijek kodu przy każdej kolejnej broni? W moim przykładzie w step mam: GML if ( predkosc > 0 ) { licz_klatki+=1; if licz_klatki>=5 { klatka +=1; licz_klatki =0; if klatka = 4 {klatka = 0;} } } Kod jest faktycznie dłuższy, ale nie wymaga ingerencji nawet jak ilość broni (wyglądów górnej części gracza), była by bardzo duża, bo pętla kręci się w wartościach 0-4 (dokładnie to w 0-3, bo 4 odsyła do 0). Dalej kod w Draw: GML mn_klatki=global.jaka_bron*4; draw_sprite_ext(spr_gracz_nogi,klatka+mn_klatki,x,y,1,1,direction,c_white,1); draw_sprite_ext(spr_gracz_gora,klatka+mn_klatki,x,y,1,1,direction,c_white,1); Również jest przygotowany na bardzo dużą ilość wariantów broni, poprostu numer broni 0,1,2,....15.... odeśle automatycznie do kokretnych klatek z zakresu 1-4, 5-8, 9-12,....60-64.... i również nie wymaga dopisywania żadnej linijki kodu w przypadku wiekszej ilości wariantów. Czy pod tym względem takie rozwiązanie nie jest lepsze? Wydaje mi się, że przy 2 rodzajach broni Twój kod jest faktycznie krótszy, ale gdybym dodał jeszcze kilka, to mógłby urosnąć znacznie. Ciekawa rzecz jaką zauważyłem, to pewnego rodzaju "zawijanie" animacji. Otóż spr_gracz_nogi ma tylko 4 klatki, a mój kod (przypadkowo, bo skopiowałem go z draw_sprite_ext(spr_gracz_gora... odsyła "nogi" do klatek 5-8 (przy broni 1),ale wszystko działa, animacja jakby się zwijała i w przypadku animacji z klatkami 1-4 "wirtualna" nieistniejąca klatka 5 = klatce 1, 6=2, 7=3 itd... jeśli dobrze to rozumiem, to podoba mi się takie rozwiązanie :) Z innej beczki. Podoba mi się, że w gml nie trzeba predefiniować zmiennych i definiują się przy pierwszym nadaniu wartości. Niemniej część zmiennych chciałbym sobie predefiniować na starcie w taki sposób, że same by się nie zresetowały. Np, jak wpiszę global.jaka_bron w Create w obj_gracz, to przy zmianie room'a obj_gracz zostanie utworzony na nowo i global.jaka_bron dostanie ponownie domyślną wartość. Chciałbym gdzieś wpisać początkowy kod, który zadziała tylko przy uruchomieniu aplikacji lub bezpośrednim odesłaniu do tego kodu, niezależnie jakie obiekty, room'y zostaną stworzone. Gdzie wpisać taki kod? W scripts?
×
×
  • Dodaj nową pozycję...