< Zurück

02.12.2012 22:50:00 • Categories: Monkey X, 2D Game SDK / Framework, Multiplatform • Tags: Monkey

Monkey: drawing a diffusion effect

'******************************************************************
'* Diffusion Example
'* Author: Richard R Betson
'* Date: 11/25/11
'* Language: Monkey
'* Target: HTML5              
'******************************************************************
' Linsence - Public Domain
'******************************************************************
' Web Site - <a href="http://redeyeware.uphero.com" target="_blank">http://redeyeware.uphero.com</a>
'******************************************************************
' Canvas Wrapper Mod by Impixi - <a href="http://www.monkeycoder.co.nz/Community/posts.php?topic=1885" target="_blank">http://www.monkeycoder.co.nz/Community/posts.php?topic=1885</a>
'******************************************************************

Import monkey Import mojo Import canvaswrapper

Global flag=0 Global clra:Int Global ang_index_1:Int[360],ang_index_2:Int[360],ang_index_3:Int[360],ang_index_4:Int[360]

Function Main()   New Diffusion End Function

Class Diffusion Extends App Field imd:ImageData

Global fps,fp,fps_t Global mapx:Int[77900] Global mapx1:Int[77900] Global mapx2:Int[77900] Global mapx3:Int[77900] Global mapx4:Int[77900]

Global clrr:Int[77900] Global clrb:Int[77900]

Global clrr1:Int[77900] Global clrb1:Int[77900]

Global ii Global fxsel_ttl Global fxsel

Global fred:Int=1,fblue:Int=2 Global qtext:String="Highest Quality",qt:Int=3,widetext:String=""

Global xa:Int=1,xb:Int=319,ya:Int=1,yb:Int=239

  Method OnCreate()     fxsel_ttl=Millisecs()+16000     SetUpdateRate(60)     SetLookUp()     imd = xCanvas.CreateImageData(640,480)'640,480) Local i2:Int   For i2=0 To 359     ang_index_1[i2]=(160 + (Sin(i2)40) )     ang_index_2[i2]=(120 + (Cos(i2)40) )     ang_index_3[i2]=(160 + (-Sin(i2)40) )     ang_index_4[i2]=(120 + (-Cos(i2)40) )   Next

  End Method

  Method OnUpdate()     If KeyHit(KEY_F1)     For Local y=0 To 240       'Local y1:Int=320 y       For Local x= 0 To 320         xCanvas.SetImageDataPixel(imd, x2,(y2), 0, 0, 0, 255)         xCanvas.SetImageDataPixel(imd, (x2)+1,(y2) ,0, 0, 0, 255)         xCanvas.SetImageDataPixel(imd, (x2),((y2)+1), 0, 0, 0, 255)         xCanvas.SetImageDataPixel(imd, ((x2)+1),((y*2)+1) ,0, 0, 0, 255)       Next     Next 'Cls          qt=qt+1       If qt>5 Then qt=0       If qt=0 Then qtext="Low Quality"       If qt=1 Then qtext="Med Quality"       If qt=2 Then qtext="Med-High Quality"       If qt=3 Then qtext="Highest Quality"       If qt=4 Then qtext="1/4 Screen H-Quality"        If qt=5 Then qtext="1/4 Screen x 4 H-Quality"     Endif

    If KeyHit(KEY_F2)       For Local y=0 To 240         'Local y1:Int=320 y         For Local x= 0 To 320           xCanvas.SetImageDataPixel(imd, x2,(y2), 0, 0, 0, 255)           xCanvas.SetImageDataPixel(imd, (x2)+1,(y2) ,0, 0, 0, 255)           xCanvas.SetImageDataPixel(imd, (x2),((y2)+1), 0, 0, 0, 255)           xCanvas.SetImageDataPixel(imd, ((x2)+1),((y*2)+1) ,0, 0, 0, 255)         Next       Next

      If widetext=""         ya=60         yb=180         widetext="WIDE -"       Else         ya=1         yb=239         widetext=""       Endif     Endif

    If fxsel_ttl<millisecs() fxsel="" fxsel_ttl="Millisecs()+14000" if="">4 Then fxsel=0       Select fxsel       Case 0         fred=1         fblue=2

      Case 1         fred=50         fblue=4       Case 2         fred=3         fblue=3       Case 3         fred=2         fblue=4       Case 4         fred=3         fblue=4     End Select

    Endif

  End Method

  Method OnRender()

    fps=fps+1     If fps_t<millisecs() fp="(fps)" fps_t="1000+Millisecs()" fps="0" endif="" ii="" if="">359 Then ii=0

    Local x2:Int=ang_index_1[ii]     Local y2:Int=ang_index_2[ii]     Local x3:Int=ang_index_3[ii]     Local y3:Int=ang_index_4[ii]

    'Draw Line     LineB(160,120,x2,y2)     LineB(160,120,x3,y3)

    For Local zz=0 To 100       Local xz=Int(Rnd(50))+135       Local yz=Int(Rnd(50))+95       clrb1[ ( 320 *yz ) +xz ]=255

    Next

    For Local y=ya To yb         Local y2:Int=(320 *y)       For Local x= xa To xb         Local y1:Int=y2+x         'Apply mapping via lookup table         If fxsel=0         clrr[  y1  ] = clrr1[ mapx[ y1 ] ]         clrb[  y1  ] = clrb1[ mapx[ y1 ] ]         Else If fxsel=1         clrr[  y1   ] = clrr1[ mapx1[ y1  ] ]         clrb[  y1   ] = clrb1[ mapx1[ y1  ] ]         Else If fxsel=2         clrr[  y1   ] = clrr1[ mapx2[ y1  ] ]         clrb[  y1   ] = clrb1[ mapx2[ y1  ] ]         Else If fxsel=3         clrr[  y1   ] = clrr1[ mapx3[ y1  ] ]         clrb[  y1   ] = clrb1[ mapx3[ y1  ] ]         Else If fxsel=4         clrr[  y1   ] = clrr1[ mapx4[ y1  ] ]         clrb[  y1   ] = clrb1[ mapx4[ y1  ] ]         Endif

      Next     Next

Local sumr,sumb,b,r

    For Local y=ya To yb       Local y1:Int=320 y       Local yn1:Int=y2       For Local x= xa To xb         Local yn2:Int=y1+x         'Blur Image and Fade Color

        r=clrr[yn2]         sumr = ((r*4) + clrr[ yn2+1   ] + clrr[ yn2-1   ] + clrr[ ( y1-1 ) + x   ] + clrr[ ( y1+1 ) + x   ] ) Shr 3 

        b=clrb[yn2]         sumb = ((b*4) + clrb[ yn2+1   ] + clrb[ yn2-1   ] + clrb[ ( y1-1 ) + x   ] + clrb[ ( y1+1 ) + x   ] ) Shr 3

        r=sumr-fred         b=sumb-fblue

        If r<0 then="" r="" if="">255 Then r=255         If b<0 then="" b="" if="">255 Then b=255

        clrr1[ yn2 ]=r         clrb1[ yn2 ]=b

        Local xn1:Int=x*2

        If qt=0             xCanvas.SetImageDataPixel(imd, xn1,yn1, r, 0, b, 255)                    Else If qt=1             xCanvas.SetImageDataPixel(imd, xn1,yn1, r, 0, b, 255)                      xCanvas.SetImageDataPixel(imd, xn1,yn1+1, r, 0, b, 255)           Else If qt=2             xCanvas.SetImageDataPixel(imd, xn1,yn1, r, 0, b, 255)             xCanvas.SetImageDataPixel(imd, xn1+1,yn1 ,r, 0, b, 255)             xCanvas.SetImageDataPixel(imd, xn1,yn1+1, r, 0, b, 255)                    Else If qt=3             xCanvas.SetImageDataPixel(imd, xn1,yn1, r, 0, b, 255)             xCanvas.SetImageDataPixel(imd, xn1+1,yn1 ,r, 0, b, 255)             xCanvas.SetImageDataPixel(imd, xn1,yn1+1, r, 0, b, 255)             xCanvas.SetImageDataPixel(imd, xn1+1,yn1+1 ,r, 0, b, 255)           Else If qt=4             xCanvas.SetImageDataPixel(imd, x,y, r, 0, b, 255)           Else If qt=5             xCanvas.SetImageDataPixel(imd, x,y, r, 0, b, 255)             xCanvas.SetImageDataPixel(imd, (x+319),y ,r, 0, b, 255)             xCanvas.SetImageDataPixel(imd, x,(y+239), r, 0, b, 255)             xCanvas.SetImageDataPixel(imd, (x+319),(y+239) ,r, 0, b, 255)           Endif

