Keskustelut

Suomipelit.comin keskusteluarkisto. Arkistosta on poistettu ylläpitoalueilla käydyt keskustelut.

Hae:

Hyppää hakutuloksiin

Päiväkirja: Enwrath

Enwrath on aloittanut keskustelun. Viimeisimmän viestin on kirjoittanut Enwrath 16.8.2009 20:32.

Päiväkirja: Enwrath.

Kilpailijan päiväkirjamerkinnät tulevat tähän aiheeseen.

– Ylläpitobotti 13.7.2009 22:41

Suunnitteluvaihe menossa. Peli tulee varsin todennäköisesti perustumaan Taru Sormusten Herraan. Joitain konseptikuvia olen jo väsäillyt, joten tiedän jo tässä vaiheessa, että peli on kuvattu sivusta.

– Enwrath 14.7.2009 20:13

Huoh. Tänään aloittelin pelin koodausta, ja päätin suoraan tehdä tylsimpiä asioita jo nyt, niin eivät sitten lopussa masentaisi. Hirveää menestystä ei tullut, jonkinmoisen karttojen lataussysteemin sain väännettyä miljoonien nullPointerExceptioneiden jälkeen, jee!

– Enwrath 16.7.2009 0:44

Noniin, hitaasti mutta varmasti tapahtuu edistystä minunkin projektissani. GUI on varsin pitkälle suunniteltu ja vähää vaille koodattukin. Pelaajan hahmo osaa jo liikkua, hyppiä, sekä mennä matalaksi. Vielä pitäisi lisätä siihen pystyseinien tunnistus ja jonkinmoinen porras-/ylämäkisysteemi.

Päähenkinlön seuraama juoni riippuu pelaajan ottamasta roolista pelissä, ja yhdistyy muiden roolien kanssa suuremmaksi kokonaisuudeksi, olettaen että ehdin luoda tarpeeksi juonta. Jotenka siis koko juonen selville saadakseen joutuu pelaamaan pelin useasti läpi. Yksittäisten roolien juonien pitäisi tosin toimia yksinäänkin jotenkuten, pääjuoni vaan tekee niistä järkevämpiä.

– Enwrath 19.7.2009 23:13

Liikkuminen on nyt kaikilta osilta kunnossa, yksinkertainen taistelusysteemi työn alla. Tällä hetkellä vaikuttaa siltä, että Linuxilla ei tule kunnolla toimimaan, ellen sitten keksi jotain vaihtoehtoista taistelua, sitä pitää mietiskellä vielä.

Onneksi Windowsilla sentään toimii. Ärsyttää kyllä kun Javan pitäisi olla "write once, run everywhere"... ;/

EDIT: Hiukan asiaa tutkittuani, huomasin, että ainakin Ubuntulla toimii, kun ottaa näppäinten toiston tjms. pois päältä. Epäkäytännöllistä loppukäyttäjän kannalta, mutta toimiipahan sentään.

– Enwrath 21.7.2009 23:51

Näin. Kivasti sitä ymmärtää jäljellä olevan ajan vähyyden että saa sopivan paniikkivaiheen käyntiin ajoissa. Innostus laantui vähemmän yllättäen tuossa kilpailun puolivälin tienoilla, vaan ällös peljätkö, jotain olisi tarkoitus saada julkaisukuntoon ajoissa, jossei nyt sentään ihan semmoisenan kuin on suunniteltu.

Tänään/yöllä olisi tarkoitus saada perusvihollinen kuntoon, GUI loppuun ja jonkinlainen tarinankerrontanäkymäjuttu...

Ulkomuodoltaan peli tulee varmastikin olemaan kovin köyhän oloinen, grafiikoita ei ole tehty käytännössä yhtään, äänejä aivan mitättömän vähän ja musiikkia ei ollenkaan. :/
Ja laitetaanpa tähän vielä kuva niin saatte esimakua tulevasta: http://img7.imageshack.us/img7/2857/hienokkuva.png

– Enwrath 2.8.2009 23:06

Ja niin se aika vaan vähenee... Taitaa pelistä muodostua alkuperäisen suunnitelman mukaisen eeppisen seikkailupelin sijasta yksinkertainen "haltia tappaa pari örkkiä -peli" :D

Itse pelin edistymisestä sen verran, että viholliset osaavat jo vähän taistella pelaajaa vastaan, mutta juoksevat silti ajattelematta rotkoihin. :/
Grafiikoita on tehty lisää, tässä uskomattoman hieno örkki teidän ihailtavaksenne: kuva.

– Enwrath 6.8.2009 17:33

Voivoivoivoi... Kenttiä ei ole vielä tehty yhtään, eikä minkäänlaista kenttäeditoriakaan ole vielä kasassa. Suurin osa suunnitelluista ominaisuuksista on lakaistu pois pelin ajoissa valmiiksi saamiseksi. Huomenna on jo viimeinen päivä. :|
Aktiivisesti pitää tehdä viimeiset hetket jos meinaan saada tästä "valmiin" version ajoissa.

– Enwrath 8.8.2009 20:28

Improvisoin paintista ja notepadistä kohtuullisen nopean, mutta uskomattoman ärsyttävän "map-editorin". :D
Kenttiä on tällä hetkellä ykse, saa nähdä riittääkö aika toisen tekoon. Muutamia asioita pitää vielä tehdä, mutta jonkinlainen tekelys ehtii kilpailuun mukaan varmaankin.

Peliä pelataan nuolinäppäimillä liikkumalla, sekä välilyönnistä ampumalla.

– Enwrath 9.8.2009 20:58

Tuli testattua peliäsi ja hieman yksinkertainenhan se oli, mutta ihan hyvin varsinkin ikäiseltäsi. Varmasti tulevaisuudessa tulet saamaan töitä pelifirmasta helposti jos jaksat opiskelemista.

Sitten lähdekoodista. Luokkia löytyy ihan hyvä määrä ja mitä nyt nopeasti vilkaisin, niin ihan hyvältä vaikutti tuo jako. Kuitenkin itse koodissa pistää silmään, että kaikki luokkien jäsenmuuttujat ovat oletusnäkyvyydellä määritelty.

Yleensä tämä on hyvin huono tapa varsinkin Javassa. Normaalisti jäsenmuuttujat ovat yksityisiä ja sitten käytetään gettereitä ja settereitä näiden lukemiseen ja muuttamiseen.

Lisäksi nimeämiseen kannattaa kiinnittää huomiota. Java-koodissa standardinmukaisesti luokkien nimet alkavat aina isolla kirjaimella, muuttujien ja metodien nimet pienellä. Luokat alkaakin kaikki isolla tuossa koodissasi kyllä, mutta myös osa metodeista ja muuttujista alkaa isolla kirjaimella.

Koodi on selkeämmin luettavaa kun tiedetään, että isolla alkukirjaimella alkava nimi on aina luokka. Esimerkiksi StoryView.java luokassa kohta:

        if (reason == Prev){
            story.Prev();

oli lukiessa aika "wtf?".

Sitten vielä tosiaan yksi normaaliluokka per tiedosto on yleensä käytäntönä. Sisäluokkia voi olla sitten enemmänkin kuitenkin, mutta esimerkiksi Left ja Picture ovat kuitenkin ihan normaaleita luokkia.

– Dzarg 12.8.2009 13:35

Juu, kiitoksia näistä neuvoista. Ei ole hirveästi tullut perehdyttyä noihin nimeämiskäytäntöihin, joten ehkäpä tästä eteenpäin tulee kirjoitettua selkeämpää koodia.

Tarkoitatko tuolla getterillä esim. tälläistä

muuttuja = luokka.kerroMuuttuja();

tämän sijaan?
muuttuja = luokka.muuttuja;


Pitää yrittää tuo normaalin ja sisäluokan erottelu pitää mielessä. Mukava, että jaksoit kirjoittaa tuon viestin, siitä on varmasti hyötyä tulevissa projekteissani. :)

