Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Roolipeliongelmaa

Sivun loppuun

zorm [02.05.2006 16:08:08]

#

Olen tässä kehitellyt (erkin ja warrior's heartin innostamana) omaa roolipeliä. kaikki on mennyt tähän asti ihan putkeen mutta nyt on tullut ensimmäinen probleemo mistä en pääse yli:
Pelissä sankarin animaatio pyörii annettujen arvojen mukaan (tässä 4 framea/kulkusuunta. 250 ms tauko framejen välissä), samalla pitäisi myös liikuttaa ukkoa eteenpäin joka muodostuu ongelmaksi. Olen miettinyt animaation kestoajan jakamista 32 osaan (tilen korkeus ja leveys) ja sitten muuttaa ukon koordinaatteja jakolaskun tuloksena tulevan aikavälin välein... Tämä voisi ehkä toimia nopeilla koneilla mutta entäs hitaammat? Animaatio ei saisi pyörähtää loppuun ennen liikkumisen loppumista (eikä tietenkään toisinpäinkään).
Olisiko kenelläkään ehdotuksia miten ukon liikkumisen voisi toteuttaa? :)

Metabolix [02.05.2006 18:14:27]

#

Useinhan noissa tapaa olla niin, että ukko "on" kahdessa ruudussa yhtä aikaa animaation ajan, tai sitten siirto tehdään aluksi ja animaatio tulee perässä. Joka tapauksessa animaation sijainti kannattaa puhtaasti tilepohjaisessa pelissä pitää erillään ukon sijainnista, ja muutenkin minusta hyvä ratkaisu on ilmoittaa koordinaatit tileinä (eli montako tileä x- ja y-suunnassa tietystä paikasta). Selityksestäsi käsitin, että koordinaatistossasi käytät tilen leveytenä sen oikeaa leveyttä.

zorm [02.05.2006 20:55:32]

#

Metabolix kirjoitti:

Joka tapauksessa animaation sijainti kannattaa puhtaasti tilepohjaisessa pelissä pitää erillään ukon sijainnista, ja muutenkin minusta hyvä ratkaisu on ilmoittaa koordinaatit tileinä (eli montako tileä x- ja y-suunnassa tietystä paikasta).

Otinpas neuvoistasi vaarin ja muutin ukon koordinaatit tilepohjaiseksi kuten kerroit ja annoin animaatiolle omat koordinaatti muuttujansa. Irrotin muuten tuon animaatiosysteemin pois tuosta ukon structista joten nyt voin myös lisätä muuta animoitua tekemättä animaatiomoottoria uusiksi. :)
Mutta nyt palataan siihen alkuperäiseen ongelmaan eli siihen ukon siirtoon.
Tuossa ensimmäisessä viestissä tarkoitan sitä pelaajalle näkyvää ukon siirtymistä pelikentällä. Kuten jo sanoin olen miettinyt että jos tuon animaation keston jakaa vaikka nyt 32 osaan ja ukkoa siirretään aina jakolaskun toloksena tulevan aikavälin välein 1 pixeli. Tämä menetelmä ei saattaisi kuitenkaan toimia hitaammilla koneilla sillä animaation ja liikkumisen pitäisi pysähtyä samaan aikaan ja oikeaan paikkaan. Toivottavasti ymmärrät mitä tarkoitan hiitaammilla koneilla tulevan 'epä-samaan-aikaan-valmistumisen' kanssa.

koodin päivitysosio toimii näin:

Onko ukko liikkumassa?
  Onko viime framenvaihdosta mennyt tarpeeksi aikaa?
    Nostetaan näytettävän framen numeroa.
    Tarkistetaan onko seur. frame yli framejen määrän.
      //Jos on, animaatio on loppu
      Nollataan muuttujat
    Animaation tarkistus loppuu
    Otetaan nykyinen aika talteen
  animaation päivittäminen loppuu

  //Tähän tulisi ukon siirtäminen eteenpäin
jos ukko ei ole liikkumassa...
  Tarkistetaan näppäimet jos ukko haluaisikin liikkua.
endif

Osaisitko antaa vinkkiä miten tuon ukon siirtymisen voisi toteuttaa? :)

Metabolix [02.05.2006 21:19:48]

#

Käytät liikkumisessa jonkinlaista ajanottosysteemiä, jonka perusteella määrität, kuinka nopeasti voi liikkua. Käytä siis samaa systeemiä myös animaatiossa. Esimerkiksi voisit tallentaa animaatiossa jokaisen kuvan tiedot tietueeseen, jossa on kuvan alkamisaika animaation alusta laskettuna ja kuvan numero. Näin siis animaation ei tarvitsisi välttämättä olla edes säännöllinen, jos muulle tulisi tarvetta. Oikea kuva taas löytyy helposti:

(* Lasketaan animaation alusta kulunut aika. *)
Animaatio.Aika := Animaatio.Aika + Kulunut_Aika;

