Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: QB: *qb* Piirto-ohjelman virhe!

Sivun loppuun

gamehouse [07.05.2007 19:46:09]

#

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.

sooda [07.05.2007 19:54:52]

#

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

gamehouse [07.05.2007 20:16:55]

#

ILLEGAL FUNCTION CALL, valittaa QB ja osoittaa tekstiä:

IF nappi% = 1 THEN LOCATE x%, y%

??!! :-O

sooda [07.05.2007 20:19:34]

#

Nii-i, koordinaatit ei mahdu näytölle. Locate säätää tekstikursoria ja screen 12:ssa tais moista mahtua 80x30 tai 80x60.

gamehouse [07.05.2007 20:23:05]

#

SCREEN:in vaihto johonkin muuhun näyttötilaan ei auta. QB jäi jumiin, kun testasin... :-(

tgunner [07.05.2007 20:29:44]

#

Voi luoja. Kokeile normaalilla näyttötilallas ja klikkaa hiirellä aivan vasemmaista yläkulman kohtaa.

Grey [07.05.2007 20:30:32]

#

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-

tgunner [07.05.2007 20:34:58]

#

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.

gamehouse [07.05.2007 20:48:39]

#

Kiitos! Nyt ohjelmani toimii! (Saatan laittaa tänne ladattavaksi)

tgunner [07.05.2007 21:01:10]

#

Juu, ei tarvitse.

gamehouse [08.05.2007 07:45:55]

#

Miten voin tallentaa piirretyn kuvan?

moptim [08.05.2007 08:53:51]

#

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

E.K.Virtanen [08.05.2007 11:35:47]

#

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.

Antti Laaksonen [08.05.2007 17:19:00]

#

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.

Grez [08.05.2007 17:52:20]

#

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.


Sivun alkuun

Vastaus

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

Tietoa sivustosta