Yksinkertainen piirto-ohjelma QBasiciin.
Hiiriajurit otin toisesta täällä esiintyneestä koodivinkistä, mutta muuten olen tehnyt tämän täysin itse.
Ohjelman voi imuroida exenä osoitteesta www.geocities.com/samimaki/imuroi/qbkuva.zip
' Yksinkertainen piirto-ohjelma QBasiciin ' Koodi on toisinaan melko huonosti luettavaa, mutta pääosin se johtuu siitä, ' että muuten hiiri (ja etenkin sen alle piirtäminen) bugittaisi liikaa. ' Nyt se ei bugita muuten, kuin vilkkumalla piirrettäessä. ' Ohjelman on tehnyt Sami, käyttäen apuna valmiita hiiriajureita DECLARE SUB GetEdkuva () DECLARE SUB PiirraHiiri () DECLARE SUB tallenna () DECLARE FUNCTION AlustaHiiri! (napit%) DECLARE FUNCTION LueHiiri! () DECLARE SUB NaytaHiiri () DECLARE SUB RajaaHiiri (xp%, xs%, yp%, ys%) ON ERROR RESUME NEXT 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 DIM SHARED nappi AS INTEGER DIM SHARED onkohiirta AS INTEGER DIM SHARED x AS INTEGER DIM SHARED y AS INTEGER DIM SHARED vari AS INTEGER DIM SHARED edx AS INTEGER DIM SHARED edy AS INTEGER DIM SHARED edkuva(10, 16) AS INTEGER SCREEN 12 GetEdkuva edx = 320 edy = 240 a = AlustaHiiri(napit%) IF onkohiirta <> -1 THEN GOSUB virhe RajaaHiiri 0, 639, 0, 479 'rajataan hiiren alue näytön kokoiseksi FOR a = 0 TO 15 LINE (a * 40, 0)-((a + 1) * 40, 39), a, BF NEXT a vari = 15 LINE (0, 0)-(639, 5), vari, BF DO NaytaHiiri 'näytetään hiiri a = LueHiiri 'tutkitaan hiiren sijainti ja nappien tilat IF y <= 40 AND nappi = 1 THEN ' Jos nappia painetaan ja hiiri on värivalintojen päällä PUT (edx, edy), edkuva, PSET ' Hiiren nuoli peittoon vari = POINT(x, y) ' Piirtovärin vaihto LINE (0, 0)-(639, 5), vari, BF GetEdkuva PiirraHiiri edx = x edy = y END IF IF y > 40 AND nappi = 1 THEN ' Jos hiiri on piirtoalueella PUT (edx, edy), edkuva, PSET ' Hiiri peittoon LINE (INT(x / 10) * 10, INT(y / 10) * 10)-(INT(x / 10) * 10 + 9, INT(y / 10) * 10 + 9), vari, BF ' Piirretään piste (10*10 kokoinen) GetEdkuva PiirraHiiri ' Hiiren kuva takaisin näkyviin edx = x edy = y END IF IF nappi = 2 THEN ' Jos painetaan nappia 2, otetaan piirtoväriksi nuolen alla oleva väri PUT (edx, edy), edkuva, PSET ' Hiiren nuoli peittoon vari = POINT(x, y) ' Piirtovärin vaihto LINE (0, 0)-(639, 5), vari, BF GetEdkuva PiirraHiiri edx = x edy = y END IF SELECT CASE INKEY$ CASE "T", "t", "S", "s" ' Kaikki nämä tallentavat kuvan "kuva.bas":iin tallenna CASE CHR$(27) ' Lopettaa ILMAN VARMISTUSTA END END SELECT LOOP virhe: ' Jos hiirtä ei löydy PRINT "Hiirtä ei löytynyt!" END RESUME hiiri: ' Hiiren kuva, 99 on läpinäkyvää DATA 00,00,99,99,99,99,99,99,99,99 DATA 00,15,00,99,99,99,99,99,99,99 DATA 00,15,15,00,99,99,99,99,99,99 DATA 00,15,15,15,00,99,99,99,99,99 DATA 00,15,15,15,15,00,99,99,99,99 DATA 00,15,15,15,15,15,00,99,99,99 DATA 00,15,15,15,15,15,15,00,99,99 DATA 00,15,15,15,15,15,15,15,00,99 DATA 00,15,15,15,15,15,15,15,15,00 DATA 00,15,15,15,15,15,00,00,00,00 DATA 00,15,15,00,15,15,00,99,99,99 DATA 00,15,00,99,00,15,15,00,99,99 DATA 00,00,99,99,00,15,15,00,99,99 DATA 99,99,99,99,99,00,15,15,00,99 DATA 99,99,99,99,99,00,15,15,00,99 DATA 99,99,99,99,99,99,00,00,00,99 FUNCTION AlustaHiiri (napit%) i.ax = 0 CALL INTERRUPT(&H33, i, o) onkohiirta = o.ax napit% = o.bx END FUNCTION SUB GetEdkuva IF x <= 629 AND y <= 463 THEN GET (x, y)-(x + 9, y + 15), edkuva ELSEIF x > 629 AND y <= 463 THEN GET (x, y)-(639, y + 15), edkuva ELSEIF x <= 629 AND y > 463 THEN GET (x, y)-(x + 9, 479), edkuva ELSEIF x > 629 AND y > 463 THEN GET (x, y)-(639, 479), edkuva END IF END SUB FUNCTION LueHiiri i.ax = 3 CALL INTERRUPT(&H33, i, o) nappi = o.bx x = o.cx y = o.dx END FUNCTION SUB NaytaHiiri IF edx <> x OR edy <> y THEN ' Estää vilkkumista PUT (edx, edy), edkuva, PSET GetEdkuva PiirraHiiri ' Hiiren kuva takaisin näkyviin edx = x edy = y END IF END SUB SUB PiirraHiiri RESTORE hiiri FOR b = 0 TO 15 FOR a = 0 TO 9 READ piste IF piste <> 99 THEN PSET (x + a, y + b), piste NEXT NEXT END SUB SUB RajaaHiiri (xp%, xs%, yp%, ys%) i.ax = 7 i.cx = xp% i.dx = xs% CALL INTERRUPT(&H33, i, o) i.ax = 8 i.cx = yp% i.dx = ys% CALL INTERRUPT(&H33, i, o) END SUB SUB tallenna PUT (edx, edy), edkuva, PSET ' Peitetään nuoli, ettei se vaikuttaisi tallennuksessa OPEN "kuva.bas" FOR OUTPUT AS #1 PRINT #1, "SCREEN 12" ' Kirjoitetaan tiedostoon valmiiksi koodi, jolla kuvaa voi katsoa PRINT #1, "FOR y = 0 TO 43" PRINT #1, " FOR x = 0 TO 63" PRINT #1, " READ piste" PRINT #1, " PSET (x,y), piste" PRINT #1, " NEXT x" PRINT #1, "NEXT y" PRINT #1, "" FOR b = 40 TO 479 STEP 10 ' Ohjelmassa on 10*10 ruutuja, joten pitää käyttää STEP 10 PRINT #1, "DATA "; FOR a = 0 TO 639 STEP 10 IF POINT(a, b) < 10 THEN PRINT #1, "0"; ' Jos tallennettavan pisteen väri on alle 10, siihen eteen lisätään 0, jotta joka rivistä tulisi yhtä pitkiä PRINT #1, LTRIM$(STR$(POINT(a, b))); ' Itse pisteen värin kirjoittaminen IF a < 630 THEN ' Viimeiseksi merkiksi ei laiteta pilkkua PRINT #1, ","; ELSE PRINT #1, "" END IF NEXT a NEXT b CLOSE #1 GET (x, y)-(x + 9, y + 15), edkuva RESTORE hiiri ' Sitten palautetaan hiiren kuva takaisin FOR b = 0 TO 15 FOR a = 0 TO 9 READ piste IF piste <> 99 THEN PSET (x + a, y + b), piste NEXT NEXT edx = x edy = y END SUB
kannattaako tänne nyt kokonaista ohjelmaa pastettaa?
Tuo hiiriosuus vaikuttaa tuossa kiintoisalta. Varsinkin se että esim. osoittimen saa itse määritettyä. Joskin, en saanut sitä itse kunnolla toimimaan. Tuli tuhat ja yksi virheilmoitusta, kun koetin saada laitettua sen omaan projektiini sellaisena kuin olisin sen halunnut :-P
-Grey-
Grey --> Kai muistit käynnistää sen /L parametrilla?
Ja siinä on aika monta osaa, mitkä vaikuttavat hiiren toimintaan.
snakari --> Miksi ei? Tämähän on vielä suhteellisen pieni ohjelma, en minä(kään) alkaisi tänne mitään kymmentä kilotavua suurempaa täysin valmista ohjelmaa lähettelemään. (jos tekisin sen, se tapahtuisi luultavasti omilla sivuillani)
Kyllä minä /L - parametrin tunnen. En minä niin höhlä sentään ole ^__^
-Grey-
Grey --> Mistä sitä koskaan tietää... ;)
Otin siitä pois itse piirto ohjelman, mutta jätin hiiriajurit. Esimerkiksi tein hiiren keskustasta läpinäkyvän.
DECLARE SUB GetEdkuva () DECLARE SUB PiirraHiiri () DECLARE FUNCTION AlustaHiiri! (napit%) DECLARE FUNCTION LueHiiri! () DECLARE SUB NaytaHiiri () DECLARE SUB RajaaHiiri (xp%, xs%, yp%, ys%) ON ERROR RESUME NEXT 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 DIM SHARED nappi AS INTEGER DIM SHARED onkohiirta AS INTEGER DIM SHARED x AS INTEGER DIM SHARED y AS INTEGER DIM SHARED vari AS INTEGER DIM SHARED edx AS INTEGER DIM SHARED edy AS INTEGER DIM SHARED edkuva(10, 16) AS INTEGER SCREEN 12 RANDOMIZE TIMER FOR a = 1 TO 20 ' Piirretään jotain epämääräisiä laatikoita taustalle LINE (RND * 640, RND * 480)-(RND * 640, RND * 480), RND * 16, BF NEXT a edx = 320 edy = 240 a = AlustaHiiri(napit%) IF onkohiirta <> -1 THEN GOSUB virhe RajaaHiiri 0, 639, 0, 479 'rajataan hiiren alue näytön kokoiseksi DO NaytaHiiri 'näytetään hiiri a = LueHiiri 'tutkitaan hiiren sijainti ja nappien tilat LOCATE 1, 1 LOOP WHILE INKEY$ = "" END virhe: ' Jos hiirtä ei löydy PRINT "Hiirtä ei löytynyt!" END RESUME hiiri: ' Hiiren kuva, 99 on läpinäkyvää DATA 00,00,99,99,99,99,99,99,99,99 DATA 00,15,00,99,99,99,99,99,99,99 DATA 00,15,15,00,99,99,99,99,99,99 DATA 00,15,99,15,00,99,99,99,99,99 DATA 00,15,99,99,15,00,99,99,99,99 DATA 00,15,99,99,99,15,00,99,99,99 DATA 00,15,99,99,99,99,15,00,99,99 DATA 00,15,99,99,99,99,99,15,00,99 DATA 00,15,99,99,99,15,15,15,15,00 DATA 00,15,99,15,15,15,00,00,00,00 DATA 00,15,15,00,15,15,00,99,99,99 DATA 00,15,00,99,00,15,15,00,99,99 DATA 00,00,99,99,00,15,15,00,99,99 DATA 99,99,99,99,99,00,15,15,00,99 DATA 99,99,99,99,99,00,15,15,00,99 DATA 99,99,99,99,99,99,00,00,00,99 FUNCTION AlustaHiiri (napit%) i.ax = 0 CALL INTERRUPT(&H33, i, o) onkohiirta = o.ax napit% = o.bx END FUNCTION SUB GetEdkuva IF x <= 629 AND y <= 463 THEN GET (x, y)-(x + 9, y + 15), edkuva ELSEIF x > 629 AND y <= 463 THEN GET (x, y)-(639, y + 15), edkuva ELSEIF x <= 629 AND y > 463 THEN GET (x, y)-(x + 9, 479), edkuva ELSEIF x > 629 AND y > 463 THEN GET (x, y)-(639, 479), edkuva END IF END SUB FUNCTION LueHiiri i.ax = 3 CALL INTERRUPT(&H33, i, o) nappi = o.bx x = o.cx y = o.dx END FUNCTION SUB NaytaHiiri IF edx <> x OR edy <> y THEN ' Estää vilkkumista PUT (edx, edy), edkuva, PSET GetEdkuva PiirraHiiri ' Hiiren kuva takaisin näkyviin edx = x edy = y END IF END SUB SUB PiirraHiiri RESTORE hiiri FOR b = 0 TO 15 FOR a = 0 TO 9 READ piste IF piste <> 99 THEN PSET (x + a, y + b), piste NEXT NEXT END SUB SUB RajaaHiiri (xp%, xs%, yp%, ys%) i.ax = 7 i.cx = xp% i.dx = xs% CALL INTERRUPT(&H33, i, o) i.ax = 8 i.cx = yp% i.dx = ys% CALL INTERRUPT(&H33, i, o) END SUB
toimiva ja hyvä
Tostahan vois tehä oikein hienon...
Mielenkiintoista, itsekin olen tehnyt joskus aikaisemmin samanlaisen, eikä siinäkään piirtäminen onnistunut muuten kuin pistämällä hiiren kursori vilkkumaan.
Ilmeisesti kaksoispuskuria tms. käyttämällä moisesta ongelmasta pääsisi eroon, mutta kun edelleen niiden DIM-taulukoiden koko on rajoitettu :(.
Ihan hyvä muuten, mutta käytännössä tuolla ei oikein mitään tee :)
ohops, onhan tuossa sittenkin tallennus ja avaus mahdollisuudet, my fault. :)
Tallennusmahdollisuus siinä on ollut alusta alkaen, mutta latausta en ainakaan vielä ole tehnyt siihen...
Aihe on jo aika vanha, joten et voi enää vastata siihen.