Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Ajatteluun apua

Sivun loppuun

TeeVee [26.10.2005 13:57:16]

#

Päivää!


Aloin rakentamaan omaa roolipelimoottoria (ERKKI ei ihan soveltunut haluamaani) ja kaipaisin pientä apua ajattelun kanssa. Minulla on kaksi kysymystä, joihin kaipaisin vastaukseksi suomea enkä valmista koodia. Eli selittäisittekö miten se ohjelmoidaan, mutta ÄLKÄÄ antako valmista koodia, haluan itse pakertaa ja ohjelmoida sen =)


1.Kartta
Eli pelissäni tulisi olemaan ylhäältäpäin kuvattu grafiikka, kuten Tapankaikki peleissä. Mietinkin nyt, että miten kyhään seinät ja ansat ynm! Eli pitääkö värkätä jonkinlainen taulukko kartasta vai miten, en keksi miten tehdä :)


2.Hyökkääminen
Ok, tämä ei ole ajattelutapaongelma, mutta laitan sen nyt tähän. Elikkä minulla on luokassani jäsenfunktio Hyökkää(); Miten voin asettaa että sen yksi parametri olisi Creature luokan olio?

Mazuli [26.10.2005 15:03:47]

#

1. Riippuu minkälaisen haluat(tilet vai jotain muuta). Jos tilet on kyseessä kannattaa tehdä pari luokkaa esim.

class TileBase //luokka joka säilyttää kaikki kuvat
{
 public:
    int maara;  //kuvien määrä
    KUVA *kuvat;//taulukko kuvia
};

class Tile       //luokka joka sisältää kaikki tilen tiedot
{
  public:
    int tile;   //tilen numero kuvalle
    int tyyppi; //voiko tileen törmätä ja jne..
};

class Kartta //luokka joka sisältää tiedot kartasta
{
  public:
    int w,h;        //leveys ja korkeus
    Tilebase *tilet;//tile base
    Tile *data;     //kartan data
};

ja noihin sitte niit lataus, piirto, init jne.. funktioita..

2.

int Hyokkaa(Creature olio);

TeeVee [26.10.2005 20:35:52]

#

Hyvä, että huomasit minun tarkoittaneen C++ kieltä. Enää en voi ensimmäistä postausta muokata =(

Toiseen vastaukseen minulla oli vainu, mutta en ollut asiasta todellakaan varma, kiitoksia.

EDIT:Kai se on parasta tehdä tilegrafiikalla kartta ja sitten pelaajan kääntymistä kenties hieman mukailla sitten...

Miten muuten saisin pelaajat kääntymään Tapankaikki peleistä tutuksi tulleella tavalla? Sisältääkö SDL jonkun funktion jolla bittikarttaa voi pyörittää?

EDIT EDIT: Niin, mutta sitten tuli toinenkin ongelma, miten sitten saa muistiin mihin suuntaan sankarin nenä osoittaa :D

Metabolix [26.10.2005 21:08:47]

#

Käytä ehdottomasti osoitinta!
int Hyokkaa(Creature * olio);
Tuollainen funktio ei vain oikein toimi reaaliaikaisessa pelissä. Tai eihän sitä tiedä :) Minusta kannattaisi kuitenkin laittaa vain se ampumisfunktio, ja panosten osuminen saisi mennä ihan vain törmäystarkistuksiin.

Minä toteutin tiletyksen niin, että itse tilet löytyvät taulukosta tällaisista tietueista:

struct TPalanen {
  unsigned int
    Tilekartta : 8, // Mikä tilekartta
    Palan_X : 3,    // Tilen X kartassa
    Palan_Y : 3,    // Tilen Y kartassa
    Tyyppi_Paasee_Lapi : 1, // Seinä vai lattia?
    Ammus_Paasee_Lapi : 1;  // Ehkäpä ohut seinä?
/* 3-bittinen muuttuja => 8 vaihtoehtoa. Teoreettisesti säästää muistia, ja koska OpenGL ei aina pystynyt yli 256x256-kokoisiin tekstuureihin, niin päätin tukea vain niitä. Tilekoko oli 32x32. Läpipääsyt ovat siis vain 1-bittisiä, ja minusta nuo kaksi riittivät varsin hyvin. */
};

