Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SDL oppia ja muutakin

Sivun loppuun

ristokor [27.12.2005 02:09:23]

#

Eli tässä opettelin taannoin tuota SDL:lää ja sain kuin sainkin kuvan ruudulle. Mutta mieleen tuli muutama kysymys. Pystyykö jos käyttää SDL:lää niin kirjoittamaan ruudulle jotain tekstiä vai pitääkö se tekstikin laittaa kuvana?
Entä tekstin kirjoitus?
Sitten jos haluaa että näytössä on pallo jonka sijainti on x ja y, ja sitten painaa ylänuolta niin y kasvaa vaikkapa yhdellä ja pallo liikkuu. Täytyykö se liikkuminen toteuttaa tuolla tavalla. Ja sitten jos haluaa ääntä kuulumaan esim. Auto ajaa seinään. Auton sijainti on x ja y ja jos x=50 silloin: toista ääni PUM. Toteutetaanko se noin.
Ja en vieläkään ole saanut selville, että miten muuttuja tallennetaan tiedostoon, josta sen voisi ladata kun ohjelmaa ajetaan seuraavan kerran? Sekin on kai joku funktio, mutta mikä.
Ja sitten: En ole vieläkään käyttänyt kertaakaan olioita ja luokkia (saatikka kunnolla opetellutkaan) ja olen pärjännyt aivan hyvin. Missä niitä olioita ja luokkia kannattaisi käyttää?

Kieli on siis c++.

Ja hakua ei tarvitsisi jos olisi enemmän alikansioita joihin aiheet lajiteltaisiin. Haulla kun ei tahdo löytää mitään.

Metabolix [27.12.2005 08:26:02]

#

Kyllä, teksti pitää tulostaa kuvina. Helpostipa sitä tekee funktion, jolle annetaan syötteenä teksti ja joka tulostaa sen ruudulle. Kannattaa siis varmaankin tehdä kuvatiedosto, jossa on aakkoset ja tarvittavat erikoismerkit peräkkäin, vakiolevyisinä.

Kyllä, ääniefektit yleensä soitetaan juuri silloin, kun jotakin tapahtuu. Mitähän nyt oikein hait takaa tuollakin kysymyksellä? Varmaan kannattaa myös pysäyttää se auton liike, kun se törmää; hieman hassu tuollainen irrallinen ääniefekti olisi.

Tiedostoista on kerrottu hieman C-opassarjan 4. osassa. Varmaankin kannattaa ensin opetella noita tekstitiedostoja käyttelemään, kun binääritiedostoissa on suurempi riski virheille. Binääritiedostoja opas ei käsittele, joten tässä esimerkki:

FILE * Tiedosto;
int Muuttuja;

// Avataan tiedosto kirjoitettavaksi (w) binäärimuodossa (b)
Tiedosto = fopen("tiedostonimi.joku", "wb");

// Kirjoitetaan muistista Muuttujan kohdalta int:n kokoisia paloja yksi kappale Tiedostoon.
fwrite(&Muuttuja, sizeof(int), 1, Tiedosto);

// Suljetaan tiedosto
fclose(Tiedosto);

Lukufunktio fread toimii aivan samalla tavalla. Silloin tiedosto avataan yleensä luettavaksi (rb).

Luokkia eli olioita kannattaa käyttää sitten, kun tuntuu, että niistä on jotakin apua koodin selkeyden kannalta. Ei niissä sinänsä mitään ihmeellistä ole, kaiken voi kyllä tehdä ilmankin. Tavallista tietuetta (struct) ja tavallisia funktioita voi tarvittaessa / halutessaan käyttää vastaavalla tavalla.

progo [27.12.2005 10:15:44]

#

ristokor kirjoitti:

Ja sitten: En ole vieläkään käyttänyt kertaakaan olioita ja luokkia (saatikka kunnolla opetellutkaan) ja olen pärjännyt aivan hyvin. Missä niitä olioita ja luokkia kannattaisi käyttää?

Hietasen C++ ja OPO -kirjassa mainitaan tämmöinen lausahdus: "Jos pystyt ajattelemaan jotain asiaa erillisenä, tee siitä luokka."

Tzaeru [27.12.2005 14:36:56]