(* Tee miten teet, mutta minä laitan sen lopusta takaisin alkuun :) *)
if Animaatio.Aika > Animaatio.Kesto then begin
  (* Modulo = mod = % *)
  Animaatio.Aika := Animaatio.Aika mod Animaatio.Kesto;
  Kuva := 0;
end;

(* Ja sitten silmukassa nostetaan kuvan numeroa yhdellä, kunnes ollaan oikeassa kohti. *)
while (Animaatio.Kuvat[Kuva + 1].Aika <= Animaatio.Aika) do
  Kuva := Kuva + 1;

Noin siis pseudo-Pascalina.

Tapoja animaation sijainnin hoitamiseen tulee mieleen kaksi. Joko asettelet sen tuosta ajan perusteella tai käytät tuplalevyistä animaatiota (siis 64x32), jonka piirrät täyttämään sekä alku- että loppuruudut. Jälkimmäisellä tavalla sulavan animaation teko on paljon helpompaa, eikä tarvitse liikaa miettiä, minne sen piirtää.

zorm [03.05.2006 20:05:27]

#

Animaatiosysteemiä en usko tarvittavan muuttaa sillä se toimii mainiosti. (Kiitos kuitenkin ehdotuksesta!)
Noista siirtymisehdotuksista:
Tuo tuplalevyinen animaatio toimisi luulltavammin parhaiten mutta minun pitäisi luoda suuri osa animaatiosysteemiä uudelleen sillä framet (kaikkiin suuntiin) ovat kuvassa peräkkäin. Se voisi myös tarvitä pientä virittelyä joten en mieluusti kallistuisi siihen. Yritän vielä saada tuota aikaan perustuvaa liikkumista toimimaan.
Voisitko sinä (Pro-koodaajana) vilkaista roolipelin koodia ja katsoa miten siihen pystyisi sen liikkumisen parhaiten toteuttamaan. (samalla ois myös kiva saada palautetta
koodista :)
Tuo oli sitten vain Pyyntö. :)

Metabolix [04.05.2006 09:33:37]

#

Omana itsenäni voin sitä vilkaista, tiedä sitten pro-koodaajasta.

Lukaisin kysymyksesi uudelleen ja aloin ihmetellä, miten oikein teet systeemin, jos animaatio ja liikkuminen eivät välttämättä toimi samaan tahtiin? Ei kannata koskaan laskea mitään yhden kuvan kestoaikaa, kun siinä kuitenkin tahtoo sattua pyöristysvirheitä. Tuo animaation kestoon suhteutettu systeemi on joka suhteessa parempi. Siis kokonaisuudessaan idea, jos animaatio pysäytetään lopuksi:

if Aika_Animaation_Alusta > Animaation_Kesto then
  Lopeta_Animaatio
else begin
  Kuva = Kuvien_Maara * Aika_Animaation_Alusta / Animaation_Kesto;
  Sijainti = Tilen_Leveys * Aika_Animaation_Alusta / Animaation_Kesto;
end;

zorm [04.05.2006 15:16:17]

#

Pistän sinulle koodin Sähköpostiin.(Zipattuna).
Tuo toinen kertomasi tapa voisi toimia mutta tuohon sijainnin määritykseen pitäisi ainakin lisätä tiedot nykyisestä olinpaikasta. (vai ymmärsinko jotain väärin?)
En lisää tuota pätkää siihen koodiin minkä lähetän sinulle jotta saisit sen alkuperäisen version, koska tuon käyttöönottamiseksi nykyistä koodia pitäisi hieman muuttaa. :)

p.s Kun luet tuota koodia niin muista että se on minun ENSIMMÄINEN suurempi projektini. ennen olen tehnyt vain pikku ohjelmia. :)

Metabolix [04.05.2006 15:53:51]

#

Suosittelisin tosiaan animaatiosysteemin muuttamista jonnekin päin. Perusperiaatteena peleissä on yleensä se, että piirretään aina, kun ehditään, eikä odotella mitään animaation etenemistä. Meneillään oleva kuva on oikeastaan pakko laskea animaation aloitusajasta lähtien, muuten ei saa tasaista ja standardivauhtista animaatiota aikaan. Käytännössä tämä vaatisi toistaiseksi yhden funktion muuttamista. Animaation sijainnista sen verran, että minusta kannattaisi ilmoittaa sen sijainti suhteessa ukkelin sijaintiin ja laskea absoluuttiset koordinaatit vain piirrettäessä.

Lisäksi suosittelisin ehdottomasti luokkien hyödyntämistä, kun kerran C++ on käytössä.

zorm [05.05.2006 14:06:03]

#

Ok.
Yritän muuntaa saada tuota animaatio-liikkumista toimimaan antamiesi vinkkien avulla. Kiitos kaikesta avusta! :)

p.s Mietin kyllä noiden luokkien käyttöä structien sijaan mutta pidän niistä vain enemmän. ;)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta