2D játék tervezés
2010-01-24T17:34:47+01:00
2010-01-31T10:51:01+01:00
2022-07-25T07:06:17+02:00
  • A lépésnél használj sx, sy sebességértékeket. Ezt tudod módosítani az irányításnak, zuhanásnak megfelelően.
    Az ütközés ellenőrzésnél pedig nem egy ponttal való ütközést kell figyelned, hanem azt, hogy az 1 fázis alatt megtett út vajon keresztezné-e a talaj szintjét. A megtett út ugye egy egyenes vonalszakasz.
    A talaj magasságát a pályán tárold el egy tömbbe ha nem triviális az adott x-hez tartozó talajmagasság. Persze használhatsz bitmap-et is, ha abból egyértelműen meg tudod mondani, hogy az adott pont a talaj szintje alatt vagy felett van.
    Ehez flash-ben ha a talajod nagyon színes, akkor használj egy maszkformát, amit nem is raksz ki a képernyőre. Plusz használj a figyelő függvénybe egy olyan értéket, ami már biztos talajszint, mert akkor nem lesz az, hogy a tárgy átrepül/átesik a talajon.
    Mutasd a teljes hozzászólást!
  • egy elsős gimnazista fizika könyv szerintem megoldaná a problémádat
    "Egyenes vonalú egyenletesen gyorsuló mozgás"
    Mutasd a teljes hozzászólást!
  • Ugrásra legegyszerűbb változat:
    Y=100; YP=-6; for(i=0;i<12;i++){ Y=Y+YP; YP++; // rajzolás }

    Ilyen játéknál mindenképpen előnyös kis képekre osztani a pályát, ha megnézed a komoly 2D játékok is ezt csinálják.
    Egyébként a játékok világa az a terület, ahol bármilyen módszer választható, lehet kísérletezni. A Java bár gyors, de nem tudok róla, hogy kifejezetten játékra fel lett e készítve (a mobilos változatban van pl. Sprite kezelés). Nagyobb felbontáson meg így is lassú lenne képpontonként vizsgálni az ütközést vagy hasonlót, mindenképen érdemes valami egyszerűbb, trükkös megoldást találni. Ez a rész izgalmas, nagyjából szabad kezet kap az ember.
    Mutasd a teljes hozzászólást!
  • Egy "fel-feldobott kő" mozgás elég alapvető fizikai->matematikai->informatikai jelenség...

    Nem értem, ha valaki meg tud írni egy ilyen játékprogramot, hogy nem tud kérdés nélkül rájönni ilyen majdnemhogy evidens dolgok megoldására.
    Mutasd a teljes hozzászólást!
  • nem vártam ennyire hosszúra sikerült hozzászólást,köszönöm :)
    ebből sok mindent leszűrtem,csak én arra gondoltam,hogy mivel elég gyors a java,így ne kelljen ilyen "tiremap" szerüség,de ha jobban átgondolom,lehet jobban járnék vele,

    és így nem kéne annyi adattal,koordinátával dolgozni,hanem lenne egy tömb,amivel a pályát mozgatom,bár így lehet több képet kell egyszerre mozgatnom pixeleként,de legalább átláthatóbb,és a többi játékos jobban koordinálhatóbb
    a gyorsulást,lassúlást megtudnám még oldani,de az ugrást milyen függvénnyel csináljam,hogy felfelé lassabb,és lefelé gyorsabb? felfelé haladva lassúljon?
    gondolkoztam a szinusz hullám deformálásán is,talán ez lehet a megoldás

    Köszönöm mégegyszert ezt a hosszú hozzászólást, télleg nem vártam hozzászólást,mert mindenki lenézi manapság a másikat,pedig csak egy szakdolgozat
    Mutasd a teljes hozzászólást!
  • Még annyit, hogy ha így kis képekre osztod a képet, akkor mondjuk egy 16x16-os kis kép egy elem.
    Ha a főszereplővel mozogsz, akkor a főszereplőnek is van egy koordinátája a pályán, pl:
    X=14; Y=8;
    Emellett én tárolom, hogy X és Y irányban mennyire mozdult el egy elemen belül.
    Így könnyen lekérdezem, hogy milyen elem van alatta, pl: elem=map[x][y+1];
    De ha a "pixel" koordinátákat tárolod, akkor is megállapíthatod, hogy a pályán hol helyezkedik el, pl: xpalya=x/16; (ha 16 pixel széles egy kép)

    De most úgy dolgozom, hogy pontosan meghatározom ,hogy a főszereplő előtt/mögött/alatt lévő pixel melyik, és abból határozom meg, hogy milyen elem van ott. Pl. ha a főszereplőt a 120x60-as koordinátára rajzolom ki, és a mérete 16x16, akkor jobbra mozgásnál a 120+16-os ponthoz tartozó elemet kérdezem le. Balra mozgásnál a 120-1 -es elemet, lefelé pedig 60+16;

    Ha oldalra akarsz mozogni mondjuk 4 pixelt, akkor érdemes pixelenként mozgatni a főhőst és minden egyes elmozduláskor ellenőrizni, hogy oda léphet e.
    Ugyanígy lefelé eséskor is érdemes mondjuk ötször 1 pixelt esni, mint egyszer 5 pixelt (így bele eshet a "platformba").

    Egy jó mozgás elkészítése sok munka, de egyszerűbb változatot össze lehet elsőre is hozni. (pl egy Mario játékban nem egyenletes sebességgel halad a főszereplő ha oldalra nyomjuk az irányt, hanem először lassan, utána felgyorsul, ha meg megállunk akkor még csúszik egy kicsit.)

    Ugrásnál a lefelé eséskor már ellenőrizni kell, hogy ráesünk e egy platformra. Én az ugrás koordinátáit (amit Y-hoz hozzá kell adni) előre tárolni szoktam tömbben, kb. ilyen formán:
    -6
    -5
    -4
    -3
    -2
    -1
    0
    1
    2
    3
    4
    5
    6
    Fentről indulva minden körben hozzá adom az Y értékéhez ezeket az értékeket (hasonlóakat, ki kell kísérletezni a pontos értékeket). Így először felurik, a felső ponton megáll, majd elkezd esni. Úgy kell megtervezni, hogy ha 6-os értékkel esett a végén, utána az "esés" értéke is ennyi legyen, de semmiképp nem kevesebb. De nem is kötelező, hogy teljesen a 6-osig ugorjon, ha a felső pontot megállt és elkezdett esni akkor utána már átadható a vezérlés az "esik" eljárásnak.

    Szóval szerintem kell egy
    Mozgat eljárás, ami akkor megy ha állunk a talajon, itt tudunk jobbra-balra menni és ugrást kezdeni. Ebben az eljárásban nézni kell az alattunk lévő elemet, ha nem "fal" akkor irány az "esik" eljárás.
    Kell egy
    Ugrik eljárás, ami a ciklus végéig, vagy "leesésig" tart, és egy
    Esik eljárás, ami addig megy, míg talajra nem esünk, vagy ki nem repülünk a képből /pályából (= game over).
    Mutasd a teljes hozzászólást!
  • Régen ezeket a játékokat még "karakteres képernyőre" írták. Ott mondjuk 40x25 karakter látszódott a képernyőn. A főszereplőnek is tudtuk, hogy hol van. Le tudták kérdezni, hogy alatt melyik karakter van (a mondjuk 256 betű és grafikus karakter közül).
    Innen már csak azt kellett mondani, hogy legegyszerűbb esetben: a 0-ás kódu (sorszámú) karakter a fal, az 1-es meg "háttér".

    Mozgatáskor csak ellenőrizni kellett, hogy azon a helyen ahová a szereplő kerülne "fal" van vagy sem.

    Hasonló módszert most is lehet alkalmazni. Azt mondjuk, hogy a képernyőt felosztjuk kis kockákra. Mondjuk 30x30 kocka fér a képernyőre. Ha mozgatni is akarjuk a pályát akkor annyival szélesebb-magasabb pályát tárolunk a memóriában (egy tömbben), és abból jelenítjük meg azt a kis részt (pl. 30x30) amennyi kifér a képernyőre.

    Szóval ha 30x30 fér a képernyőre és kb. 10 képernyő szélesre készítjük akkor egy 300x30-as tömb lesz a pálya. Ezt a tömböt kell feltölteni (betölteni fájlból). A tömb egy eleme azt mondja meg, hogy melyik kis képet kell oda rajzolni. Mondjuk rajzoljukn előre 50 kis képet.
    Azt mondhatjuk, hogy az az elem ami 20-nál kissebb, az "fal", ami 19-nél nagyobb az "háttér".

    Ennyi elmélet elég egy egyszerűbb Mario szerű játékhoz. Ha azt akarjuk, hogy ne csak vízszintes talaj lehessen, legyen ferde platform stb. akkor ezt ilyen blokkokkal is megoldhatjuk, vagy az elkészült képen figyeljük a pontok színét ahogy te mondod. Vagy a háttérben rajzolunk még egy képet, ahová azt rajzoljuk ki, hogy egy-egy elemnek melyik része "fal" és melyik nem.
    Mutasd a teljes hozzászólást!
  • Ugyanúgy, ahogy mondjuk a szörnnyel való ütközést, csak ilyenkor nem az életet vonod le, hanem megállítod a zuhanást.
    Mutasd a teljes hozzászólást!
  • Tisztelt fórumozók!
    Azért nyitottam ezt a témát ide,és nem a tudástárba,mert nem 1 adott kérdésre szeretnék választ kapni.
    Szakdolgozatomon gondolkozom(webprogramozó),de nem is ez a fontos,hanem az,hogy a gyorsaság,egyszerűség kedvéért hogy kivitelezzem.

    Az adott probléma a legegyszerűbb,és mégsem bírok rájönni hogy lehetne a legjobban
    2D-ről van szó, szóval 1 fix pálya amit mozgatok balra-jobbra,és a bábú ami mozog rajta,
    De,ha a gravitációt szeretnék megcsinálni akkor mondjuk 0.2f-el csökken az Y érték,de mi ad neki talajt?
    már probáltam azzal megcsinálni,hogy a föld egyenértékű egy megadott színnel (mondjuk rgb(120,120,120) ),de ezt példáúl ugrásnál nem használhatom,megváltozik a föld alja

    hogy lehetne ezt megcsinálni,hogy legyen gravitáció,ugrás,és némileg autómatikus legyen a pályabetöltést (webről szeretném később játék közben letölteni, - kérdések elkerülése végett,a szakmából adódóan :multiplayeres,és a dinamikusság miatt: )
    előre is köszönöm,és minden egyéb ötletet szívesen fogadok
    Mutasd a teljes hozzászólást!
abcd