Tuota noin tietääkö kukaan(varmana joku tietää) miten c++:lla voi tulostaa grakiikkaa? Haluaisin kovasti tietää miten sitä pystyy tulostamaan,koska se on kiusannut minua jo jonkin aikaa.
Kaippa sitä voisi tehdä ilman apukirjastojakin jotenkin, mutta olen saanut sellaisen käsityksen, että tällaista ajatusta vastustetaan, joten lienee syytä käyttää valmiita grafiikkakirjastoja. Aiheesta on keskusteltu monta kertaa, joten hausta löytyy varmasti asiaan liittyviä aiheita.
std::cout << "hei";
Siinä sinulle grafiikkaa :)
Standardikirjastosta ei löydy mitään apuja "oikean" grafiikaan ulostamiseen. Tietysti yksinkertaisimmillaan grafiikkaa voi mahdollisesti näyttää kirjoittamalla tiettyyn muistiosoitteeseen.
Ehkä kannattaa noudataa hunajavohvelin neuvoa ja käyttää jotain valmista kirjastoa, kuten Direct3D, OpenGL, SDL tms.
DOSissa saa etsiskellä sopivia kirjastoja, mutta Windowsissa grafiikkaa saa hyvinkin helposti.
fawkz: jos ei tee 3D:tä, niin OpenGL ja DirectX eivät hyödytä juurikaan muuten kuin DirectDrawSurfacen tms muodossa. SDL:stä en taas paljoa tiedä, mutta enpä usko senkään olevan kovin tärkeä henkilölle, joka tietää mitä tekee. Suurin ongelma taitaa usein olla kuvien lataaminen muistiin; sen jälkeenhän piirtäminen onnistuu BitBlt:llä yms.
Kyllä OpenGL:ää ja Direct3D:tä voi 2D-pelienkin teossa käyttää ja se voisi olla melkeinpä suositeltavaa nykypäivinä että saataisiin edes jotain irti niistä näytönohjainten 3D-ominaisuuksista. Esim. kaikki partikkelisysteemit, blendaukset yms menee melko suoraan kun alla on GL / D3D.
fawkz kirjoitti:
Tietysti yksinkertaisimmillaan grafiikkaa voi mahdollisesti näyttää kirjoittamalla tiettyyn muistiosoitteeseen.
Miten tuo muuten käytännössä toimii, ja osaako joku sanoa, miksi sitä ei saisi muka käyttää?
Jos saat vaihdettua näyttötilan 13h:ksi,
voit kirjoittaa näyttöön näin:
_asm { mov cl, vari mov bx, y * 200 + x mov [bx], cl // siirretään cl -rekisterin väri pikseliin(bx:n osoittama muistiosoite) }
Jos x tai y on yli 320 * 200 osoittamien rajojen. Saattaa käydä hieman heikosti, kun ohjelma kirjoittelee näyttöalueen ulkopuolelle.
Koodia en ole testannut, ja se on kirjoitettu näppituntumalla.
Jos joku huomaa virheen, haukkukoon minua.
Edit: pieni muutos koodiin :P
Edit: Huom! Vari on siis luku väliltä 0-255 ja se osoittaa paletin väriin.
fawkz kirjoitti tuolla aikaisemmin ihan asiaa. Kun käytännössä suurimmalla osalla pelien pelaajista on näytönohjain, joka tukee lähes kaikkia mahdollisia rajapintoja ja tekniikoita, niin miksi keksiä pyörää uudelleen? Kirjastot hoitavat asiat yleensä aina paremmin ja nopeammin. DOS on sitten aivan eri juttu.
Oletetaan, että ihminen on juuri aloittanut ohjelmoinnin C/C++:lla. Eikö ole hieman liikaa vaadittu, että ensimmäinen graafinen ohjelma pitäisi tehdä DirectX:llä tai OpenGL:llä? Toki sitten, kun tekee ensimmäisen vähänkin vakavammin otettavan ohjelmansa, on jo hieman perusteltua käyttää jotakin rajapintaa, mutta voi olla oppimisen kannalta parempi aloittaa Windowsin perusfunktioilla.
Edit: typo
jaa no taitaa olla aika miettiä noita vaihtoehtoja... kiitos vain kaikille! :D
peki: ei kyllä onnistu noin, ellei DS-segmenttiä ole asetettu arvoon 0xA000. Ja tuo "y * 200 + x" lasku ei tietenkään asmissa toimi suoraan noin. Ja yleensäkkään tuo pätkä ei oikein suojatussa tilassa toimi.
hunajavohveli: tuota ei nykyisin voi käyttää sen takia että käyttöjärjestelmät ovat melko tarkkoja siitä minne antavat normaaliohjelman kirjoittaa. Teoriassa se toimii ihan vain kirjoittamalla muistiin tiettyyn paikkaan, esim C:llä...
unsigned long *foo = (unsigned long *)0xA0000; *foo = 1234;
...mutta käytännössä ei, ainakaan useimmissa käyttöjärjestelmissä :)
käytä kirjastoa windows.h
Metabolix: Niin, ja toisaalta kun tekee kaiken itse, niin silloinhan sitä vasta oppii.
Kokeilemalla oppii aivan erityisen hyvin, eikä kone yleensä edes kärsi kovin pahasti.
Varoituksen sana kaikille funktiosta TransparentBlt
: se aiheuttaa ongelmia Windows95/98:ssa jos sitä käyttää monta kertaa.
fawkz kirjoitti:
...mutta käytännössä ei, ainakaan useimmissa käyttöjärjestelmissä :)
Harmi, etten sitten voikaan soveltaa C:llä grafiikassa tee-se-itse-ja-opi-paremmin -periaatettani :), joten täytynee sitten vain yrittää siirtyä johonkin kirjastoon...
hunajavohveli: Jos haluat välttämättä kirjoitella suoraan näyttömuistiin, voit tietty säätää vaikka DJGPP:llä (joka tekee 32-bittisiä suojatun tilan DOS-sovelluksia). tee-se-itse-ja-opi-paremmin-periaate on minustakin hyvä periaate :) Tosin kyllä monissa kirjastoissakin opettelua riittää ja kyllä niissäkin muistiin käsiksi pääsee, ei vain noin suoraan :)
Voisin ehkä joskus kokeilla, mutta tuo SDL näytti kyllä niin yksinkertaiselta, ja nyt kun on tuo uusi opaskin niin pääsen luultavasti siitä alkuun. Asennuspakettien purkamisessa vain tuli ongelmaa..
Aihe on jo aika vanha, joten et voi enää vastata siihen.