Loput ominaisuudet menevätkin mukavasti objekteina, joita voi käytellä paljon monipuolisemmin. Turha kuitenkaan joka tileen on liittää hirmuisesti ylimääräistä infoa, kun sitä ei kuitenkaan niissä kaikissa käytetä.

Suunta kannattaa tietenkin tallentaa float-muuttujaan (asteet tai radiaanit, mitä nyt kuvan kääntelyfunktiot syövät). Kuvan kääntely onnistuu SDL_gfx-apukirjastolla. Muistetaan sitten varoa muistivuotoja :)

TeeVee [26.10.2005 21:20:37]

#

Toteutetaanko peleissä tilekartat jostain tekstidatatiedostosta, vai pitäisikö koko kartta kirjoittaa käsin :o. Täytyy kai sitten tehdä generaattori kartoille :D

Btw, tuolla SDL oppaassa, osassa neljä on kuollut linkki; linkki joka osoittaa juuri SDL_gfx kirjaston lataussivustolle :D. Pikaisella googletuksella ei herunut muuta latauspaikkaa =/

EDIT: kyllä löytyi :D, mutta täytyy luopua ajatuksesta. Täytyy tyytyä täysin tilegrafiikkaan :)

Metabolix [26.10.2005 21:29:13]

#

Joo, perus karttoja saa helpolla aikaan, eikä ole kovin vaikea homma tehdä ohjelmaa, joka muuttaa sopivan tekstidatan sopivaan binäärimuotoon. (Jos et osaa, niin et kyllä osaa tehdä koko peliäkään.) Ehkä kannattaa sitä mutkikkaampaa karttaformaattia (erikoisobjekteja, aseita ja muuta) miettiä vasta sitten, kun saa ukeelin liikkumaan haluamaansa suuntaan ja törmäilemään seiniin. Editorikin on ennen sitä aika turha, kun sopivalla satunnaisuudella pääsee jo aika hyviin tuloksiin.

Mazuli [26.10.2005 21:30:35]

#

Kartta kannattaa ehdottomasti ladata tiedostosta.
Ensin voi olla vaikka tiedot kaikista kartassa käytettävistä tileistä tyyliin

tilemaara: 4
1 vesi.bmp
2 vesi2.bmp
3 maa.bmp
4 maa2.bmp

jossa numero tarkoittaa tilen numeroa ja teksti ladattavaa kuvaa. Niin ja ensin on tieto montako tileä kartassa on.
Sen jälkeen on vaikka kartan leveys ja korkeus ja kartta vaikka muodossa

leveys: 4 korkeus: 3
1/1 1/1 1/1 1/1
2/1 2/1 2/1 2/1
1/0 1/0 1/0 1/0

, jossa numeroparin(1/1 jne..) ekanumero tarkoittaa mitä tileä halutaan käyttää ja toinen pääseekö tilestä läpi tai muuta vastaavaa.
Nämä ovat vain esimerkkejä kannattaa toteuttaa varmaan erilailla, mutta kai näistä jotain mallia saa..

Edit: myöhästyisn xD

niin ja tosiaan karttaeditori kannattaa tehdä...

TeeVee [26.10.2005 21:36:49]

#

Kiitoksia. Tästä aloitankin seuraavaksi SDL:n muistiin palauttelun ja teen varmaan jonkinnäköisen tilekentän (6x6) ja joku hemmo heilumaan sinne :)

TeeVee [27.10.2005 22:19:22]

#

class TileBase //luokka joka säilyttää kaikki kuvat
{
 public:
    int maara;  //kuvien määrä
    KUVA *kuvat;//taulukko kuvia
};

