Page 1 of 1

Dancing Snow - The best real Snow Simulation (i think :-)))

Posted: Thu Dec 19, 2013 9:19 pm
by walbus
Code removed !
For the newest code looking please further up on postng "Snow - Simple but fine"

Re: Dancing Snow - The best Simulation (i think :-)))

Posted: Thu Dec 19, 2013 10:22 pm
by J. Baker
I like it! Here's an example of filling the screen with snow at startup...

Code: Select all

#WinWidth = 1280
#WinHeight = 720
#MaxFlakes = 200

Structure SnowCalculations
  SnowX.d
  SnowY.d
  SnowS.d
EndStructure

Procedure SnowFlakes(SnowSprite)

  Static Dim Snow.SnowCalculations(#MaxFlakes)
  Static SnowCount = 0
 
  If SnowCount < #MaxFlakes ;fill the screen with snow at startup
    Snow(SnowSprite)\SnowX = Random(#WinWidth)
    Snow(SnowSprite)\SnowY = Random(#WinHeight)
    Snow(SnowSprite)\SnowS = Random(10, 2) ;snow size
    SnowCount + 1
  EndIf
 
  If Snow(SnowSprite)\SnowY > #WinHeight + 32 ;if the snow reaches the bottom of the screen, send back to the top
    Snow(SnowSprite)\SnowY = -32
    Snow(SnowSprite)\SnowX = Random(#WinWidth)
    Snow(SnowSprite)\SnowS = Random(10, 2) ;snow size
  Else
     ZoomSprite(SnowSprite, Snow(SnowSprite)\SnowS, Snow(SnowSprite)\SnowS)
     DisplayTransparentSprite(SnowSprite, Snow(SnowSprite)\SnowX, Snow(SnowSprite)\SnowY, Random(255, 64)) ;random transparency for twinle effect
     RotateSprite(SnowSprite, 0.2 * Snow(SnowSprite)\SnowS, #PB_Relative)
  EndIf
  
  If SnowSprite < #MaxFlakes / 2 ;half of the snow sprites fall at one angle and the other half the opposite angle
    Snow(SnowSprite)\SnowX - 0.2
    Snow(SnowSprite)\SnowY + Snow(SnowSprite)\SnowS / 2
   Else
     Snow(SnowSprite)\SnowX + 0.2
     Snow(SnowSprite)\SnowY + Snow(SnowSprite)\SnowS / 1.5
  EndIf
   
EndProcedure

UsePNGImageDecoder()
InitSprite()

OpenWindow(0, 0, 0,#WinWidth, #WinHeight, "Snow", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
OpenWindowedScreen(WindowID(0), 0, 0, #WinWidth, #WinHeight, 1, 0, 0, 1)

;EnableFullScreenButton(WindowID(0)) ;OS X only using wilberts lib

For Snow = 1 To #MaxFlakes
  CatchSprite(Snow, ?flake_png_start, #PB_Sprite_AlphaBlending)
Next Snow

Quit = #False

Repeat
 
  Repeat
    Event = WindowEvent()
    If Event = #PB_Event_CloseWindow
      Quit = #True
    EndIf
  Until Event = 0
 
  FlipBuffers()
  ClearScreen(RGB(0, 0, 64))
 
  For Snow = 1 To #MaxFlakes
    SnowFlakes(Snow)
  Next Snow
 
Until Quit
 
DataSection

  flake_png_start:
    ; size : 1244 bytes
    Data.q $0A1A0A0D474E5089,$524448490D000000,$2000000020000000,$7A7A730000000608,$47527301000000F4
    Data.q $0000E91CCEAE0042,$FF0044474B620600,$93A7BDA0FF00FF00,$7359487009000000,$130B0000130B0000
    Data.q $000000189C9A0001,$0ADA07454D497407,$5EC42DDA3B31121B,$544144495C040000,$55946C4B97BDC358
    Data.q $A74ED37EE77FC714,$4829680B16876DF6,$0BA07C42C7C4C134,$2B95C2E267612A35,$85C63136B8905D13
    Data.q $00B9DC2E31B1D91B,$1B80D06E00988656,$CC80A89D50242621,$DF5E600FA614B438,$63E96334D4F0BBFD
    Data.q $3DEE6E772F937A6A,$1DCFFCE73FF39EE7,$E923DD5AB5587F68,$424A3B59247B4923,$18766CD90A4BB7BB
    Data.q $00D857576E180C78,$F98C02D808781102,$69DDCB97280CF37A,$536E40E3E5F84E9A,$6492481D1D1D180D
    Data.q $57FF0602EC09D802,$FB9292B292252403,$AFB0FD0EF202E91C,$7AC9A3D1E8E7ABEF,$4971A48769272C93
    Data.q $A482E924BE9465B9,$EB1AB7F692F3A4BA,$38B1D56CED25C63A,$E606EC0031D8AB32,$797B2599B3379D25
    Data.q $F972DF39F0E80860,$BAEBF02F40D3C083,$1FA01980F7666043,$59492ED25F780778,$92B39D2FCB9013A0
    Data.q $7EB9703E02ED24BA,$5666021F5BEB96E0,$64F21C0838117494,$5DC0603F7E33C6FB,$26F002E227BAFE3F
    Data.q $C56668B81EF80070,$2DE0305C86B1DEFB,$CF61C5F8026013E0,$1749F98715033F02,$C7E9A69EFC657869
    Data.q $C601B133331C9249,$4933E92832A54AB3,$49DF495549529233,$3A48AF4916D24D7A,$753E92D3FBE6A925
    Data.q $66F84AACCC9D15B9,$9D63D3406A04EA48,$9179E9B811CA6FF1,$BFDFDFDF303AFDF1,$CE31EB7572CCFEAA
    Data.q $01E807BD7AF57D01,$1A606E812603729E,$73D57D7DDB62EED8,$67A69A5CF8C62862,$2A8166079A498D25
    Data.q $D4941D7FD2CCCF70,$0EDBFCDB07B9F40D,$377B54E23E318B6C,$397B94EA93D5B084,$09F8137424E33C04
    Data.q $8C7CF006F115E5B8,$5702284217202FF1,$5A81173E9FC0EB80,$249367D34D217806,$BA0118146D9DEAD9
    Data.q $44210CEC63160842,$ABDA27A4E049C92F,$38027002E6475EC0,$842078C623BA09ED,$E8DC278018C633B0
    Data.q $432718C72803702A,$249ABB56AD4CA508,$5B8B74AE6A37CE49,$8C63E60018421C3C,$DEA74DC7B9F4210A
    Data.q $87BC8AAF1DE17E3B,$CCBACC0A421081F5,$431400B8C633703C,$66CD9B9708425708,$450F0EC72F0524D9
    Data.q $C718C77607901B8F,$A4C48ECBD999CD24,$47218E2CA8E1BD9F,$6CE338A1EA3C01AE,$9D5AB574C00A045A
    Data.q $ECFCE6005AEAEAEA,$A48F52428DCECB7F,$92C3A4BCB9B9B9FE,$4B2A486A48AA4BAE,$9A486EBE6373F31A
    Data.q $A488D24474925495,$B2D6988F8B3D4901,$EFFA2CCC9D94CB0C,$5015EDEDED9B3305,$643D97CC39F638F2
    Data.q $4A4E33AFBACD9B34,$5B33156664065009,$646B329495B17D70,$BA1CF7CF9F6011C2,$1CF21CDFA4B6F02C
    Data.q $9798CCE833C3DB70,$E88E23742621BD34,$B7A4E92D7D25119F,$263FE1DD5EB3AAE1,$4973E920BB3F4BE9
    Data.q $78F7172ADD122B23,$E7380AFAD1CF7963,$81F79170F80FB015,$EF022F82CE0FC0C3,$8618BB7C017CB57A
    Data.q $CF61E00EA4B15335,$017F59C08FC0D3E2,$CF3E24A57B8F0075,$C8DC3FC4670D21BB,$D6359982A4876001
    Data.q $84E035E9EE720BD3,$725D24D5EC969599,$F25B56664BE7CD6F,$B892BCE0A9233E62,$A14285241F9AC6AE
    Data.q $74717CB96B9C5EE6,$A8AD6E8B49666B7A,$B6F50A142C572392,$7B8E92DD7B0AF15A,$613D6EB29EF71DC2
    Data.q $8C6364F952BC5695,$69E8EDB39F698157,$84254CCCCCC17FFB,$BB33250842FA0250,$935D257B490F66CD
    Data.q $743683611D5DB7B4,$E144CDC04B96C700,$37FF2BB594D4D4D0,$8A413BB5248ACC71,$444E454900000000
    Data.b $AE,$42,$60,$82
  flake_png_end:
EndDataSection

Re: Dancing Snow - The best Simulation (i think :-)))

Posted: Thu Dec 19, 2013 10:35 pm
by davido
Two very nice examples. :D
Just in time for Christmas!

Merry Christmas!

Re: Dancing Snow - The best Simulation (i think :-)))

Posted: Fri Dec 20, 2013 3:36 am
by walbus
Added: Option for filling Screen at Startup

Merry Christmas

Best Regards from Germany
Werner

Re: Dancing Snow - The best Simulation (i think :-)))

Posted: Fri Dec 20, 2013 4:12 am
by J. Baker
walbus wrote:Added: Option for filling Screen at Startup

Merry Christmas

Best Regards from Germany
Werner
Looks good! Merry Christmas! :D

Re: Dancing Snow - The best Simulation (i think :-)))

