atarionline.pl platformówka - algorytmy - Forum Atarum

Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

  • :
  • :

Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

    • 1:
       
      CommentAuthorinsert
    • CommentTime11 Mar 2011 zmieniony
     
    Czesc,

    Mam juz sporo napisane wlasnych funkcji bibliotecznych zeby podejsc do platformowki, czy znacie jakies referencje gdzie mozna poczytac jak pisać silnik klasycznej platformowki 2d (wykrywanie kolizji z otoczeniem) etc, ogolnie algorytmy potrzebne do tego typu gry. Mam swoje pomysly ale chce to przeanalizowac z kims madrzejszym.
    • 2: CommentAuthornosty
    • CommentTime12 Mar 2011
     
    Szukalem tego samego 2 miesiace temu. Niestety bezskutecznie. Tzn znalazlem troche algorytmow, ale ich przydatnosc na Atari byla wątpliwa. Sam zobacz:
    ->link<-

    W koncu wykorzystalem porady XXL'a i napisalem sobie sam tak jak umialem.
    • 3:
       
      CommentAuthorinsert
    • CommentTime12 Mar 2011
     
    nosty. a moglbys w skrocie napisac co xxl poradzil?
    • 4: CommentAuthornosty
    • CommentTime12 Mar 2011
     
    hehe, xxl poradzil mi rzeczywiscie w skrocie :) Juz to gdzies tu opisywalem. Mam postac na duszku (wlasciwie dwoch). XXL poradzil zebym zrobil sobie maskę dla mapy: Do kazdego znaku na mapie(lub dla kazdego tilesa, jesli najmniejsza jednostka grafiki sklada sie z kilku znakow) przypisane jest: 1 lub 0.
    0 - postac moze na niego wejsc, 1 - czesciowo blokuje. Wiec tylko dla tych znakow na ktore naklada sie duch postaci i ktore sa oznaczone "1" sprawdzam bitowo kolizję pixeli definicji znaku z duszkiem postaci.

    Mozna na tym poprzestac sprawdzajac kolizje z definicją znaku. Albo mozna zrobic dla kazdego znaku maske wskazującą, ktore pixele znaku sa nieprzepuszczalne.

    Potem musialem juz to tylko zakodowac :)
    • 5:
       
      CommentAuthortdc
    • CommentTime12 Mar 2011
     
    Nie róbcie metodą jak w Bruce Lee, choć i to da się dobrze zrobić.
    • 6:
       
      CommentAuthorTheFender
    • CommentTime12 Mar 2011
     
    nosty sprawdzasz kolizję wszystkich pixeli z duszka czy tylko 8 na narożnikach kafla (boundary box)?
    • 7: CommentAuthornosty
    • CommentTime13 Mar 2011 zmieniony
     
    TheFender@ - ani to ani to :)
    I chyba 4, a nie 8 na naroznikach???

    Tzn do wykrywania kolizji "smiertelnych" konieczne jest sprawdzanie kolizji wszystkich pixeli.

    Do oceny mozliwosci ruchu sprawdzalem metode z naroznikami ale mi sie nie sprawdzila. Moja postac ma 13x9 pixeli. Sprawdzajac tylko narozniki zdazalo sie ze jakis maly wystajacy element scenografii miescil sie miedzy nimi i wchodzi postaci w d... :)
    Za to metoda sprawdzania wszyskich pixeli tez sie u mnie nie sprawdzila bo mam dosc wyjatkowa sytuacje: postac jest animowana nawet jak stoi w miejscu. Wyobraz sobie np machanie skrzydelkami. Gdybym ocenial kolizje pixelowo, to w danej klatce animacji postac moglaby sie przesunac, ale w nastepnej klatce animacji juz by byla rysowana czesciowo na grafice.

    Dlatego u mnie najlepiej do oceny mozliwosci ruchu sprawdzilo sie uproszczenie, ze postac jest wypelnionym prostokątem i sprawdzanie kolizji wszystkich pixeli tego prostokąta. Ale taki prosty ksztalt maski pasuje akurat dla mojej specyficznej postaci.

    @TDC - a jaki algorytm jest w Bruce Lee?
    • 8:
       
      CommentAuthortdc
    • CommentTime13 Mar 2011
     
    Prostokątny kształt to klasyczna metoda we wszystkich grach, szczególnie na komputerach nie posiadających sprzętowego wykrywania kolizji (co do piksela) jak ma to miejsce na Atari.

    Ta metoda jest wykorzystana w zły sposób w Bruce Lee, postać potrafi podskakiwać, albo podczas biegu opaść o piksel lub kilka. Nie wspominając o dziesiątkach innych błędów włącznie z kompletnym zawieszeniem gry, np.

    W tym filmie tego nie widać, ale gra już jest w nieskończonej pętli i to jeszcze zapętlającej się dodatkowo powodując nieprawdopodobny przyrost punktów, co w tym filmie widać tylko w jednej chwili, ale jak się samemu doprowadzi do takiej sytuacji to bywa często ciekawiej :P
    • 9:
       
      CommentAuthorTheFender
    • CommentTime13 Mar 2011
     
    Mam zaadaptowany algorytm "prostokąta" i do postaci pt kwadrat sprawdza się doskonale, choć nie ukrywam miałem problemy podobne do tych z brusliego ;) (darkbasic PC)

    @Nosty: oczywiście, że chodzi o 8 punktów kontrolnych. Ale prostokąt, jakby nie było, ma ich tylko 4 ;)
    • 10: CommentAuthornosty
    • CommentTime13 Mar 2011 zmieniony
     
    TDC, ale to co widze na filmie to niedorobka mechaniki gry a nie wykrywania kolizji. Ninja moze zranic Sumo (nie wiem jako oni sie oficjalnie nazywaja ;) ) i zadaje cios kiedy jest przed nim Bruce Lee.
    Bruce Lee pozornie wisi w powietrzu ale tak naprawde wisi na makatce, choc glupio to wyglada.
    Niedawno przeszedlem Bruce Lee i nie znalazlem zadnego buga, ktory by mnie uderzyl po oczach...
    • 11: CommentAuthorbanshee997
    • CommentTime13 Mar 2011
     
    > Ninja moze zranic Sumo (nie wiem jako oni sie oficjalnie nazywaja ;) )

    W jakiejś recenzji widziałem chyba nazwy Gruby Yamo i Czarny Ninja :)
    • 12:
       
      CommentAuthorKaz
    • CommentTime13 Mar 2011
     
    Nasza recenzja tutaj:

    ->link<-
    • 13:
       
      CommentAuthorinsert
    • CommentTime13 Mar 2011
     
    ok, wiec u mnie wszyastko jest na znakach, tj bohater i otoczenie, sprajty chce wykorzystac do czegos innego, zastanawia mnie czy potrzebuje dodatkowa mape - maske, myslalem ze po prostu bede sprawdzal jaki element jest w poblizu gracza z mapy ktora rysuje plansze, jesli pod graczem jest tiles odpowiadajacy podlodze np to postac podczas spadania nie leci dalej, jesli obok jest tiles - murek to postac nie moze sie poruszac dalej w ta strone etc, powiedzcie mi co zlego jest w moim rozumowaniu?
    • 14:
       
      CommentAuthorjhusak
    • CommentTime13 Mar 2011
     
    A to, że czasem murek otwiera sekretne wejście, albo jest murkiem bliżej i nie przeszkadza bohaterowi w marszu.

    Jednak nadużywanie stosowania takich wieloznacznych obiektów może być IMHO lekko irytujące.
    • 15: CommentAuthorxxl
    • CommentTime13 Mar 2011
     
    nostemu pisalem jak to jest zrobione w JSW 2007 to dobry sposob bo klocki nawet tej samej grafiki moga miec rozne wlasciwosci, kolizje mozna liczyc albo do atrybutu albo do samej grafiki, klocek atrybutu nie musi byc tej samiej wielkosci co klocek grafiki, tak jest w hobgoblinie i tu nie tylko kolizje sa tak sprawdzane ale rowniez priorytety - np. dwa takie same klocki - jeden bedzie zaslanial playera a drugi nie itp.
    • 16:
       
      CommentAuthortdc
    • CommentTime13 Mar 2011
     

    Nosty:

    Niedawno przeszedlem Bruce Lee i nie znalazlem zadnego buga, ktory by mnie uderzyl po oczach...

    Bruce Lee to jedna z najbardziej zabugowionych gier na Atari (i innych platformach).

    Jak przeszedłeś go raz to przejdź jeszcze parę razy a zobaczysz różne ciekawostki ;)


    xxl:

    dwa takie same klocki - jeden bedzie zaslanial playera a drugi nie itp.

    To trzeba zrobić aby wszystkie zasłaniały playera i problem z głowy :P
    • 17:
       
      CommentAuthorjhusak
    • CommentTime14 Mar 2011
     

    xxl:

    dwa takie same klocki - jeden bedzie zaslanial playera a drugi nie itp.

    Bo to perspektywa jest :) Coś jest bliżej a coś dalej. A ludzie się błędów w tym doszukują.
    • 18:
       
      CommentAuthorjhusak
    • CommentTime14 Mar 2011
     
    Bug = coś, co może wpłynąć na scenariusz gry (pułapka, dziwna plansza normalnie niedostępna, patrz bugi w Prine of Persia np.)
    Ficzer - to jest to, czego w w Bruce Lee dużo. Czy jest możliwość utknięcia? Nie.
    Podobnie jest z Pharaoh's Curse. Tam można przechodzić przez ściany, zamknięte drzwi, pomiędzy planszami czasem się uda. I co? gra jest przez to bardziej kultowa IMHO!

    Takie "bugi" stanowią często o atrakcyjności gry. Nie wiem skąd to mam, ale w Quake, DukeNukem3D i innych takich zawsze próbowałem wyjść poza planszę :) Przeniosło mi się to z Atari?
    Bruce Lee jest przeciętną, nudnawą grą (np. walka z Bosem jest superkrótka = rozczarowanie zakończeniem). Dlaczego tak wielu uważa ją za kultową, ile wieczorów z nią spędziło, itp?
    • 19:
       
      CommentAuthorjhusak
    • CommentTime14 Mar 2011
     
    A zwróćcie uwagę, ile tu jest kolorów jednocześnie:
    czarny, szary ciemny, szary jasny, biały, czerwony, błękitny, skórzany, zielonkawy i jeszcze lampki mrugają!

    9 kolorów na atari na raz na ekranie!

    W takiej starej grze!

    Bruce Lee po prostu ładnie wygląda. Jest wypasione.
    • 20: CommentAuthorxxl
    • CommentTime14 Mar 2011
     
    mozna grac we dwoch :) ta gra to klasyk i nic tego nie zmieni :)
    • 21:
       
      CommentAuthorjhusak
    • CommentTime14 Mar 2011
     
    I Bruce Lee jest dość podobny do siebie prawdziwego :))))))))))
    • 22:
       
      CommentAuthorinsert
    • CommentTime14 Mar 2011
     
    no dobrze, rozumiem juz mniej wiecej sens tworzenia osobnej mapy do wykrywania kolizji, jesli u mnie ma to byc tylko informacja czy to "platforma" czy tez sciana przez ktora nie mozna przejsc, to powinna mi wystaczyc jedna taka mapa, prawda?
    • 23: CommentAuthorxxl
    • CommentTime14 Mar 2011
     
    oczywiscie, mapa jest jedna, komorka mapy moze niesc duzo wiecej informacji niz tylko te do kolizji.
    ---
    w jednej grze widzialem ze progrmaista operowal wspolrzednymi. czyli jesli tych platform nie masz wiele (jednoczesnie na ekranie) to mozesz tez pojsc ta droga. robisz liste obiektow aktywnych, liste paltform i liste obiektow ruchomych np. teraz jesli chcesz sprawdzac kolizje np. to przekazujesz do procki wskanik listy obiektow i listy platform albo listy obiektopw i przeszkadzajek. jedna procka obsluzysz wszystkie rodzaje kolizji.
    • 24:
       
      CommentAuthorinsert
    • CommentTime14 Mar 2011
     
    ale u mnie envision wypluwa tylko 1 albo 0 na jeden znak wiec nie wiem jak mogloby to niec wiecej informacji :)
    • 25: CommentAuthornosty
    • CommentTime14 Mar 2011
     
    @insert - ja to robie tak (troszke upraszczajac):
    Mapa ekranu ma 960Bajtow (40x24 linie znakowe).
    Rezerwuje sobie w pamieci drugi taki sam obszar 960 bajtó, ktory nazywam MASKĄ ROBOCZĄ.

    Wiec kazdemu znakowi ekranu odpowiada jeden bajt maski.
    I teraz:
    Bit 0 tej maski to informacja o mozliwosci ruchu,
    Bit 1 - informacja o kolizjach smiertelnych
    Bit 2 - czy znak jest przedmiotem, ktory mozna wziac/wykonac z nim jakas akcje
    Starsze 5 bitow (32 kombinacji) wykorzystuje do podania nr przedmiotu.

    Ale glupio by bylo marnowac dodatkowe 960 bajtow na kazdy level (u mnie level = 1 ekran).
    Wiec wypelniam tę maske bitami dopiero przed rozpoczeciem levelu na podstawie informacji wygenerowanych przez Envision (bity 0 i 1 - po 120Bajtow).
    A poniewaz przedmiotow jest wzglednie niewiele, a i tak musze przypisac im konkretne akcje, to przechowuje je dla kazego levelu tak jak opisal wyzej XXL: jako tablice wspolrzednych(2bajty) + nr przedmiotu (1bajt). A maske wypelniam nimi tylko dla przyspieszenia sprawdzania.

    Czyli podsumowujac, wszystkie powyzsze informacje zajmują mi dla kazego levelu 240 bajtow + 3*ilosc przemiotow, a wiec max 336 bajtow.

    Wlasciwie to teraz zobaczylem ze gluio robie, bo bitu 2 wogole nie powinno byc, tylko jesli starsze 6 bitow = 0 to nie ma przedmiotu, a jesli <> 0 to znaczy ze w znaku jest przedmiot o podanym numerze.
    • 26:
       
      CommentAuthorinsert
    • CommentTime14 Mar 2011 zmieniony
     
    nosty. dzieki :) ale znaczenie tych bitow w ramach znaku jak ustawiasz? bo envision pozwala tylko wypluc 0 albo 1 (jest do wyboru tryb byte lub bit ale nie wiem jak to uzywac zeby ustawiac w ramach bajtu poszczegolne bity)
    • 27: CommentAuthornosty
    • CommentTime14 Mar 2011
     
    @insert - ale wlasnie o to chodzi ze ja nie wymagam tego od Envision bo wtedy musialbym dla kazdego levelu przechowywac dodatkowe 960 bajtow. Tworze to dynamicznie przed levelem zeby uproscic sobie sprawdzanie kolizji.

    Envision wypluwa maske bitową. Dla ekranu 40x24 znaki bedzie to 120 bajtwo (960 bitow).
    Robisz wiec sobie maske dla ruchu, zapisujesz bitowo. Robisz drugą dla kolizji i zapisujesz bitowo.
    I w zasadzie moglbys z nich korzystac bezposrednio w swoim programie prawda?
    Ja robie inaczej zeby bylo mi wygodniej i szybciej sprawdzac kolizje: przed rozpoczeciem levelu zeruje obszar roboczy 960 bajtow, a nastepnie na podstawie jednego z tych zestwow bitowych wyplutych przez Envision ustawiam bity 0 dla w kazdym bajcie, a na podstawie drugiego zestwmu ustawiam bity 1 w kazdym bajcie.
    Potem dorzucam do tej roboczej maski przedmioty na drugim bicie.
    I w ten spsob mam maske robocza ktorej kazdy bajt odpowiada znakowi na ekranie.
    • 28:
       
      CommentAuthorinsert
    • CommentTime14 Mar 2011
     
    yhm, thx :)
    • 29: CommentAuthorGonzo
    • CommentTime14 Mar 2011
     
    paw - scrobnij kilka słów o tym jak załatwiłeś ten problem w dizzym, przyglądam się temu i przyglądam, ale to dla mnie jakieś czary, a zwłaszcza animacja (np. w pionie dizzy nie jest przesuwany o znak, a o 2-3 linie, oczywiście jeśli to nie tajemnica), domyślam się, że to podkolorowany sprite softwerowy, ale w takim wykonaniu na atarce jeszcze chyba nie było czegoś takiego
    • 30: CommentAuthornosty
    • CommentTime15 Mar 2011 zmieniony
     
    Gonzo - caly dizzy jest zrobiony na duszkach :) Na P0 i P1 czarny kontur i oczki, na pociskach (podwojnej szerokosci) raczki i nozki, na P2 podwojnej szerokosci biale wypelnienie.
    Na P3 jest zrobiona moneta.

    Obszar PMG jest od adresu $4000. Mozesz wejsc w emulatorze w konsole (F8 w Atari800win) i sam podejrzec.

    To troche rozrzutne wykorzystanie duchow ale jak rozumiem paw nie planowal jeszcze gry tylko chcial sie pobawic efektem wizualnym. I udalo mu sie :)
    • 31: CommentAuthorpaw
    • CommentTime15 Mar 2011 zmieniony
     
    Gonzo: przeceniasz moje aktualne możliwości,
    - dizzy jest w całości zrobiony z sprite-ów (trzech "graczy" i czwarty z "pocisków")
    - grafika oczywiście na znakach, "nieprzepuszczalne" dla dizziego znaki zgrupowane są na końcu zestawu znaków
    - po każdej zmianie położenia dizziego, sprawdzam jego nowe otoczenie i zapisuję do zmiennych czy możliwy jest ruch w danym kierunku
    - co wykorzystuję w procedurach zmieniających położenie czy stan dizziego

    jakby co służę dokładniejszymi informacjami

    edit:
    widzę, że nosty już wyjaśnił moje czary,
    ale trochę przeraża mnie stwierdzenie "paw nie planowal jeszcze gry" rozumiem, że teraz już planuję??? ;)
    • 32: CommentAuthornosty
    • CommentTime15 Mar 2011
     
    Hahaha, wybacz paw :) Troszke nadinterpretowalem myslac od razu "jak ja bym to zrobil" :)

    Dla mnie animacje softwarowe są na tyle trunde, ze duszki bardzo cenie i wzdrygnalem sie na mysl o poswieceniu 3 (a w zasadzie z pociskami 4) tylko na postac glownego bohatera :)
    Ale efekt jest rzeczywiscie swietny, a w koncu postac Dizzego jest w calej grze najistotniejsza.