Olen tässä rakentelemassa piirto-ohjelmaa (kaikkien muiden projektieni lisäksi), jossa pitäisi yksinkertaisesti pystyä piirtämään. No, koodauksessa sattui virhe kohdassa Locate, enkä tiedä mistä se johtuu. Yli puolet koodista on Antti Laaksosen hiiri- koodivinkistä. Tässä koodi:
DECLARE FUNCTION AlustaHiiri! (onko%, napit%) DECLARE FUNCTION LueHiiri! (nappi%, x%, y%) DECLARE SUB NaytaHiiri (tapa%) DECLARE SUB RajaaHiiri (xp%, xs%, yp%, ys%) CLS TYPE RegType ax AS INTEGER bx AS INTEGER cx AS INTEGER dx AS INTEGER BP AS INTEGER SI AS INTEGER DI AS INTEGER FLAGS AS INTEGER END TYPE DIM SHARED o AS RegType DIM SHARED i AS RegType SCREEN 12 a = AlustaHiiri(onko%, napit%) IF onko% <> -1 THEN GOTO virhe LOCATE 1: PRINT "Löytyi "; LTRIM$(STR$(napit%)); "-nappinen hiiri!" NaytaHiiri 1 'näytetään hiiri RajaaHiiri 0, 640, 0, 480 'rajataan hiiren alue näytön kokoiseksi LOCATE 23: PRINT "(ohjelma loppuu, kun painat vasenta ja oikeaa nappia yhtäaikaa)" HIIRI: DO a = LueHiiri(nappi%, x%, y%) 'tutkitaan hiiren sijainti ja nappien tilat LOCATE 2: PRINT "Koordinaatit:"; x%; "x"; y% LOCATE 3: PRINT "Painettu nappi:"; nappi% IF nappi% = 3 THEN EXIT DO IF nappi% = 1 THEN GOTO PIIRRA LOOP END PIIRRA: ON ERROR GOTO PIIRRAVIRHE IF nappi% = 1 THEN LOCATE x%, y% PRINT "." GOTO HIIRI virhe: PRINT "Hiirtä ei löytynyt!" END RESUME PIIRRAVIRHE: CLS PRINT "TAPAHTUI VIRHE!" RESUME
QB valittaa aina TAPAHTUI VIRHE!- kohtaa eikä jostain syystä Locate toimi! Auttakaa!!
:MUOKKAUS:
Aliohjelmat tosta koodista unohtui, mutta niissä ei mitään vikaa ole.
Koordinaatit ei varmaan mahdu näytölle. Ota se virheenhallinta pois niin näet mitä qb itkee. (miksi edes tehdä piirto-ohjelmaa qb:llä :P - eikä kukaan gotoja käytä enää)
ILLEGAL FUNCTION CALL, valittaa QB ja osoittaa tekstiä:
IF nappi% = 1 THEN LOCATE x%, y%
??!! :-O
Nii-i, koordinaatit ei mahdu näytölle. Locate säätää tekstikursoria ja screen 12:ssa tais moista mahtua 80x30 tai 80x60.
SCREEN:in vaihto johonkin muuhun näyttötilaan ei auta. QB jäi jumiin, kun testasin... :-(
Voi luoja. Kokeile normaalilla näyttötilallas ja klikkaa hiirellä aivan vasemmaista yläkulman kohtaa.
Puhumattakaan siitä että koordinaatit ovat väärin. Siinä missä esim. graafisen puolen käskyissä ne menevät XY, pitää tekstipuolella laittaa YX. Tähän on muistaakseni ihan looginen selitys miksi näin, niiltä ajoilta kun grafiikkaa ei ollut ja eikä kaiketi edes tietokoneitakaan. Tietäväisempi saa selittää tarkemmin, jos tahtoo..
-Grey-
No minä voin lähteä kehittelemään jotain. Ruksaa yli tuo aikaisempi piikkini.
Eli jos sä teet piirto-ohjelmaa sanomasi mukaan, niin sä varmaan haluat piirtää ihan pikseleitä etkä mitään pisteitä? kumittele toi locate ja print pois ja sijoita pset-käsky locaten entiselle paikalle.
Kiitos! Nyt ohjelmani toimii! (Saatan laittaa tänne ladattavaksi)
Juu, ei tarvitse.
Miten voin tallentaa piirretyn kuvan?
Riippuu, haluatko tallentaa bittikarttana vai vektorigrafiikkana. Bittikartan tallennukseen sinun tulee lukea joka pikselistä väriarvo ja tallentaa se tiedostoon; vektorigrafiikkaa halutessasi tallennat jokaisen piirretyn pikselin muistiin sillä hetkellä, kun se piirretään, ja tallennat sitten joka pisteen koordinaatit (ja värin) tiedostoon. BMP, JPG, PNG ym. ovat bittikarttoja, ja SVG on vektorigrafiikkaa.
Huom.: Halutessasi voit yrittää pakata kuvaa (en suosittele aloittelijalle).
Jo hieman aiheen sivusta mutta kahvitauon kuluksi päätin tämänkin tänne rustata :D
Eli jos halutaan piirtää käyttäen LOCATE komentoa homma menee jotakuinkin näin.
'MouseY, MouseX = hiiren koordinaatit. 'PrintY, PrintX = kursorin koordinaatit ' nyt on painettu namiskaa ja halutaan piirtää. ' muutetaan pikselien koordinaatit kursorille sopivaksi PrintY = INT(MouseX / 8) PrintX = INT(MouseY / 8) ' parempi tarkistaa että tuli arvot jotka locatelle ja ruutuun sopii. IF PrintX > 0 AND PrintX < 61 AND PrintY > 0 AND PrintY < 81 Then LOCATE PrintX, PrintY : Print "*" END IF
Tämä on kahvitauolla kirjoitettu "koodi", testaamaton joten joku bugi saataa löytyä tai olla X/Y arvot väärin päin. Mutta perusidea siitä toivottavasti tulee esille.
gamehouse kirjoitti:
Miten voin tallentaa piirretyn kuvan?
Yksinkertaisimmillaan tallentamalla tiedostoon jokaisen näytöllä olevan pikselin värin. Tietyn pikselin väri selviää funktiolla POINT, ja pari sisäkkäistä FOR-silmukkaa on tarpeen. Tallennetun kuvan lataus tapahtuu päinvastoin: tiedostosta luetaan yksi kerrallaan pikselien värit. Tiedostossa voi olla toki muitakin tietoja, esim. kuvan koko.
Tämän menetelmän heikkoutena on, että tallennetut kuvat vievät paljon tilaa. Jos kuva on vaikka kauttaaltaan pikimusta, tiedostoon pitää tallentaa kuitenkin jokaisesta pikselistä tieto, että se on musta. Tämän vuoksi on kehitetty erilaisia (usein monimutkaisia) pakkaustapoja, joiden avulla kuvat saa mahtumaan pienempään tilaan.
Itse asiassa löytyy kyllä paljon suht yksinkertaisiakin pakkaustapoja. Esim. RLE on hyvin yksinkertainen. Myös muut perinteiset (Huffman, LZ*, jne) ovat melko yksinkertaisia. Nykyiset pakkausmenetelmät (JPG, Wavelet, yms.) alkavat sitten jo ollakin aika monimutkaisia.
Aihe on jo aika vanha, joten et voi enää vastata siihen.