– Enwrath 12.8.2009 14:22

Juurikin noin, joskin nimeäminen tulisi "oikea oppisesti"
muuttuja = luokka.getMuuttuja();
tai
luokka.setMuuttuja(blah);

– Jonne 12.8.2009 15:38

Mukava, että jaksoit kirjoittaa tuon viestin, siitä on varmasti hyötyä tulevissa projekteissani.


Juu eipä mitään. Tokihan nuo asiat voivat sinänsä tuntua vähän turhilta kun tekee vain omaa projektiaan yksin, mutta kun ainakin tulevaisuudessa projekteihin tulee muitakin, niin niistä on apua.

Jos käytät Eclipseä, niin getterit ja setterit saadaan hyvin helposti generoitua ihan valikosta Source valitsemalla "Generate Getters and Setters...".

Nämähän liittyy siihen, että mitä vähemmän toinen luokka tuntee toisen sisäistä toteutusta, sen parempi. Jos luokka A käyttää luokka B:n muuttujaa suoraan, niin muuttujan tyypin vaihto toiseksi vaatisi sitten myös luokkaan A muutoksia. Gettereitä ja Settereitä käyttämällä voidaan tältä välttyä usein.

Sitten tosiaan yleensä ei ole hyvä tehdä gettereitä tietorakenteille suoraan. Eli jos esimerkiksi on taulukko jossa on tiettyjä arvoja, niin getteri ei suoraan palauttaisi taulukkoa, vaan halutun indeksin taulukosta. Sitten olisi toinen metodi millä voisi taulukon kokoa kysyä.

Näin sisäinen toteutus voi vaihtua taulukosta vaikka listaksi, useammaksi eri taulukoksi tai vaikkapa ihan vain erillisiksi muuttujiksi ja kutsuja ei huomaa mitään eroa, eikä siis kaipaa minkäänlaisia muutoksia.

Itselläni oli juuri tämänkaltainen tilanne eräässä pelissäni, missä alunperin säilöin kaikki peliobjektit yhteen C++:n vektoriin (vastaa Javan ArrayList tai Vector tietorakenteita). Getterit minulla oli sitten muotoa
getGameObjectAt(int index)
ja
getGameObjectCount()
Myöhemmin törmäystarkasteluiden optimoimiseksi vaihdoin käyttämään eri vektoreita vihamielisille ja ei-vihamielisille peliobjekteille.

Kutsujapuoli ei kuitenkaan huomannut mitään eroa, kun getGameObjectCount() metodin laitoin palauttamaan vektoreiden yhteenlasketun pituuden ja indeksillä haun katsomaan jos indeksi on pienempi kuin ensimmäisen vektorin koko, niin haetaan siitä, muussa tapauksessa haetaan toisesta ja vähennetään indeksistä ensimmäisen vektorin koko.

Lisäksi on kaikenlaisia sääntöjä/suosituksia siitä, miten eri olioiden yhteydet tulisi toimia, mutta otetaan esimerkiksi rivi:
logic.map.ground[i].y
joka sijaitsee Arrow luokassa.

Tässä selvästi Arrow on aivan liian riippuvainen logicin, mapin ja vielä groundin sisäisestä toteutuksesta, jotka ei sille pitäisi mitenkään kuulua.

Uskoisin, että tässä pelilogiikan pitäisi hoitaa nuo tarkastelut, eikä nuolen itse, mutta jos nuolella haluaa, niin tämä rivi kannattaisi kuitenkin tehdä hieman erilailla
if (y < logic.map.ground[i].y+logic.map.ground[i].h && y+h > logic.map.ground[i].y && x < logic.map.ground[i].x+logic.map.ground[i].w && x+w > logic.map.ground[i].x){

Jos ymmärsin oikein, että tässä tarkastellaan törmäystä maahan, niin kutsu voisi olla esimerkiksi
logic.collidesWithGround(x,y,w,h);


Näin ollen metodi ei varsinaisesti tietäisi mitä se on tarkistamassa, mutta ei sen tarvitsekkaan ja näin sitä pystyy käyttämään sitten samalla muidenkin kappaleiden tarkasteluun. Tuo sama tarkastelu kun toistuu myös muissa luokissa.

Lisäksi tässä tarkastelu ei ole enää riippuvainen Logic luokan sisäisestä toteutuksesta ja tarkastelurutiinia muutettaessa, yhtäkään sitä käyttävää luokkaa ei tarvitsisi muuttaa.

Sitten huomasin tässä nyt myös, että List rajapinnan tietorakenteita ei näyttäny olevan ollenkaan käytössä. Suosittelen tutustumaan sellaiseen kuin ArrayList. Toimii hyvin paljon samoin kuin taulukko, mutta sen koko muuttuu dynaamisesti (eli voit lisätä ja poistaa sinne ihan kuinka paljon vain ja listan koko muuttuu aina operaation jälkeen).

Määrittely kannattaa tehdä tähän tyyliin:
List<Arrow> arrows = new ArrayList<Arrow>();

Tyyppi merkitään hieman erikoisesti tuohon <> merkkien sisälle. Muuttujan laitoin List tyyppiseksi sen takia, että nyt muuttujan voi vaihtaa sitten tarvittaessa vaikka Vector tai muun tyyppiseksi List rajapinnan toteuttavaksi tietorakenteeksi.

Lisääminen listaan tapahtuu ihan vain
arrows.add(lisattavaOlio);
ja poisto joko indeksillä tai oliolla. Koon saa selville
arrows.size()
metodia käyttäen. Näin ei tarvitse aina nuolen tuhoutuessa tai ammuttaessa nuolitaulukkoa tehdä uudelleen.

Nuolia nyt sen verran vähän vielä, että se ei paha ongelma ole, mutta jos pelissäsi ammuttaisiin esimerkiksi sata tai tuhat ammusta sekunnissa, niin tämä aiheuttaisi hirveän määrän turhaa roskienkeruuta ja olioiden luontia.

Tässä lisäkommentit tältä erää :)

– Dzarg 12.8.2009 16:36

Err... Tuolla oli vain joku .jar -tiedosto. Ilmeisesti se pitää ajaa jollain java -ohjelmalla?

Olisi kiva jos saisi valmiin .exe:n, kun ei huvittaisi asentaa turhia ohjelmia konetta kuormittamaan.

(en muuhun tarvitse javaa, kun käytän itse C++:aa ;))

– PekkoK 12.8.2009 17:58

Vaikka .jar tiedostosta voi tehdä kyllä .exe tiedoston, niin koneessa pitää silti olla java asennettuna.

Javalla tehtyä peliä ei tietääkseni voi mitenkään pelata jos javaa ei koneeseen ole asennettuna. Kuitenkin nykyään lähes kaikilla se on.

– Dzarg 12.8.2009 18:01

@PekkoK
Juu, valitettavasti tuon ajamiseen tosiaankin tarvitaan Java. Useimmilla on Java asennettuna, mutta ikävää jos sinulla ei ole. Et kuitenkaan menetä mitään maailmoja mullistavaa, vaikket jaksaisikaan sitä ladata. :)

@Dzarg
Jälleen kerran, kiitokset opastavasta ja opettavaisesta viestistä. Tuo luokkien sisäisen toteutuksen piilottaminen vaikuttaa ihan järkeenkäyvältä. Muutamia kertoja on tullut kärsittyä luokkien riippuvuusongelmista, joten tästä varmaankin löytyi apu siihen.

Listeihin ei ole tullut jostain syystä törmättyä. Varsinkin tuo ArrayList vaikuttaa varsin kätevältä. Ehkäpä sekin tulee säästämään hermoja ja konetta turhalta rasitukselta tulevaisuudessa. Muutenkin on aina mukava oppia uusia asioita.

