Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Grafiikkaa,kiitos

Sivun loppuun

Koipio-ohjelma [15.07.2004 21:52:27]

#

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.

hunajavohveli [15.07.2004 21:59:38]

#

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.

thefox [15.07.2004 23:48:18]

#

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.

Metabolix [16.07.2004 00:51:26]

#

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.

thefox [16.07.2004 09:55:13]

#

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.

hunajavohveli [16.07.2004 10:43:07]

#

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ää?

peki [16.07.2004 11:17:11]

#

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.

KemXy [16.07.2004 11:46:00]

#

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.

Metabolix [16.07.2004 16:00:49]

#

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

Koipio-ohjelma [16.07.2004 20:11:38]

#

jaa no taitaa olla aika miettiä noita vaihtoehtoja... kiitos vain kaikille! :D

thefox [17.07.2004 02:02:01]

#

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ä :)

aWW [17.07.2004 12:55:24]

#

käytä kirjastoa windows.h

KemXy [17.07.2004 14:20:59]

#

Metabolix: Niin, ja toisaalta kun tekee kaiken itse, niin silloinhan sitä vasta oppii.

Metabolix [17.07.2004 14:43:43]

#

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.

hunajavohveli [17.07.2004 19:51:36]

#

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...

thefox [19.07.2004 03:09:06]

#

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 :)

hunajavohveli [19.07.2004 11:09:48]

#

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..


Sivun alkuun

Vastaus

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

Tietoa sivustosta