Page 1 of 1

Sisennysongelma

Posted: Sun Feb 26, 2012 9:14 am
by VerkkoGuru
Nyt tuli piirto-ohjelman kanssa ongelmia, ilmeisesti en ole sisentänyt silmukkaa oikealla tavalla, joten neuvokaas minua vähäjärkistä. Silmukkaosa koodista on tässä:

Code: Select all

Repeat

         Text 0,0,"Näppäimet: K=kynä V=viiva L=laatikko E=ellipsi T=vaihda tilaa"

         If KeyHit(37) Then
         toiminto#=0
         
         If KeyHit(47) Then
         toiminto#=1
         
         If KeyHit(38) Then
         toiminto#=2
         
         If KeyHit(18) Then
         toiminto#=3
         
         If KeyHit(20) And tila#=0 Then
         tila#=1
         Else
         If tila#=1 Then
         tila#=0
         EndIf     
    
         If MouseDown(1) And toiminto#=0 Then Dot MouseWX(),MouseWY()
         If MouseDown(1) And toiminto#=1 Then Line MouseWX(),MouseWY()
         If MouseDown(1) And toiminto#=2 Then Box(MouseWX(),MouseWY(),tila#)
         If MouseDown(1) And toiminto#=3 Then Ellipse MouseWX(),MouseWY(),tila#

         Box 64,3,8,8,tila#

         DrawScreen 

Until EscapeKey()
p.s. Tämä olisi ehkä ollut omiaan Tyhmät-kysymykset osioon, mutta, menkööt. Ettehän hirtä, ettehän. :(

Re: Sisennysongelma

Posted: Sun Feb 26, 2012 10:13 am
by Awaclus

Code: Select all

Repeat

         Text 0,0,"Näppäimet: K=kynä V=viiva L=laatikko E=ellipsi T=vaihda tilaa"

         If KeyHit(37) Then toiminto#=0 'yksiriviset if-rakenteet voi kirjoittaa yhdelle riville. Jos ne kirjoittaa useammalle riville, loppuun pitäisi laittaa EndIf.
         If KeyHit(47) Then toiminto#=1
         If KeyHit(38) Then toiminto#=2
         If KeyHit(18) Then toiminto#=3
         
         If KeyHit(20) And tila#=0 Then
             tila#=1
         Else
             If tila#=1 Then tila#=0
         EndIf
    
         If MouseDown(1) And toiminto#=0 Then Dot MouseX(),MouseY() 'kun piirretään ruudulle eikä pelimaailmaan, käytetään yleensä funktioita MouseX() ja MouseY(), koska ne toimivat halutulla tavalla
         If MouseHit(1) And toiminto#=1 Then 'kun hiiren nappula painetaan alas, otetaan koordinaatit talteen
             wanhaX = MouseX()
             wanhaY = MouseY()
         EndIf
         If MouseUp (1) And toiminto# =1 Then Line wanhaX, wanhaY, MouseX(),MouseY() '...jotta sitten niitä voi hyödyntää kun hiiren painike vapautetaan
         If MouseDown(1) And toiminto#=2 Then Box MouseX(),MouseY(), 5, 5, Int(tila)
         If MouseDown(1) And toiminto#=3 Then Ellipse MouseX(),MouseY(),5, 5, Int(tila)

         Box 64,3,8,8,Int(tila) 'en näe tämän hyödyllisyyttä, mutta jätin sen siihen silti

         DrawScreen OFF 'jos CLS on päällä, viivat yms. vain välähtävät ruudulla ja häviävät sitten näkyvistä
Until EscapeKey()
Tuossa on silmukat korjattuna.

EDIT: ja tämä versio koodista jo toimiikin. Tein tuohon esimerkiksi tuon viivatoiminnon suunnilleen sillä tavalla kuin se toimiikin, saat sen perusteella itse päätellä, kuinka laatikko ja ellipsi toteutetaan. Huomioi se, että niissä ei anneta parametreiksi lopetuspistettä vaan leveys ja korkeus.

Re: Sisennysongelma

Posted: Sun Feb 26, 2012 10:18 am
by VerkkoGuru
Kiitoksia. Vaikka en kyl mielelläni ota vastaan korjattuja koodinpätkiä, sehän on sama ku oisin vaa kysyny: "moi, en osaa tätä, voitteko tehä tän mun puolest ja antaa koodin, ok, kiitos.". Tarvitsen vain neuvontaa, osaan toki käsilläni korjata koodin ohjeiden mukaan. ;)
EDIT:

Tuo koodi on muutenki virheellinen; Line-komennossa ei ole tarpeeksi parametrejä. Ja Box-komennossa on liikaa parametrejä, älä kysy miksi cb väittää näin.


