Nopeaa pixelin käsittelyä???

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
cheeshelmet.jr
Member
Posts: 75
Joined: Tue Aug 28, 2007 6:59 am

Nopeaa pixelin käsittelyä???

Post by cheeshelmet.jr » Tue May 06, 2008 8:17 pm

Niin eli olen tekemässä gta tyylistä kartta mutta törmäsin ongelmaan joka häiritsee kun teen kartan niin fps tippuu 5-10 miten saan nopeammaksi??
Itse koodi:

Code: Select all

Type IMAGEMAP
    Field x
    Field y
    Field r
    Field g
    Field b
EndType 
asd=LoadImage("media\map.bmp")
Lock Image(asd)
    For x=1 To ImageWidth(asd)
        For y=1 To ImageHeight(asd)
            PickImageColor2 asd,x,y
            Newa.IMAGEMAP=New(IMAGEMAP)
            Newa\x=x
            Newa\y=y
            Newa\r=getRGB(RED)
            Newa\g=getRGB(GREEN)
            Newa\b=getRGB(BLUE )
        Next y
    Next x
Unlock Image(asd)
Repeat 
    SetWindow ""+FPS()
    x=MouseX()
    y=MouseY()
    For iMap.IMAGEMAP=Each IMAGEMAP
        If Distance(x,y,iMap\x,iMap\y)<50 Then 
            Color iMap\r, iMap\g, iMap\b
            Dot iMap\x,iMap\y
        EndIf 
    Next iMap 
    DrawScreen 
Forever 

User avatar
Harakka
Advanced Member
Posts: 430
Joined: Mon Aug 27, 2007 9:08 pm
Location: Salo
Contact:

Re: Nopeaa pixelin käsittelyä???

Post by Harakka » Tue May 06, 2008 8:49 pm

Getpixel2() ja PutPixel2 ovat ainakin nopeampia.

Code: Select all

Type IMAGEMAP
    Field x
    Field y
    Field pix
EndType 
asd=LoadImage("media\map.bmp")
Lock Image(asd)
    For x=1 To ImageWidth(asd)-1
        For y=1 To ImageHeight(asd)-1
            PickImageColor2 asd,x,y
            Newa.IMAGEMAP=New(IMAGEMAP)
            Newa\x=x
            Newa\y=y
            Newa\pix = GetPixel2(x, y, Image(asd))
        Next y
    Next x
Unlock Image(asd)
Repeat 
    SetWindow ""+FPS()
    x=MouseX()
    y=MouseY()
    Lock SCREEN()
        'seuraava rivi, JOS käytetään suoraan kuvasta lukua
        'Lock Image(asd)
            For iMap.IMAGEMAP=Each IMAGEMAP
                If Distance(x,y,iMap\x,iMap\y)<50 Then 
                    PutPixel2 imap\x,imap\y,iMap\pix
                    'Seuraava rivi lukee värit suoraan kuvasta (vaihtoehto)
                    'PutPixel2 imap\x,imap\y,GetPixel2(imap\x,imap\y,Image(asd))
                EndIf 
            Next iMap 
        'seuraava rivi, jos kuvasta luku
        'Unlock Image(asd)
    Unlock SCREEN()
    DrawScreen 
Forever
Peli piirtokomennoilla - voittaja, Virtuaalilemmikkipeli - voittaja,
Sukellusvenepeli - voittaja, Paras tileset - voittaja
Vaihtuva päähenkilö - voittaja, Autopeli - voittaja sekä
Hiirellä ohjattava peli - voittaja B)

cheeshelmet.jr
Member
Posts: 75
Joined: Tue Aug 28, 2007 6:59 am

Re: Nopeaa pixelin käsittelyä???

Post by cheeshelmet.jr » Tue May 06, 2008 10:06 pm

No ei tuo ollut sen nopeampaa..
Olisiko sitten mahdollista jotenkin piirtää jostain kuvasta ympyrän muotoista aluetta reaaliajassa haluttuun kordinaatteihin??

User avatar
Aavesoturi
Active Member
Posts: 163
Joined: Fri Aug 31, 2007 7:07 pm
Location: Helsinki
Contact:

Re: Nopeaa pixelin käsittelyä???

Post by Aavesoturi » Tue May 06, 2008 10:19 pm

Ainakin huomattavasti nopeampaa on seuraava:
* Luo kaksi uutta kuvaa makeimagella - saman kokoisia ja toiseen piirrät keskelle ympyrän (vaikka valkoisella) ja maskaa se kuva sillä värillä (siitä tulee meille ympyrä maski)
* Piirrä siihen toiseen (jossa ei ole ympyrää) ympyrän kokoinen neliö haluamistasi koordinaateista siitä Isosta kuvasta (kuvalähteestä) DrawImageBoxilla
* Sitten piirrät samaan kuvaan vielä sen ympyrän sisältävän kuvan, jolloin neliön muoto katoaa (koska siitä ympyräkuvasta oli maskattu se itse ympyrä pois)
* Piirrä tuo komposiitti näytölle haluamiisi koordinaatteihin

EDIT: Teinpä vielä esimerkki koodinkin, fps 61 (maksimi minulla)

Code: Select all

// ympyrän halkaisija 
Const diameter = 200

// Ladataan lähdekuva
source = LoadImage("media\map.bmp")

// Tehdään maski
mask = MakeImage(diameter,diameter)
    DrawToImage mask
        Color cbMagenta
        Circle 0, 0, diameter, True
    DrawToScreen
    MaskImage mask, cbMagenta
// Tehdään kuva mihin pala piirretään
circ = MakeImage(diameter,diameter)


// Pääluuppi
Repeat
    SetWindow ""+FPS()
    x = MouseX()
    y = MouseY()

    DrawToImage circ
        // piirretään neliö alue
       DrawImageBox source, 0,0, x - diameter/2,y - diameter/2, diameter,diameter
        // laitetaan maski päälle, ni syntyy ympyrä
       DrawImage mask, 0,0
    DrawToScreen

    DrawImage circ, x - diameter/2,y - diameter/2

    DrawScreen
Forever
EDIT2: Niin ei kai tuossa ole edes pakko piirtää tuohon circ-kuvaan voisi sen tehdä suoraan ruudullekin, mutta mielestäni tämä on elegantimpi näin

cheeshelmet.jr
Member
Posts: 75
Joined: Tue Aug 28, 2007 6:59 am

Re: Nopeaa pixelin käsittelyä???

Post by cheeshelmet.jr » Wed May 07, 2008 6:52 am

Kiitos juri tämmöistä hain :)

Post Reply