#

Luokat ja oliot ovat ovelia, mutta ei niitä kannata käyttää ennenkuin koodia on päälle pari tuhatta riviä. Käsittääkseni Hietasen kirja on ennemmin tarkoitettu teknisen opiskelijoille, jotka joskus todella vastaavat meidän käyttämistä softistamme? Heille optimointi on tätäkin tärkeämpää, mutta jos tekee pientä peliä tai vasta harjoittelee, on hyötyprosentti melko olematon. Paitsi harjoituksena :-P

Hietasen kirjassa muuten myös käsitellään todella kattavasti binääri- ja tekstitiedostot. Kannattaa lukea.

Ainiin, ja SDL:llehän on n. n^10 valmista fonttikirjastoa/tavallista funktiota, tosin oman luominen ei liene kovin suuri haaste.

www.libsdl.org - löytyy selostukset, ohjeet, kirjastot..

ristokor [27.12.2005 16:51:30]

#

Kiitos vastauksista!

Mutta jos teen sen kuvan jossa on kaikki aakkoset yms. pitkässä rivissä niin miten siitä sitten tehdään tekstiä. Täytyykö joka kirjain hakea siitä erikseen niin, että muut kirjaimet eivät näy, ja sitten laittaa kirjaimet riviin?

Olikohan se nyt Liero, jonka hakemistossa oli sellainen kuva jossa on kirjaimet rivissä, ja taisipa olla sen Lieromadon kaikki liikkeetkin.

Juice [27.12.2005 17:34:27]

#

Tzaeru kirjoitti:

Luokat ja oliot ovat ovelia, mutta ei niitä kannata käyttää ennenkuin koodia on päälle pari tuhatta riviä.

Tästä minä olen mieltä. Mielestäni luokat ja oliot selkeyttävät koodia jo aivan pienissäkin ohjelmissa ja ovat selvästi niissä hyväksi. Esimerkiksi oma XML+NCurses-tekstipeliengineni sisältää about 140 riviä ja käyttää luokkia ja niin on hyvä.

Tzaeru [27.12.2005 23:14:36]

#

No, kun sinulla on se kuva jossa on rivissä nämä merkit, määrittelet sitten koodissa, kun haluat piirtää vaikka kirjaimen T, että se kuva piirretään näytölle alkaen siitä tietystä pikselistä, josta T:kin alkaa ja loppuen siihen tiettyyn pikseliin, johon T myös loppuu.

ristokor [28.12.2005 01:30:20]

#

Mitä eroa on .dat ja .txt tiedostoissa? Ja pystyikö jos haluan esim. viisi muuttujaa tallentaa samaan tiedostoon niin luetaanko ne sieltä normaalisti muuttujan nimellä, ettei tarvitse mitään rivinvaihtoja? Ja mitä eroa on binäärillä ja tekstitiedostolla, vai onko binääri lukuja varten ja teksti tekstiä varten.

Metabolix [28.12.2005 01:54:22]

#

ristokor kirjoitti:

Mitä eroa on .dat ja .txt tiedostoissa?

Se, että toisen nimi loppuu .txt ja toisen .dat. Varmaan myös Windows yrittää tuplaklikatessa avata ne eri ohjelmiin. Ei muuta.

ristokor kirjoitti:

Ja pystyikö jos haluan esim. viisi muuttujaa tallentaa samaan tiedostoon niin luetaanko ne sieltä normaalisti muuttujan nimellä, ettei tarvitse mitään rivinvaihtoja?

Miten niin muuttujien nimellä? Ei tiedosto tiedä, minkä nimisiä muuttujia siellä on. Ja tekstitiedoon tallentaessa pitää laittaa väliin jotakin, yleensä väli tai rivinvaihto.

ristokor kirjoitti:

Ja mitä eroa on binäärillä ja tekstitiedostolla, vai onko binääri lukuja varten ja teksti tekstiä varten.

Tekstitiedostossa on tekstiä. Ovathan luvutkin tekstiä, jos ne kirjoitetaan numeroin. Binääritiedostossa tieto on juuri sellaisena kuin se on muistissa ollut ennen tallentamista, ja siksi sen voi lukea suoraan takaisin muistiin ilman, että sille tarvitsee tehdä sen kummempia muunnoksia. Se vie myös vähemmän tilaa.