Re: Sisennysongelma

Posted: Sun Feb 26, 2012 10:23 am
by Awaclus
VerkkoGuru wrote:Kiitoksia. Vaikka en kyl mielelläni ota vastaan korjattuja koodinpätkiä, sehän on sama ku oisin vaa kysyny: "moi, en osaa tätä, voitteko tehä tän mun puolest ja antaa koodin, ok, kiitos.". Tarvitsen vain neuvontaa, osaan toki käsilläni korjata koodin ohjeiden mukaan. ;)
Tuo on hyvä periaate, ja yleensä en koodia annakaan, mutta tällä kertaa oli huomattavan paljon helpompaa kirjoittaa koodia kuin neuvoa sanallisesti. Editoin edelliseen viestiin tuon toimivan koodin (jo ennen kuin huomasin uutta viestiäsi).

Ja sitä paitsi voithan ihan hyvin kirjoittaa tuon koodin, ei sitä ole pakko copypasteta. :D

Boxiin ei tosiaan kuulu laittaa sulkuja, tuossa alas tulevassa ohjeessa on virhe. Manuaalissa lukee oikein.

EDIT: kommentoin vähän tuota koodia, editoin taas edellistä viestiäni.

Re: Sisennysongelma

Posted: Sun Feb 26, 2012 10:54 am
by VerkkoGuru
Chaosworm wrote:
VerkkoGuru wrote:Kiitoksia. Vaikka en kyl mielelläni ota vastaan korjattuja koodinpätkiä, sehän on sama ku oisin vaa kysyny: "moi, en osaa tätä, voitteko tehä tän mun puolest ja antaa koodin, ok, kiitos.". Tarvitsen vain neuvontaa, osaan toki käsilläni korjata koodin ohjeiden mukaan. ;)
Tuo on hyvä periaate, ja yleensä en koodia annakaan, mutta tällä kertaa oli huomattavan paljon helpompaa kirjoittaa koodia kuin neuvoa sanallisesti. Editoin edelliseen viestiin tuon toimivan koodin (jo ennen kuin huomasin uutta viestiäsi).

Ja sitä paitsi voithan ihan hyvin kirjoittaa tuon koodin, ei sitä ole pakko copypasteta. :D

Boxiin ei tosiaan kuulu laittaa sulkuja, tuossa alas tulevassa ohjeessa on virhe. Manuaalissa lukee oikein.

EDIT: kommentoin vähän tuota koodia, editoin taas edellistä viestiäni.
Box-komento on tuolla alhaalla näyttämässä piirtäjälle, missä tilassa ohjelma piirtää ellipsit ja boxit...mutta ei näyttänyt toimivan /: Mutta nyt tekee semmosen tempun että piirrokset hohtavat, sehän ei ei ole tarkoitus? johtuisiko aivan ensimmäisellä rivillä olevassa SCREEN-komennosta? En tiedä ollenkaan, mutta kysäisin vain, tässä nyt varmuuden vuoksi koko roskan lähdekoodi:

Code: Select all

SCREEN 800,600,0,0

toiminto#=0
tila#=0

FrameLimit 45

DrawScreen OFF 

Repeat

         Text 0,0,"Näppäimet: K=kynä V=viiva L=laatikko E=ellipsi T=vaihda tilaa"

         If KeyHit(37) Then toiminto#=0 'yksiriviset if-rakenteet voi kirjoittaa yhdelle riville. Jos ne kirjoittaa useammalle riville, loppuun pitäisi laittaa EndIf.
         If KeyHit(47) Then toiminto#=1
         If KeyHit(38) Then toiminto#=2
         If KeyHit(18) Then toiminto#=3
         
         If KeyHit(20) And tila#=0 Then
             tila#=1
         Else
             If tila#=1 Then tila#=0
         EndIf
    
         If MouseDown(1) And toiminto#=0 Then Dot MouseX(),MouseY() 'kun piirretään ruudulle eikä pelimaailmaan, käytetään yleensä funktioita MouseX() ja MouseY(), koska ne toimivat halutulla tavalla
         If MouseHit(1) And toiminto#=1 Then 'kun hiiren nappula painetaan alas, otetaan koordinaatit talteen
             wanhaX = MouseX()
             wanhaY = MouseY()
         EndIf
         If MouseUp (1) And toiminto# =1 Then Line wanhaX, wanhaY, MouseX(),MouseY() '...jotta sitten niitä voi hyödyntää kun hiiren painike vapautetaan
         If MouseDown(1) And toiminto#=2 Then Box MouseX(),MouseY(), 5, 5, Int(tila)
         If MouseDown(1) And toiminto#=3 Then Ellipse MouseX(),MouseY(),5, 5, Int(tila)

         Box 64,16,8,8,Int(tila) 'en näe tämän hyödyllisyyttä, mutta jätin sen siihen silti

         DrawScreen OFF 'jos CLS on päällä, viivat yms. vain välähtävät ruudulla ja häviävät sitten näkyvistä
