Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++ SDL "tapoja"...

Sivun loppuun

Jon31 [29.07.2008 20:07:25]

#

Tuli mieleen C++ ja SDL:n käytöstä pari kysymystä, kun olen niitä tässä nyt harjoitellut.. Haluaisin tietää, että miten kannattaisi toteuttaa seuraavat asiat:

(Jos tarkoituksena on rakentaa peli tylliin, kuten 2d supermario etc.)

1. Ideanahan on, että hahmo aloittaa kentän vasemmasta päästä ja etenee maaliin, kentän oikeaan päähän, jolloin tausta liikkuu. Toteutetaanko tämä liikuttamalla hahmoa vai taustaa näytöllä? Eli jos painan oikeaa nuolinäppäintä, niin liikkuuko hahmo ja scrollaako tausta jotenkin samanaikaisesti vai?
Ja piirränkö taustan kuvankäsittelyohjelmalla yhdeksi kokonaiseksi esim. 10000px levyiseksi, vai yhdistetäänkö taustan palat jotenkin?

2. Kentän aikana on kaikkia esteitä, joiden läpi ei voi mennä, mutta niiden yli voi hypätä jne. Ovatko nämä kokonaan erillisiä kuvia, jotka on vain määritelty tietylle kohtaa näyttöä ja on määritelty, ettei hahmo voi olla samassa kohtaa tämän esteen kanssa?