Tuosta tekstin kirjoittamisesta:

for (int i = 0; i < Tekstin_Pituus; i++)
{
  Piirra_Ruudulle(
    Tekstin_X + (Kirjaimen_Leveys * i), Tekstin_Y, // Tähän kohti
    Kirjainkuva, // Tästä kuvasta
    Kirjaimen_Leveys * Monesko(Teksti[i]), 0 // Tästä kohti kuvaa
  );
  // "Monesko" siis kertoo, monentenako haluttu merkki on kuvassa
}

exAtuu [28.12.2005 04:28:42]

#

Täällä jo mainittiinkin SDL:n lisäkirjastot. Tässäpä yksi oiva, jolla voi käyttää normaaleja TrueType-fontteja.

http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fttf

ristokor [29.12.2005 01:46:51]

#

Latasin ja asensin tuon TTF kirjastot ja kun nyt aloitin uuden SDL projektin niin sain includettuakin sen kirjaston. Mutta mitäs nyt? Tuo ohje siellä sivulla on hieman vaikeaselkoinen, mutta jonkin verran sain selkoa, että haluaisin käyttää tuota "Shaded" "tilaa" kirjoittamisessa.
Miten saisin tuolla näkymään vaikkapa tekstin Hello world!?

Bfonttia kokeilin myös mutta ilmeisesti siinä on virhe kun kääntäjä antoi errorin, että siinä kirjastossa on jotain vikaa.

Tumpelo [04.01.2006 15:08:58]

#

ristokor kirjoitti:

Tuo ohje siellä sivulla on hieman vaikeaselkoinen, mutta jonkin verran sain selkoa, että haluaisin käyttää tuota "Shaded" "tilaa" kirjoittamisessa.
Miten saisin tuolla näkymään vaikkapa tekstin Hello world!?

Tuo kiinnostaisi minuakin. Voisiko joku valaista?

Tumpelo [04.01.2006 21:30:56]

#

Tulipa tässä mieleen että kuinka SDL:llä käännetään jotain surfacea tietyn astemäärän verran?

Metabolix [04.01.2006 21:41:02]

#

SDL-opassarja, 4. osa

Ja vaikka tuossa oppaassa ei sitä mainita, periaatteessa nuokin kuvat pitää aina SDL_FreeSurface-funktiolla vapauttaa.

Tumpelo [04.01.2006 21:46:41]

#

Joo huomasinkin juuri itsekin, oli semmonen kutina että jossain oon lukenu siitä kuvan kääntämisestä mutta en meinannut keksiä missä...

Kuinkas muuten jos kuvia ei vapauta tuolla FreeSurfacella? Meneekö joku välimuisti tukkoon?

Metabolix [04.01.2006 22:01:19]

#

No kai siinä käy ihan samalla tavalla kuin jos varaat mallocilla muistia etkä vapauta sitä. Ihmettelen, miksi ihmisten SDL-ohjelmat toimivat vielä hetken jälkeenkin, kun useimmista tuntuu tuo vapautus puuttuvan. SDL:n lähdekoodin perusteella kuvapinnat eivät itse minnekään lähde. Kannattaisi varmaankin käyttää sellaista SDL-käännöstä, joka ilmoittaa lopussa, montako pintaa on vapauttamatta, ja tulostaa sen ihan ruudulle eikä niihin tiedostoihin, jotka aina häviävät ohjelman lopuksi.

Tumpelo [05.01.2006 14:08:43]

#

Esitänpä vielä tänne kysymyksen, eli miten saa hiiren koordinaatit määrättyä, siis valittua osoittimen paikan?

os [05.01.2006 14:22:30]

#

SDL_WarpMouse(x,y);

Tumpelo [05.01.2006 14:50:40]

#

Lisää kysymyksiä: miten saan SDL_mixerillä soitettavan äänen toimimaan myös funktioissa? Ilmeisesti se äänisysteemi pitäisi jotenkin määrittää julkiseksi, mutta miten?


Sivun alkuun

Vastaus

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

Tietoa sivustosta