Until EscapeKey()

Re: Sisennysongelma

Posted: Sun Feb 26, 2012 12:17 pm
by Awaclus
Tuo johtuu enimmäkseen tuosta FrameLimitistä. Jos sen laittaa vaikka 80:n tai poistaa kokonaan, vilkkumista tapahtuu huomattavan paljon vähemmän. Myös fullscreenillä on vaikutusta, mutta silläkin vain siksi, että se laskee FPS:ää.

Re: Sisennysongelma

Posted: Sun Feb 26, 2012 12:33 pm
by VerkkoGuru
otin framelimitin ja fullscreenin pois, nyt ei välky ollenkaan. Ja kiitos, tästäkin opin paljon noist piirtokomennoista. Virheistä oppii. (:

Re: Sisennysongelma

Posted: Sun Feb 26, 2012 1:53 pm
by koodaaja
Välkkymisellähän ei ole framelimitin kanssa mitään tekemistä, fullscreenissä ollessa Drawscreen OFF pistää näytön välkkymään (mahdollisesti koska directx-device tekee edelleen doublebufferointia vaikka vain toiseen bufferiin piirretään?) joten kuvaan piirtäminen pitää toteuttaa, no, piirtämällä kuvaan eikä vain päivittämättä jäävälle näytölle. Koodia seuraa.

Code: Select all

SCREEN 800,600,0,0

toiminto#=0
tila#=0
kuva = MakeImage(800, 600)
Repeat
    Text 0,0,"Näppäimet: K=kynä V=viiva L=laatikko E=ellipsi T=vaihda tilaa"
    
    If KeyHit(37) Then toiminto#=0 'yksiriviset if-rakenteet voi kirjoittaa yhdelle riville. Jos ne kirjoittaa useammalle riville, loppuun pitäisi laittaa EndIf.
    If KeyHit(47) Then toiminto#=1
    If KeyHit(38) Then toiminto#=2
    If KeyHit(18) Then toiminto#=3
    
    If KeyHit(20) And tila#=0 Then
        tila#=1
    Else
        If tila#=1 Then tila#=0
    EndIf
    
    DrawToImage kuva
        
        If MouseDown(1) And toiminto#=0 Then Dot MouseX(),MouseY() 'kun piirretään ruudulle eikä pelimaailmaan, käytetään yleensä funktioita MouseX() ja MouseY(), koska ne toimivat halutulla tavalla
        If MouseHit(1) And toiminto#=1 Then 'kun hiiren nappula painetaan alas, otetaan koordinaatit talteen
            wanhaX = MouseX()
            wanhaY = MouseY()
        EndIf
        If MouseUp (1) And toiminto# =1 Then Line wanhaX, wanhaY, MouseX(),MouseY() '...jotta sitten niitä voi hyödyntää kun hiiren painike vapautetaan
        If MouseDown(1) And toiminto#=2 Then Box MouseX(),MouseY(), 5, 5, Int(tila)
        If MouseDown(1) And toiminto#=3 Then Ellipse MouseX(),MouseY(),5, 5, Int(tila)
        
    DrawToScreen
    
    DrawImage kuva, 0, 0
    
    Box 64,16,8,8,Int(tila) 'en näe tämän hyödyllisyyttä, mutta jätin sen siihen silti
    
    DrawScreen'jos CLS on päällä, viivat yms. vain välähtävät ruudulla ja häviävät sitten näkyvistä
Until EscapeKey()

Re: Sisennysongelma

Posted: Sun Feb 26, 2012 2:01 pm
by Awaclus
koodaaja wrote:Välkkymisellähän ei ole framelimitin kanssa mitään tekemistä
On sillä, ruutu välkkyy sitä enemmän mitä matalampi FPS. Olet tosin silti luultavasti enemmän oikeassa kuin minä, koska väittämäni ei perustunut tietoon vaan meitantei-skillzeihin.

Re: Sisennysongelma

Posted: Sun Feb 26, 2012 2:55 pm
by VerkkoGuru
No mä en nyt tarttee enää apuu ton korjaamiseen, koska saan nyt kuvan piirtymään näytölle ilman, että se välkkyy, en rupea sotkemaan tuota(ja aivojani) ylimääräisillä koodiriveillä.