Posted: Fri Dec 20, 2013 8:10 am
by BasicallyPure
The wind blows mainly to the right.

Code: Select all

#WinWidth = 1280
#WinHeight = 720
#MaxFlakes = 250

Structure SnowCalculations
  SnowX.d
  SnowY.d
  SnowS.i ; flake size
  SnowV.d ; Y velocity
EndStructure

Global Dim Snow.SnowCalculations(#MaxFlakes)

Procedure SnowFlakes()
   
   Static SnowSprite.i, wind.d, windScale.d, bias.i = 31
   
   windScale + Random(64) - bias
   If windScale > 2000 : bias = 33 : EndIf
   If windScale < -400 : bias = 31 : EndIf
   wind = windScale / 4000
   
   For SnowSprite = 1 To #MaxFlakes
      With Snow(SnowSprite)
         
         DisplayTransparentSprite(SnowSprite, \SnowX, \SnowY, Random(255, 64)) ;random transparency for twinle effect
         RotateSprite(SnowSprite, 0.2 * \SnowS, #PB_Relative)
         
         \SnowX + wind *\SnowS
         \SnowY + \SnowV
         
         If \SnowX > #WinWidth : \SnowX = 0 : EndIf
         If \SnowX < 0 : \SnowX = #WinWidth : EndIf
         
         If \SnowY > #WinHeight ; if the snow reaches the bottom of the screen, send back to the top
            \SnowY = 0
            \SnowX = Random(#WinWidth)
            \SnowS = Random(14, 2) ;snow size
            \SnowV = \SnowS / 6 
            ZoomSprite(SnowSprite, \SnowS, \SnowS)
         EndIf
         
      EndWith
   Next SnowSprite
EndProcedure

UsePNGImageDecoder()
InitSprite()

OpenWindow(0, 0, 0,#WinWidth, #WinHeight, "Snow", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
OpenWindowedScreen(WindowID(0), 0, 0, #WinWidth, #WinHeight, 1, 0, 0, 1)

;EnableFullScreenButton(WindowID(0)) ;OS X only using wilberts lib

For Snow = 1 To #MaxFlakes
  CatchSprite(Snow, ?flake_png_start, #PB_Sprite_AlphaBlending)
Next Snow

For SnowSprite = 1 To #MaxFlakes
   ;fill the screen with snow at startup
   With Snow(SnowSprite)
      \SnowX = Random(#WinWidth)
      \SnowY = Random(#WinHeight)
      \SnowS = Random(14, 2) ;snow size
      ZoomSprite(SnowSprite, \SnowS, \SnowS)
      \SnowV = \SnowS / 6 ; velocity proportional to size
   EndWith
Next SnowSprite

Quit = #False

Repeat
 
  Repeat
    Event = WindowEvent()
    If Event = #PB_Event_CloseWindow
      Quit = #True
    EndIf
  Until Event = 0
 
  FlipBuffers()
  ClearScreen(RGB(0, 0, 64))
 
  SnowFlakes()
 
Until Quit
 
DataSection

  flake_png_start:
    ; size : 1244 bytes
    Data.q $0A1A0A0D474E5089,$524448490D000000,$2000000020000000,$7A7A730000000608,$47527301000000F4
    Data.q $0000E91CCEAE0042,$FF0044474B620600,$93A7BDA0FF00FF00,$7359487009000000,$130B0000130B0000
    Data.q $000000189C9A0001,$0ADA07454D497407,$5EC42DDA3B31121B,$544144495C040000,$55946C4B97BDC358
    Data.q $A74ED37EE77FC714,$4829680B16876DF6,$0BA07C42C7C4C134,$2B95C2E267612A35,$85C63136B8905D13
    Data.q $00B9DC2E31B1D91B,$1B80D06E00988656,$CC80A89D50242621,$DF5E600FA614B438,$63E96334D4F0BBFD
    Data.q $3DEE6E772F937A6A,$1DCFFCE73FF39EE7,$E923DD5AB5587F68,$424A3B59247B4923,$18766CD90A4BB7BB
    Data.q $00D857576E180C78,$F98C02D808781102,$69DDCB97280CF37A,$536E40E3E5F84E9A,$6492481D1D1D180D
    Data.q $57FF0602EC09D802,$FB9292B292252403,$AFB0FD0EF202E91C,$7AC9A3D1E8E7ABEF,$4971A48769272C93
    Data.q $A482E924BE9465B9,$EB1AB7F692F3A4BA,$38B1D56CED25C63A,$E606EC0031D8AB32,$797B2599B3379D25
    Data.q $F972DF39F0E80860,$BAEBF02F40D3C083,$1FA01980F7666043,$59492ED25F780778,$92B39D2FCB9013A0
    Data.q $7EB9703E02ED24BA,$5666021F5BEB96E0,$64F21C0838117494,$5DC0603F7E33C6FB,$26F002E227BAFE3F
    Data.q $C56668B81EF80070,$2DE0305C86B1DEFB,$CF61C5F8026013E0,$1749F98715033F02,$C7E9A69EFC657869
    Data.q $C601B133331C9249,$4933E92832A54AB3,$49DF495549529233,$3A48AF4916D24D7A,$753E92D3FBE6A925
    Data.q $66F84AACCC9D15B9,$9D63D3406A04EA48,$9179E9B811CA6FF1,$BFDFDFDF303AFDF1,$CE31EB7572CCFEAA
    Data.q $01E807BD7AF57D01,$1A606E812603729E,$73D57D7DDB62EED8,$67A69A5CF8C62862,$2A8166079A498D25
    Data.q $D4941D7FD2CCCF70,$0EDBFCDB07B9F40D,$377B54E23E318B6C,$397B94EA93D5B084,$09F8137424E33C04
    Data.q $8C7CF006F115E5B8,$5702284217202FF1,$5A81173E9FC0EB80,$249367D34D217806,$BA0118146D9DEAD9
    Data.q $44210CEC63160842,$ABDA27A4E049C92F,$38027002E6475EC0,$842078C623BA09ED,$E8DC278018C633B0
    Data.q $432718C72803702A,$249ABB56AD4CA508,$5B8B74AE6A37CE49,$8C63E60018421C3C,$DEA74DC7B9F4210A
    Data.q $87BC8AAF1DE17E3B,$CCBACC0A421081F5,$431400B8C633703C,$66CD9B9708425708,$450F0EC72F0524D9
    Data.q $C718C77607901B8F,$A4C48ECBD999CD24,$47218E2CA8E1BD9F,$6CE338A1EA3C01AE,$9D5AB574C00A045A
    Data.q $ECFCE6005AEAEAEA,$A48F52428DCECB7F,$92C3A4BCB9B9B9FE,$4B2A486A48AA4BAE,$9A486EBE6373F31A
    Data.q $A488D24474925495,$B2D6988F8B3D4901,$EFFA2CCC9D94CB0C,$5015EDEDED9B3305,$643D97CC39F638F2
    Data.q $4A4E33AFBACD9B34,$5B33156664065009,$646B329495B17D70,$BA1CF7CF9F6011C2,$1CF21CDFA4B6F02C
    Data.q $9798CCE833C3DB70,$E88E23742621BD34,$B7A4E92D7D25119F,$263FE1DD5EB3AAE1,$4973E920BB3F4BE9
    Data.q $78F7172ADD122B23,$E7380AFAD1CF7963,$81F79170F80FB015,$EF022F82CE0FC0C3,$8618BB7C017CB57A
    Data.q $CF61E00EA4B15335,$017F59C08FC0D3E2,$CF3E24A57B8F0075,$C8DC3FC4670D21BB,$D6359982A4876001
    Data.q $84E035E9EE720BD3,$725D24D5EC969599,$F25B56664BE7CD6F,$B892BCE0A9233E62,$A14285241F9AC6AE
    Data.q $74717CB96B9C5EE6,$A8AD6E8B49666B7A,$B6F50A142C572392,$7B8E92DD7B0AF15A,$613D6EB29EF71DC2
    Data.q $8C6364F952BC5695,$69E8EDB39F698157,$84254CCCCCC17FFB,$BB33250842FA0250,$935D257B490F66CD
    Data.q $743683611D5DB7B4,$E144CDC04B96C700,$37FF2BB594D4D4D0,$8A413BB5248ACC71,$444E454900000000
    Data.b $AE,$42,$60,$82
  flake_png_end:
EndDataSection