Tulipahan mieleen, että omaako SDL jonkin tekniikan, jolla voisin taustan (SDL_Surface *tausta) muodostaa pienistä palasista, eli tileistä?

Blaze [27.10.2005 23:38:00]

#

Ei siihen mitään taikakeinoja ole, voit toki SDL_Blit():a sen taustan muodostumaan palikoista.

Mazuli [28.10.2005 14:07:30]

#

Ei ainakaan minun tietääkseni... Kannattaa varmaan muodostaa
ladatessa tilekartasta yksi kuva jonka sitten halutessasi blittaat ruudulle. Muista että ennekuin voit blitata tilen palasia kuvalle täytyy se luoda SDL_CreateRGBSurface():lla (
http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fCreateRGBSurface)
. Niin ja tuohon TileBase luokkaan kannattaa lisätä tilejen leveys ja korkeus.

TeeVee [28.10.2005 18:11:42]

#

Nöyrryn ja laitan roolipeliprojektin hattuhyllylle vähäksi aikaan. Aloitan peliohjelmoinnin jollain hieman helpommalla, kuten pongilla. Olen vähän turhan kokematon aloittamaan tuollaisen vaativamman sortin projektin.

kooderi [29.10.2005 11:30:30]

#

Sanoisin, että ensimmäistä projektia tehdessä ei kannata heti pyrkiä täydellisyyteen. Tee ensin ihan simppeli toteutus ja jos myöhemmin tuntuu siltä, muokkaa sitä pikkuhiljaa paremmaksi.

Metabolix [29.10.2005 11:37:49]

#

Sanoisin myös, että jos aikoo saada aikaan hyvän projektin (tai jos aikoo saada sen joskus valmiiksi asti), niin silloin sana "muokata" on hyvin vaarallinen. Sitten sitä tulee muokattua vielä vähän ja taas pikkuisen, eikä se tahdo ikinä olla juuri sellainen kuin pitäisi. Loppua ei tule koskaan vastaan. Siksi siis hyvä suunnittelu paperille ja toteutus tarkoin harkitusti mahdollisimman vähillä muokkauksilla.

Ihailtava asenne TeeVeellä. Juuri noin kuuluu toimia. Voin kokemuksesta suositella ensimmäiseksi peliprojektiksi Tetristä ja sen jälkeen jotakin pientä, jossa on vain ja ainoastaan nuo tilet ja ukkeli, joka siellä voi liikkua ja törmäillä. Siihen voi aina lisäillä pieniä ominaisuuksia, ja sen pohjalta on paljon mukavampi lähteä tekemään kunnollista koodia.

ZcMander [29.10.2005 11:43:33]

#

Hmm, itse tekisin sillalailla, että tilet on yhdessä tiedostossa ja sitten tilen korkeuden ja pituuden perusteella pilkotaan.

TeeVee [29.10.2005 17:27:06]

#

Olisiko kellään tietoa, mistä löytyisi artikkeli, jossa kerrottaisiin algoritmi törmäysten hallintaan (suora taso ja pallo)?

Metabolix [29.10.2005 21:22:31]

#

No Suomipelit.com:sta ainakin, ja GameDevistä.

Pisteen etäisyyden suorasta saa, kun laskee suoralle normaalimuotoisen yhtälön eli ax + by + c = 0. Pisteen etäisyys saadaan siis sijoittamalla tuohon kaavaan pisteen x ja y.

Tileillä homma toimii tietenkin sata kertaa helpommin. Katsot koordinaateista, minkä tilejen lähellä tyyppi on. Yllä ja alla olevista tarkistat y-koordinaatin, sivuilla olevista x-koordinaatin ja kulmittain olevista pythagoraan lauseella etäisyyden kulmaan nähden.


Sivun alkuun

Vastaus

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

Tietoa sivustosta