3. Hahmon pitäisi olla maassa kiinni, mutta jos maa onkin epätasainen (ylämäkeä, alamäkeä), niin miten hahmo saadaan juoksemaan aina maan pinnalla?
Eli jos teen BNP -kuvamuodolla kuvan vuoresta, niin onnistuisko hahmon saada juoksemaan vuorta ylös ja alas..`?


Oliskohan jollain aikaa vastata.. :)

ByteMan [29.07.2008 20:35:37]

#

tämä on siis niinkuin itse nuo asiat tekisin, joku muu siis tekee ne eri tavalla kuin minä[/pakollinen_ilmoitus]
0. lue koodivinkeistä metabolixin "reaaliaikaisen peli runko" helpottaa elämää
1. koska koko kenttää arvatenkaan ei haluta ruudulle samanaikaisesti, kannattaa tehdä jotain tyyliin:

if(ukko.x > (nayton_leveys - 100) ) { piirtamisen_x_bufferi += 10; }
//sama toiseen suuntaan

esimerkissä olen ajatellut että kyseessä on taulukko, mistä näytölle blitataan jokin määrä tilen sukuisia kuvapalasia->

for(int i = 0; i < 25; i++){
    for(int j = 0; j < 15; j++){
        piirra_tile(kartta[i+piirtamisen_x_bufferi][j]);//tämä siis on jutun ydin
    }
}

tai vaihtoehtoisesti piirrät saman tyylisesti aina eri alueen esim. siitä 10000px leveästä kuvasta(taitaa jopa olla tehokkaampi)
esteet kuitenkin kannattaa tallettaa taulukkoon(minun tietämykseni mukaan, joku saattaa tietää jonkun über nerokkaan vektoreihin liittyvän tehoratkaisun)

2.jatkaen 'esteet taulukkoon' linjalla, piirrä esteet taustaan ja määrittele kys. sijainti taulukkoon esim.

if (kartan_esteet[ukko.x][ukko.y] = "#") { tormays_funktio(); } // # siis esittää seinää/estettä

3. esim.

if (kartan_esteet[ukko.x][ukko.y] = "/") { ukko.x += 3; ukko.y += 3; } // 45 asteen kulmassa ylöspäin

tämä on siis se miten lähestyisin noita kohtia tällä hetkellä(ts. tietotaitotasolla)
toivottavasti auttoi kuitenkin ;)

Metabolix [01.08.2008 11:07:12]

#

1. Tee asia aivan oman harkintasi mukaan. Useinhan se ukkeli pysyy keskellä ruutua, jolloin siis tausta liikkuu sopivasti. Usein myös maailman reunassa taustan liike pysähtyy ja hahmo liikkuu lähemmäs ruudun reunaa. Lisäksi on erilaisia mahdollisia efektejä, esimerkiksi hahmo voi pysyä tietyn laatikon sisällä ruudun keskellä, jolloin tausta liikkuu vasta, kun hahmo siirtyy laatikon reunalle. Aloita ensin vaikka siitä versiosta, jossa hahmo pysyy keskellä, koska sen joudut kuitenkin kehittämään pohjaksi muillekin vaihtoehdoille.

2. Jos piirrät joka tapauksessa kartan kokonaan itse, voit saman tien piirtää siihen kaikki ne esteet, jotka eivät liiku. (Useinhan pelit ovat tilepohjaisia, jolloin esteetkin ovat yleensä tilejä.) Jostakin täytyy tietää, mitkä pikselit ovat tyhjiä ja mitkä esteitä. Yleensä tällöin tarvitaan joko erikseen taustan ja esteiden kuvat tai vaihtoehtoisesti erikseen grafiikka ja yksi bittikartta, jossa on esimerkiksi mustalla ja valkoisella eroteltu esteet ja vapaa alue. Ensimmäisen tavan etuna on, että saat kaupan päälle välineet hienoon efektiin, jossa tausta liikkuu hieman hitaammin kuin varsinainen taso. Toinen tapa taas mahdollistaa harmaasävyjen käytön estekartassa esimerkiksi veden kuvaamiseen niin, että siinä on hitaampi liikkua kuin täysin valkoisella alueella. Tietenkin voit käyttää jälkimmäistä tapaa, vaikka tekisitkin myös ensimmäisessä mainitun efektin.

3. Tilepohjaisessa pelissä tehdään suunnilleen noin, kuin ByteMan yllä esittää, eli tilessä voi liikkua vain tiettyyn suuntaan. Sen sijaan kokonaan piirretyllä kartalla täytyy tehdä tutkimukset bittitasolla. Itse ehkä lähtisin siitä, että vetäisin hahmon jaloista viivan yläviistoon sellaisessa kulmassa ja niin pitkälle, kuin hahmo enintään voi liikkua, ja tarkistaisin, osuuko se seinään. Tästä eteenpäin optimaalinen mutta hyvä tarkistus käykin jo mutkikkaammaksi, enkä nyt rupea spekuloimaan asiaa.

Jon31 [03.08.2008 17:57:20]

#

Hei sellasta vielä, että jos olen vaikka c++:lla tehnyt jonkun pelin, niin miten on mahdollista pelata peliä netin kautta toisten kanssa? (Eli miten saadaan käyttöön nettipelin ominaisuudet)

Tuli vielä mieleen, että miten peli saataisiin "upotettua" nettisivuille, kuten esim. habbo ja runescape...?


Eipä muuta :)

tgunner [03.08.2008 18:31:23]

#

Kun kerran olet innostunut SDL:stä, suosittelen SDL_net-kirjastoon tutustumista. Nettisivuille et saa C++:lla ohjelmoitua peliä upotettua mitenkään. Habbo ja Runescape on tehty aivan eri härveleillä.

Jon31 [03.08.2008 19:02:35]

#

Käytän oikeastaan OpenGL:ää ja SDL:ää yhdessä, joten kannattaako tutustua tuohon SDL_net -kirjastoon vai löytyykö OGL:stä joku parempi ominaisuus? (Onkohan missään mitään oppaita englanniksi (suomeksi ei varmaankaan ole) tuosta kirjastosta..?)

Sopiiko vielä kysyä, että millä "härveleillä" nuo habbo etc. on sitten tehty? Kiinnostaa vain.

Hakoulinen [03.08.2008 23:11:07]

#

Jon31 kirjoitti:

Käytän oikeastaan OpenGL:ää ja SDL:ää yhdessä, joten kannattaako tutustua tuohon SDL_net -kirjastoon vai löytyykö OGL:stä joku parempi ominaisuus? (Onkohan missään mitään oppaita englanniksi (suomeksi ei varmaankaan ole) tuosta kirjastosta..?)

Sopiiko vielä kysyä, että millä "härveleillä" nuo habbo etc. on sitten tehty? Kiinnostaa vain.

OpenGL on pelkkä grafiikkakirjasto (joskin aivan loistava sellainen). SDL/OpenGL -kombinaatiossa OpenGL piirtää grafiikat ja SDL hoitaa kaiken muun kuten hiiren ja näppäimistön syötteet. SDL_net on yksi parhaista nettikirjastoista ja helppokäyttöinenkin. Googletat vaan niin kyllä sieltä opasta löytyy.

Runescape on tehty javalla ja Habbo taitaa olla Shockwavella (öö?).

ByteMan [03.08.2008 23:14:43]

#

runescape on tehty javalla habbosta en tiä.
opengl piirtää grafiikan, sdl hoitaa syötteet, ikkunan, viestit, nettiyhteydet yms.

edit: hidas

Grez [03.08.2008 23:35:11]

#

Ainakin Habbon rekisteröitymissysteemi on tehty Shockwavella, eli luultavasti varsinainen systeemikin. Tai, no ainakin olisi hölmöä tehdä rekisteröinti (joka sisältää hahmon luonnin etc.) eri tekniikalla kuin muu systeemi.

Triton [04.08.2008 01:34:29]

#

Habbon hahmonluontiohjelma on kyllä Flashillä tehty ja itse rekisteröinti on ilmeisesti html+javascript-pohjanen.

Grez [04.08.2008 02:04:45]

#

No niin, mutta siltikin on oletettavaa että hotellikin on tehty sillä. Juuri nyt on paha tarkistaa,kun hotelli on kiinni 0-6 yöllä

Jon31 [04.08.2008 11:06:08]

#

Joo no pitää yrittää tutustua tuohon SDL_net -kirjastoon. Jos joku haluaa vielä valoittaa tuon toimintatapaa vähäsen, niin olkoon hyvä:) (Eli pitääkö tehdä lisäksi vielä palvelin, johon sitten yhdistetään jne. Sori tyhmyyteni)

os [04.08.2008 18:19:24]

#

SDL_net on kirjasto matalan tason datansiirtoon netin välityksellä. Kaikki korkeamman tason toiminta täytyy koodata itse. Nettipelin tai muun -ohjelman toteuttamiseen on monta tapaa. Eräs simppeli ja monesti toimiva malli on sellainen, että kaikki clientit ottavat yhteyttä yhteen serveriin, joka välittää tiedot clienttien välillä ja hoitaa vaihtelevassa määrin pelilogiikkaa.

Ohjelmaa ei yleisesti ottaen voi muuttaa "nettipeliksi" jälkeenpäin, vaan sen suunnittelussa on alusta alkaen huomioitava, miten ohjelman tila välittyy koneelta toiselle verkon välityksellä. Varsinkin reaaliaikaisissa peleissä tämä voi olla hyvinkin haastava ongelma.

Kannattaa varmaan aloittaa miettimällä, miten jokin kommunikaatioltaan yksinkertainen sovellus, kuten shakki tai laivanupotus, voitaisiin toteuttaa nettipelinä ja vaikka koodata sellainen esimerkiksi SDL_net:iä käyttäen. Tämän jälkeen monimutkaisempien verkkosovellusten toiminta aukeaa huomattavasti paremmin.

maz [06.08.2008 12:05:38]

#

SDL_net ei ole minulle tuttu kirjasto, mutta nimi haisee hywin vahvasti windows onlylle...

Jos et kovin raskasta liikenneprotokollaa aio toteuttaa, niin kannattaisi harkita verkkoliikenteen tekoon sockettien käyttöä. Winsock ja POSIX socketit kun saa hyvin pienellä vaivalla toimimaan samalla koodilla.

vidar [06.08.2008 12:20:48]

#

SDL_net on multiplatform. Samoin kuin boost::asio.

vehkis91 [06.08.2008 13:14:53]

#

Kyllähän SDL_net toimii linuxillakin, koska SDL toimii kanssa.

maz [06.08.2008 22:41:25]

#

ok. Kiitti oikaisusta :)

Jon31 [07.08.2008 15:02:58]

#

Laitetaanpa tää vielä tänne.
Eli kyseessä OpenGL ja 3d liikkuminen.. Miten hahmon liikkuminen 3 ulotteisessa ympäristössä siis tapahtuu?

Esim. on lattia ja sen päällä vaikkapa vain kuutioita. Sitten on hahmo, jonka pitäisi liikkua ympäristössä näppäimistöstä tulevien syötteiden mukaan. (Käytän SDL:ää tähän) Kuvakulma on hahmon takana kokoajan.

Miten siis tuo hahmon liikkuminen ja kameran seuraaminen toteutetaan käytännössä?
glTranslatef(); ja glRotatef(); funktioiden avulla vai jollain muulla tavalla?

os [07.08.2008 18:02:05]

#

Kameran liikuttamiseen kannattaa käyttää GLU:n (#include <GL/glu.h>, -lGLU) funkkaria gluLookAt, joka on tarkoitettu juuri liikkuvan "kameran" toteuttamiseen.

Sille annetaan siis kameran koordinaatit (eye-), kameran kohteen koordinaatit (center-), sekä vektori (up-), jonka avulla määritetään kamerakoordinaatiston "ylöspäin"-suunta. Jos koordinaatistossasi lattia on xy-taso ja z-akseli osoittaa ylöspäin, voit käyttää funktiota esimerkiksi näin:

GLdouble kohde_x = cos(phi)*cos(theta) + kamera_x;
GLdouble kohde_y = sin(phi)*cos(theta) + kamera_y;
GLdouble kohde_z = sin(theta) + kamera_z;

glLoadIdentity();
gluLookAt(kamera_x, kamera_y, kamera_z, kohde_x, kohde_y, kohde_z, 0,0,1);

phi ja theta ovat kameran suunta- ja korotuskulma (tietty radiaaneina, ks. http://fi.wikipedia.org/wiki/Koordinaatisto­#Pallokoordinaatisto), jotka siis lasketaan tyypillisesti hiiren liikkeistä. Tällä saadaan siis aikaan "First person" -kamera. "Third person" -kameran saat laittamalla pelaajasi koordinaatit kameran kohteeksi ja liikuttamalla itse kameraa mielekkäällä tavalla.

gluLookAtin jälkeen piirretään kappaleet, samassa koordinaatistossa, kuin kamera on määritetty (eli ilman mitään ylimääräisiä funktiokutsuja).

// Piirretään kappaleet pisteisiin (5,4,0) ja (-3, 5, -2)
glPushMatrix();
glTranslatef(5,4,0);
glutSolidTeapot(1);
glPopMatrix();

glPushMatrix();
glTranslatef(-3, 5, -2);
glRotatef(30,1,0,0); // kierretään 30 astetta x-akselin ympäri
glutSolidCube(1);
glPopMatrix();

gluLookAt ei tietenkään ole välttämätön vaan sen voi korvata kutsumalla glRotatef ja glTranslatef -funktioita oikeassa järjestyksessä.

Jon31 [08.08.2008 13:05:33]

#

Kiitokset.

Jon31 [08.08.2008 21:33:08]

#

En vielä ihan kunnolla ole saanut toimimaan, kun en tajua ideaa täysin..:D Koordinaatistossani lattia on xz-taso ja y-akseli osoittaa ylöspäin - kunhan nyt mainitsin.

Jon31 [09.08.2008 18:48:18]

#

Noni. Useimmat kännykkäpelithän tehdään javalla? Onnistuuko tämä C++ ja SDL/OpenGL -kirjastoja käyttämällä vai? Jostain luin, että C++:lla tehtäisiin myös kännykkään pelejä..

Jon31 [09.08.2008 21:59:55]

#

Sori useampi viesti, mutta jos käyttää tuota gluLookAt -funktiota, niin pitääkö käyttää myös gluPerspective -funktiota?

Sisuaski [10.08.2008 00:43:53]

#

Jon31 kirjoitti:

Sori useampi viesti, mutta jos käyttää tuota gluLookAt -funktiota, niin pitääkö käyttää myös gluPerspective -funktiota?

Ei tarvitse; näiden funktioiden tekemät työt ovat täysin erillisiä toisistaan.

Metabolix [10.08.2008 13:32:55]

#

Jonkinlainen perspektiivi on silti syytä asettaa, sen voit tehdä vaikkapa juuri mainitsemallasi funktiolla.

os [10.08.2008 16:45:44]

#

Jon31 kirjoitti:

Noni. Useimmat kännykkäpelithän tehdään javalla? Onnistuuko tämä C++ ja SDL/OpenGL -kirjastoja käyttämällä vai? Jostain luin, että C++:lla tehtäisiin myös kännykkään pelejä..

Kännykkäpelejä voi ohjelmoida millä tahansa sellaisella kielellä, jolle on implementoitu tulkki tai kääntäjä johonkin kännykkään. Lisäksi peliohjelmointiin vaaditaan myös oikeankieliset ohjelmointirajapinnat esimerkiksi grafiikalle ja äänelle. Eli menee ihan samalla tavalla kuin tietokoneohjelmienkin kanssa.

Toisin kuin PC-ohjelmoinnissa, Java on kännyköiden kanssa nykyään ainut kieli, jolla kirjoitetut ohjelmat porttautuvat useamman valmistajan (lue: sekä Nokian, että joidenkin muiden) puhelimiin.


Sivun alkuun

Vastaus

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

Tietoa sivustosta