Pitääpä ruveta koulun alkamisen kiireistä selvittyä tekemään pientä testipeliä näiden neuvojen pohjalta. Ehkäpä tuo koodi alkaa sitten näyttämään omaankin silmään sopivammalta. :)

– Enwrath 12.8.2009 18:50

Nyt on kyllä ihan pakko ottaa kantaa ennen kuin teet saman virheen kuin minä ja tyrmäät itsesi täysin! ;)

Onnittelen, että olet viitsinyt aloittaaa ohjelmoinnin! Ilmeisesti et tiedä paljoakaan olio-ohjelmoinnista, mikä on täysin ymmärrettävää :). Nyt kun osaat koodata, suosittelen ehdottomasti, että luet jonkun (Java) olio-ohjelmointia käsittelevän kirjan. Vähänkin suurempien projektien suunnittelu käy todella vaikeaksi mikäli et tunne turvallista ohjelmointityyliä.

Puhun nyt (tuskaisesta) kokemuksesta.

Itse aloitin C++ olio-ohjelmoinnin 4 vuotta sitten (opettelin netistä) ja se oli ihan hiton vaikeaa! Bugeja tuli ja ohjelmieni rakenteet olivat aivan männystä. Hirveällä väkisin vääntämisellä sain kuitenkin projektini valmistumaan (Tetris, Breakout, Pacman).

Vuosi sitten aloitin yliopistossa ja otin huvikseni C++:n alkeiskurssin. Luulin tietäväni kaiken (olinhan ohjelmoinut 3 vuotta), mutta kurssilla selvisikin, miten väärin olin ohjelmoinut! Juuri tuollaisia pikkujuttuja mistä Dzarg on sanonut. Yhtäkkiä ohjelmointi muuttui paljon helpommaksi. :P

Muutama kuukausi sitten lainasin kirjastosta oppikirjan: olioiden ohjelmointi C++:lla. Nykyään toimiva pelikoodi tulee kuin itsestään... Java on kuulemma helpompaa kuin C++, mutta varmasti siinäkin tulevat samat ongelmat vastaan :)

Ps. pitänee harkita tuota javan lataamista.. :)

– PekkoK 15.8.2009 18:21

Nuolia nyt sen verran vähän vielä, että se ei paha ongelma ole, mutta jos pelissäsi ammuttaisiin esimerkiksi sata tai tuhat ammusta sekunnissa, niin tämä aiheuttaisi hirveän määrän turhaa roskienkeruuta ja olioiden luontia.

Particle-engineissä usein luodaan alussa esim. 100 kappaletta "tyhjiä" Particle-oliota pooliin. Aina kun particle ammutaan niin käytetään vaikka metodia annaParticle(määrittelyt) ja se ottaa (yleensä jono rakenteesta) yhden olio tyyliin uusiParticle = jono.poll(); (poistaa ja palauttaa jonon ylimmän Javassa) ja sitten annaParticle-metodi asettaa sille halutut arvot muuttujiin ja palauttaa viittauksen. Roskaa ei tule pelin aikana ja particlet ovat silti olioita. Tuhoutuessaan particle pitää lisätä uudestaan jonoon käytettäväksi. Dynaamisesti kasvava onnistuu helposti luomalla vain uusia olioita jos jono on päässyt tyhjäksi.

– Cloudanger 15.8.2009 21:49

@PekkoK
En tosiaankaan tunne kauhian hyvin (olio-)ohjelmointia. Kirjastossa on jo jonkin aikaa ollut tarkoitus käydä jotain ohjelmointiin liittyvää hakemassa, ehkäpä tässä vihdoinkin kohtapuoliin jaksaisi siellä käydä. :)

Mukavaa, että näin monet täällä antavat neuvoja koodaukseen liittyen. Kiitokset vielä kaikille neuvoa antaneille. :)

– Enwrath 16.8.2009 20:32