Next Next

    xCanvas.DrawImageData imd, 0, 0     DrawText("Hit F1/F2 Change Qualtity-Size/Wide Screen: "+widetext+" "+qtext,10,440)     DrawText("HTML5 Diffusion - Richard Betson, <a href="http://redeyeware.uphero.com" target="_blank">http://redeyeware.uphero.com&lt;/a&gt; - FPS:"+fp,10,460)

  End Method

  Function LineB(x1,y1,x2,y2)     'Ported     'Bresenham Line Algorithm     'Source - GameDev.Net - Mark Feldman     'Public Domain

    Local deltax = Abs(x2 - x1)     Local deltay = Abs(y2 - y1) 

    Local numpixels,d,dinc1,dinc2,xinc1,xinc2,yinc1,yinc2,x,y,i

    If deltax >= deltay       numpixels = deltax + 1       d = (2 deltay) - deltax       dinc1 = deltay Shl 1       dinc2 = (deltay - deltax) Shl 1       xinc1 = 1       xinc2 = 1       yinc1 = 0       yinc2 = 1     Else       numpixels = deltay + 1       d = (2 deltax) - deltay       dinc1 = deltax Shl 1       dinc2 = (deltax - deltay) Shl 1       xinc1 = 0       xinc2 = 1       yinc1 = 1       yinc2 = 1     Endif

    If x1 > x2       xinc1 = -xinc1       xinc2 = -xinc2     Endif

    If y1 > y2       yinc1 = -yinc1       yinc2 = -yinc2

    Endif

    x = x1     y = y1

    For i = 1 To numpixels

      If d < 0         d = d + dinc1         x = x + xinc1         y = y + yinc1       Else         d = d + dinc2         x = x + xinc2         y = y + yinc2       Endif

      'Draw line       If x>xa And x<xb and="" y="">ya And y<yb clrr1="" 320="" y="0" x="0" endif="" next="" end="" function="" method="" setlookup="" local="" ang="0" for="" lui="0" to="" 4="" 240="" rad="" abs="" y-120="" if="">0           rad= Sqrt(rad)         Else           rad=0         Endif         If rad=0 Then rad=1

        Local dx#=((x-160)/(rad))         Local dy#=((y-120)/(rad))         If lui=1           rad= ( ( (  ((Sin(rad.2)29.5) ) (  ((Cos(rad.81)*9.5) ) ) ) )   )

          dx=(dxCos(ang) - dySin(ang))           dy=(dyCos(ang) + dxSin(ang))

          Local x1=Int(dxrad)+(160)           Local y1=Int(dyrad)+(120)

          If y1<1 then="" y1="" if="">240 Then y1=240           If x1<1 then="" x1="" if="">320 Then x1=320

          mapx1[ ( 320 y ) +x ] = ( 320 y1 ) +x1'Int(x1)         Endif

        If lui=2           'Free Float           ang=1           rad= 1-( ( rad- (Sin(rad900)-Cos(rad900).5 )3.1415926 )   (-Cos((3.1415926) ) ).9  )           Local x1=Int(dxrad)+(160)           Local y1=Int(dyrad)+(120)           x1= ( x1Cos(ang) - y1Sin(ang) )           y1= ( x1Sin(ang) + y1*Cos(ang) )

          If y1<1 then="" y1="" if="">240 Then y1=240           If x1<1 then="" x1="" if="">320 Then x1=320

          mapx2[ ( 320 y ) +x ] = ( 320 y1 ) +x1         Endif

        If lui=3           rad= rad-(  (Sin(radPI)3)- ((Cos(radPI)3) )  )

          dx=(dxCos(ang) - dySin(ang))           dy=(dyCos(ang) + dxSin(ang))

          Local x1=Int(dxrad)+(160)           Local y1=Int(dyrad)+(120)

          If y1<1 then="" y1="" if="">240 Then y1=240           If x1<1 then="" x1="" if="">320 Then x1=320

          mapx3[ ( 320 y ) +x ] = ( 320 y1 ) +x1

        Endif         If lui=0           ang=-3

          Local yq:Int=y           If yq<=120           rad= rad-(  (Sin(yq))    )           rad= rad-(  (Cos(yq)) )           Else           rad= rad-(  (Sin((240-yq)) )    )           rad= rad-(  (Cos((240-yq)) )    )           Endif

          dx=(dxCos(ang) - dySin(ang))           dy=(dyCos(ang) + dxSin(ang))

          Local x1=Int(dxrad)+(160)           Local y1=Int(dyrad)+(120)

          If y1<1 then="" y1="" if="">240 Then y1=240           If x1<1 then="" x1="" if="">320 Then x1=320

          mapx[ ( 320 y ) +x ] = ( 320 y1 ) +x1

        Endif         If lui=39           'Orb           rad= 2-( ( rad- (Sin(rad)(Cos(rad)) )3.1415926 )   (-Cos((3.1415926) )).97  )           dx=(dxCos(ang) - dySin(ang))           dy=(dyCos(ang) + dxSin(ang))

          Local x1=Int(dxrad)+(160)           Local y1=Int(dyrad)+(120)

          If y1<1 then="" y1="" if="">240 Then y1=240           If x1<1 then="" x1="" if="">320 Then x1=320

          mapx3[ ( 320 y ) +x ] = ( 320 y1 ) +x1         Endif         If lui=4           'Swirl            ang=-3           rad= 1-( ( rad- (Sin(rad)-Cos(rad).9 )3.1415926 )   (-Cos((3.1415926) ) ).9  )           dx=(dxCos(ang) - dySin(ang))           dy=(dyCos(ang) + dx*Sin(ang))

          Local x1=Int(dxrad)+(160)           Local y1=Int(dyrad)+(120)

          If y1<1 then="" y1="" if="">240 Then y1=240           If x1<1 then="" x1="" if="">320 Then x1=320

          mapx4[ ( 320 y ) +x ] = ( 320 y1 ) +x1       Endif

      Next     Next   Next

  End Method

End Class


< Zurück | ^ nach oben