Tuossa toissa illan tylsinä hetkinä sain päähäni ruveta tekemään tasohyppelyä. Aiemmat tekeleeni ovat olleet vuoropohjaisia pelejä ja ajattelin, että mitäköhän tästä nyt sitten tulee.
Homma lähti kuitenkin sujumaan yllättävän helposti. Netistä löysin Super Marion peligrafiikoita ja päätin käyttää näitä omaan tasohyppelyn testiini. Parin tunnin mietinnän ja kirjoitustyön jälkeen kasassa oli jo aitoon Super Mario tyyliin parallax scrollaava kolme kerroksinen peliaulue ja animoitu ohjausta totteleva pelialueeseen reagoiva Mario. Pelihahmon törmäystarkistuksen toteutin yksinkertaisesti käyttämällä törmäyspisteitä.
Illalla lisään tuohon pelialueelle kerättävät kolikot, pistelaskurin ja ehkä, jos aika antaa myöten, niin teen pohjatyön vihollisten lisäämiseksi peliin.
Laitan tuon varmaan koodivinkkeihin aloitteleville malliksi, kunhan saan siihen toteutettua suurinpiirtein kaiken haluamani.
jalski kirjoitti:
ajattelin, että mitäköhän tästä nyt sitten tulee.
Minusta tämä kuulostaa aika huteralta pohjalta tehdä aloittelijoille esimerkkiä. Jos haluaa saada koodistaan esimerkillistä, pitäisi aika hyvinkin tietää jo etukäteen, mitä siitä on tulossa.
Metabolix kirjoitti:
jalski kirjoitti:
ajattelin, että mitäköhän tästä nyt sitten tulee.
Minusta tämä kuulostaa aika huteralta pohjalta tehdä aloittelijoille esimerkkiä.
Minusta huteramman siitä tekee se, että todennäköisesti jalski kirjoittaa sen Limbolla. En ole vielä nähnyt ketään, joka sitä käyttäisi, jalskin lisäksi tietysti.
No sittenhän olisi hyvä että silläkin olisi edes jotain esimerkkikoodeja. Voihan siihen kommentteihin laittaa, että koodi ei ole ihan "ammattilaistasoa", jos siltä tuntuu.
Macro kirjoitti:
Minusta huteramman siitä tekee se, että todennäköisesti jalski kirjoittaa sen Limbolla. En ole vielä nähnyt ketään, joka sitä käyttäisi, jalskin lisäksi tietysti.
Itse asiassa tällä kertaa tuo on kirjoitettu Hollywoodilla, koska halusin sen toimivan suoraan AmigaOS:llä. Syntaksi on hyvin pitkälti Basic:in kaltaista. Hollywood sisältää kohtuullisen hyvät ominaisuudet pelin toteuttamiseen. Tuettuna on monipuoliset grafiikka ominaisuudet, tuki äänelle ja musiikille, hyvät ajastimet, yms.
Pelin toteutuksen kannalta itse ohjelmointikielen valinnalla ei tosin juuri ole niin merkitystä. Oma toteutukseni käyttää grafiikkaan ihan peruspiirto juttuja ja tuplapuskuria. Esimerkiksi BlitzMax käännös tuosta olisi kohtuullisen helppo.
Uskon, että Basic:in kaltainen lähes selkokielinen ohjelmointikielen syntaksi ja tällä hetkellä väljästi kirjoitettuna vajaat 300 riviä tekstiä ei ole aloittelijallekaan ihan mahdoton läpikäytävä.
Tuolla vajaalla 300 rivillä tekstiä saa siis jo aikaiseksi hyvin paljon Super Marion kaltaisesti käyttäytyvän ja toimivan pelirungon.
<runo>Pikaväkerrykset ovat parhaita pelejä, mutta koodit niin epäselkeitä.</runo>
jalski osaa hommansa ja varmaankin siistii koodinsa. Manuaalin kanssa on koodikin yleensä parempaa kuin ensimmäiset "kun jo osaa"-koodit.
Jos jotain kiinnostaa katsoa mitä tarkoitin, niin voi ladata tasohyppelyn alustavan kehitys -ja testiversion. Tuo vaatii kyllä kohtuullisen tehokkaan koneen pyöriäkseen sulavasti. Kun aika antaa myöten, niin kokeilen saanko BlitzMax toteutuksesta nykyistä Hollywood toteutusta enemmän tehoja irti. Kolikoita varten on piirto-osa valmiina, mutta törmäystarkistus puuttuu vielä.
Ei siinä muuta, kuin lisää ääntää kajareihin, peli käyntiin ja vaikka 50 framella voi kokeilla ensin...
Ps. tuo poistuu nopeasti, jos Nintendon lakimiehet ottavat yhteyttä... Mikäli päädyn tekemään joskus oikean pelin, niin grafiikat tulevat kyllä omasta takaa.
Ei tuo minulla ainakaan paljon tehoja vaatinut. Minulla on Asuksen EEEPC 1000HE, jossa on 1GT:n muistikamman tilalla 2GB.
Grafiikka on tosi epäselvää, kun pelasin suurella näytöllä. Onko noita kuvia venytetty ohjelmassa, että sopii ruudulle? 22" näytöllä (1680x1050) kuvista ei saanut mitään selvää (Oliko Mario jonkin liskon selässä?).
Tuo muuten kävelee kaikkien läpi, jos vain painaa nuolta (vasen/oikea). Kun hyppää, niin se menee päälle.
Macro kirjoitti:
Ei tuo minulla ainakaan paljon tehoja vaatinut. Minulla on Asuksen EEEPC 1000HE, jossa on 1GT:n muistikamman tilalla 2GB.
Grafiikka on tosi epäselvää, kun pelasin suurella näytöllä. Onko noita kuvia venytetty ohjelmassa, että sopii ruudulle? 22" näytöllä (1680x1050) kuvista ei saanut mitään selvää (Oliko Mario jonkin liskon selässä?).
Tuo muuten kävelee kaikkien läpi, jos vain painaa nuolta (vasen/oikea). Kun hyppää, niin se menee päälle.
Nuo grafiikat on alunperin Nintendo DS ruudun kokoa (pieni), nyt suurennettuna 640x480 resoluutioon. Pienennä omaa resoluutiota, niin ohjelman ei tarvitse skaalata niin helskutisti. Itsellä käytössä resoluutio 1440x900 ja tuo näyttää ihan ok:lta, hiukan pehmeältä tosin. Tuolla kentässä on tarkoituksella nuo platformit (vastaavat, kuin oikeassa Super Mario 3:ssa, ainakin muistaakseni), joiden päälle voi hypätä alakautta. Maatason ja esteiden läpi ei kyllä voi kävellä.
jalski kirjoitti:
1440x900 ja tuo näyttää ihan ok:lta, hiukan pehmeältä tosin.
Täällä näyttää todella pehmeeltä ja ei yhtään ok:lta. Jos käyttää sprite graffoi niin tuon tasonen skaalaus ja venytys ja pehmennys ei käy laatuun. Ruutu 4:3 1400x
tkok kirjoitti:
Täällä näyttää todella pehmeeltä ja ei yhtään ok:lta. Jos käyttää sprite graffoi niin tuon tasonen skaalaus ja venytys ja pehmennys ei käy laatuun. Ruutu 4:3 1400x
Tuo on ihan omaan käyttöön tehty pelkän pelimekaniikan testi. Ainahan tuon testin olisin voinut laittaa toimimaan ikkunassa, jolloin skaalausta ei tarvittaisi. Nyky näytöt ovat huonoja näyttämään mitään muuta, kuin omaa natiivi resoluutiotaan.
Tarkoituksena ei ollut esitellä grafiikkaa, joka muutenkin on kopioitua vaan näyttää, että vajaalla 300 rivillä tekstiä saa jo kohtuullisen hyvän tasohyppelyn rungon aikaiseksi, jos perus piirto -ja ajastusfunktiot ovat valmiina tarjolla jossain kirjastossa.
Pehmenemisen voi kiertää käyttämällä eri filtteriä tekstuureissa. OpenGL:llä se on GL_NEAREST.
Kontrollit ok mutta pieni omituisuus; kun hahmo kääntyy niin sen jalat siirtyy taaksepäin. Tämän ansiosta jos kävelet ihan reunan viereen ja käännyt takaisin niin tippuu alas.
User137 kirjoitti:
Kontrollit ok mutta pieni omituisuus; kun hahmo kääntyy niin sen jalat siirtyy taaksepäin. Tämän ansiosta jos kävelet ihan reunan viereen ja käännyt takaisin niin tippuu alas.
Itse asiassa pelihahmon jalat vain eivät satu olemaan keskellä spriteä ja kun spriten flippaa x-suunnassa ympäri, niin jalkojen sijainti ruudulla muuttuu. Tämä on otettu huomioon törmäystarkistuksessa määrittämällä esim. spriten jaloille kaksi eri törmäyspistettä riippuen siitä onko sprite käännetty vai ei.
Mitä tulee skaalauksesta johtuvaan pehmenemiseen, niin en tarkalleen tiedä mitä Hollywood käyttää apuna piirtoon ja skaalaamiseen. OpenGL se todennäköisesti ei kuitenkaan ole (ainakaan AmigaOS:llä).
Kirjoittelen juuri törmäystarkistus juttuja uusiksi. Uuden version pitäisi olla vanhaa versiota nopeampi collision map - pohjainen toteutus.
Laittelen jotain uudestaan näytille, kun kolikoita pytyy keräämään ja joku vihulainenkin on saatu peliin mukaan. seuraava testiohjelma tulee pyörimään ikkunassa täyden ruudun sijaan.
Uusi versio Kentän törmäystarkistus nyt kokonaan collision map pohjainen. Kolikoita voi nyt kerätä ja kolikon keräys -ja hyppyääni lisätty peliin. Peli toimii nyt ikkunassa, joten skaalauksesta johtuvaa pehmenemistä kuvassa ei pitäisi esiintyä. Ei vihulaisia vielä toteutettuna kylläkään...
Uusi versio Lisäsin pahikset, jotka liiskautuvat päälle hyppäämällä. Täytyy hiukan siistiä ja optimoida vielä ja ehkä tehdä myöhemmin OpenGL BlitzMax käännös. Tällä hetkellä tekee paljon turhaa/frame, minkä voisi laskea etukäteen valmiiksi, kuten liiskattujen pahisten häivyttäminen alphakanavaan piirtämällä.
Offtopic, mistäs löysit Super Marion peligrafiikoita?
Hyvin näytti laiskalla ibarin T42-läppärilläki pyörivän tuo vaikka vielä winellä tuota ajoin.
Postitin tuon koodivinkkeihin esimerkiksi: https://www.ohjelmointiputka.net/koodivinkit/
Tuosta aloittelija ainakin näkee, miten toteuttaa collision map - pohjainen törmäys tarkastus pelikenttään, parallax scrollaus, paikallaan pysyvät objektit ja vihulaiset, joille on määritelty liikkumisrajat kartalla.
Aika tarpeeton vinkki minusta.
Uskon Hollywoodin olevan todella outo ja tuntematon kieli monelle. Pelkään, ettei aloittelija saa tuosta kovin paljoa irti. Lisäksi koodista uupuu kommentteja, jotka kertovat, mitä mikäkin kohta tekee. Ei kovin aloittelijaystävällistä.
tgunner kirjoitti:
Aika tarpeeton vinkki minusta.
Uskon Hollywoodin olevan todella outo ja tuntematon kieli monelle. Pelkään, ettei aloittelija saa tuosta kovin paljoa irti. Lisäksi koodista uupuu kommentteja, jotka kertovat, mitä mikäkin kohta tekee. Ei kovin aloittelijaystävällistä.
Tuo on siis oikeastaan ensimmäinen Hollywoodilla tekemäni ohjelma ja myös ensimmäinen tasohyppelyn tapainen ohjelma yleensäkin. Aikaa tuon tekemiseen kului yhteensä n. 2 tuntia käsittäen siis uuden ohjelmointikielen opiskelun, tasohyppelypelin toiminnan miettimisen ja peligrafiikoiden sekä äänien netistä etsimisen.
Mitä tulee kommenttien puuttumiseen, niin mielestäni kaikkea on aivan turha kommentoida. Kuka jaksaa lukea koodia, missä kaikki asiat kuten jokainen muuttujan arvon asetus tai kutsuttavan funktion nimi on kommentoitu.
Esim.:
Local x = 0 ; asetetaan x-muuttujan arvo mario:animate() ; animoidaan mariota mario:draw() ; piirretään mario
Eikös tuo muuttujan tai nuo metodien nimet ole sinällään jo ihan tarpeeksi kuvaavia?
Hollywoodin dokumentaatio on muuten ehkä paras, mitä itselläni on vastaan tullut. Kaikki on ryhmitelty loogisesti omiin osioihinsa ja etsimänsä asian löytää yleensä vain jokusessa sekunnissa.
Kommentoinnin idea on lähinnä selittää miksi jokin asia tehdään, eikä mitä tehdään. Näin koodin tarkastelija ymmärtää helpommin ja nopeammin koko koodin toiminnan. Esittämässäsi kommentointiesimerkissä selitetään juuri, mitä tehdään, jossa ei ole juurikaan järkeä. Parempi olisi selittää, miksi juuri tässä asetetaan kyseinen muuttuja, sekä miksi juuri tässä animoidaan ja piirretään. Jos markkinoit koodivinkkiä aloittelijoille sopivaksi, tällaiset selittävät kommentit olisivat paikallaan.
trilog kirjoitti:
Esittämässäsi kommentointiesimerkissä selitetään juuri, mitä tehdään, jossa ei ole juurikaan järkeä. Parempi olisi selittää, miksi juuri tässä asetetaan kyseinen muuttuja, sekä miksi juuri tässä animoidaan ja piirretään. Jos markkinoit koodivinkkiä aloittelijoille sopivaksi, tällaiset selittävät kommentit olisivat paikallaan.
Tuo olikin esimerkki turhasta kommentoinnista.
Mielestäni aloittelijakin kykenee pohtimaan asioita. Laittamani esimerkki on kuitenkin hyvin yksinkertainen:
Alussa tehdään vain parit alustukset, määritetään Hollywood kutsumaan p_MainLoop() funktiota 50 kertaa sekunnissa ja jäädään ikuiseen silmukkaan odottelemaan tapahtumia.
Pääloopissa, eli p_MainLoop funktiossa käsitellään näppäimen painallukset sekä toimitaan niiden mukaan, liikutetaan mariota sekä pahiksia, tarkastetaan törmäykset kolikoihin sekä pahiksiin ja piirretään kaikki ruudulle.
Aloittelijakin pystyy kyllä ymmärtämään tapahtumille loogisen järjestyksen:
- käsittele näppäimien painallukset
- liikuta
- tarkasta törmäykset
- animoi
- piirrä
Aihe on jo aika vanha, joten et voi enää vastata siihen.