Code archives/3D Graphics - Effects/Weather effects
This code has been declared by its author to be Public Domain code.
Download source code
| nothing spectacular .. this is a simple particle system that keeps the particle density on a constant amount when you travel through the snow This could be used for other effects as well, like rain or something like it. |
Graphics3D 800,600,32,2 SetBuffer(BackBuffer()) ;------ camera stuff Global ML_cam_pivot = CreatePivot() Global ML_cam_pivot2 = CreatePivot(ML_cam_pivot) Global ML_camera = CreateCamera(ML_cam_pivot2) ;cameracone for the topview cone = CreateCone(12,1,ml_camera) EntityColor(cone,255,0,0) TurnEntity cone,-90,0,0 Global x_speed#,y_speed#,z_speed# ;------ load the snowflake extractdata("snow.jpg") Global snow = LoadSprite("snow.jpg",2) ScaleSprite(snow,0.5,0.5) DeleteFile("snow.jpg") HideEntity(snow) ;----- the particle type Type snow Field entity Field x#,y#,z# Field vx#,vy#,vz# End Type ;topview camera topview = CreateCamera(ml_cam_pivot) CameraViewport topview,10,10,320,240 CameraProjMode(topview,2) CameraZoom(topview,0.02) MoveEntity(topview,0,10,10) TurnEntity(topview,90,0,0) ;a plane plane = CreatePlane() MoveEntity(plane,0,-8,0) EntityColor(plane,30,30,30) ;----- the dimension of the weather box Global weather_x# = 25 Global weather_y# = 20 Global weather_z# = 40 ;----- particles must only be created once on startup ... they will be recycled createSnow(200) ;main loop While Not KeyHit(1) mousemove() mouselook() doSnow() RenderWorld() ;border for topview Color 255,255,255 Rect 10,10,320,240,0 Flip() Wend End Function doSnow() For s.snow = Each snow ;this is just the tumbling of the flakes ... ;all movements should be applied To the virtual position s\vx = s\vx + Rnd(-0.01,0.01) If s\vx > 0.051 s\vx = 0.051 ElseIf s\vx < -0.051 s\vx = - 0.051 EndIf s\vz = s\vz + Rnd(-0.01,0.01) If s\vz > 0.051 s\vz = 0.051 ElseIf s\vz < -0.051 s\vz = - 0.051 EndIf ;---- now lets correct the position of the flake PositionEntity s\entity,s\x,s\y,s\z,1 ;---- if the flake leaves the weatherbox ... move them to the other side of the box If EntityX(s\entity) < -weather_x TranslateEntity s\entity,weather_x*2,0,0 ElseIf EntityX(s\entity) > weather_x TranslateEntity s\entity,-weather_x*2,0,0 EndIf If EntityY(s\entity) < -weather_y TranslateEntity s\entity,0,weather_y*2,0 ElseIf EntityY(s\entity) > weather_y TranslateEntity s\entity,0,-weather_y*2,0 EndIf If EntityZ(s\entity) < 0 TranslateEntity s\entity,0,0,weather_z ElseIf EntityZ(s\entity) > weather_z TranslateEntity s\entity,0,0,-weather_z EndIf ;---- now correct the virtual position of the flake and aplly the movements s\x = EntityX(s\entity,1) + s\vx s\y = EntityY(s\entity,1) - 0.051 s\z = EntityZ(s\entity,1) + s\vz Next End Function Function createSnow(amount) For i=1 To amount s.snow = New snow ;the snow must be parented to the camera s\entity = CopyEntity(snow,ML_camera) s\x = Rnd(-weather_x,weather_x) s\y = Rnd(-weather_y,weather_y) s\z = Rnd(0,weather_z) PositionEntity(s\entity,s\x,s\y,s\z) EntityAutoFade(s\entity,weather_z/2,weather_z) RotateSprite(s\entity,Rnd(0,360)) Next End Function ;----------------- navigation Function mouselook() x_speed# = x_speed * 0.3 + MouseXSpeed() * 0.3 y_speed# = y_speed * 0.3 + MouseYSpeed() * 0.3 z_speed# = z_speed * 0.3 + MouseZSpeed() * 0.3 MoveMouse GraphicsWidth()/2,GraphicsHeight()/2 TurnEntity ML_cam_pivot,0,-x_speed,0 ;turn player left/right TurnEntity ML_cam_pivot2,y_speed,0,0 ;tilt camera End Function Function mousemove() If KeyDown(200) ;forward MoveEntity ML_cam_pivot,0,0,0.5 End If If KeyDown(208) ;backward MoveEntity ML_cam_pivot,0,0,-0.5 End If If KeyDown(203) ;left MoveEntity ML_cam_pivot,-0.5,0,0 End If If KeyDown(205) ;right MoveEntity ML_cam_pivot,0.5,0,0 End If If KeyDown(30) ;UP MoveEntity ML_cam_pivot,0,0.5,0 End If If KeyDown(44) ;DOWN MoveEntity ML_cam_pivot,0,-0.5,0 End If End Function ;--------- the data for the snowflake Function extractdata(filename$) file = WriteFile(filename) d = True While d > -1 Read d WriteByte(file,d) Wend CloseFile(file) End Function .snowData Data 255,216,255,224,0,16,74,70,73,70,0,1,2,0,0,100,0,100,0,0,255 Data 236,0,17,68,117,99,107,121,0,1,0,4,0,0,0,50,0,0,255,238,0,33 Data 65,100,111,98,101,0,100,192,0,0,0,1,3,0,16,3,3,6,9,0,0,1,235 Data 0,0,2,53,0,0,2,140,255,219,0,132,0,8,6,6,6,6,6,8,6,6,8,12,8 Data 7,8,12,14,10,8,8,10,14,16,13,13,14,13,13,16,17,12,14,13,13 Data 14,12,17,15,18,19,20,19,18,15,24,24,26,26,24,24,35,34,34,34 Data 35,39,39,39,39,39,39,39,39,39,39,1,9,8,8,9,10,9,11,9,9,11,14 Data 11,13,11,14,17,14,14,14,14,17,19,13,13,14,13,13,19,24,17,15 Data 15,15,15,17,24,22,23,20,20,20,23,22,26,26,24,24,26,26,33,33 Data 32,33,33,39,39,39,39,39,39,39,39,39,39,255,194,0,17,8,0,32 Data 0,32,3,1,34,0,2,17,1,3,17,1,255,196,0,141,0,1,0,3,1,0,0,0,0 Data 0,0,0,0,0,0,0,0,8,4,6,7,5,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,16,0,2,2,2,3,1,0,0,0,0,0,0,0,0,0,0,3,4,1,2,5,6,0,32,17,18 Data 17,0,2,2,2,2,3,1,0,0,0,0,0,0,0,0,0,0,1,17,2,18,3,33,49,65,81 Data 97,34,18,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,19,1,1,1,1,0,3 Data 1,0,0,0,0,0,0,0,0,0,1,17,0,33,32,49,65,97,255,218,0,12,3,1 Data 0,2,17,3,17,0,0,0,194,111,18,17,65,206,130,214,47,28,37,88 Data 214,244,111,199,168,149,99,255,218,0,8,1,2,0,1,5,1,233,255 Data 218,0,8,1,3,0,1,5,1,233,255,218,0,8,1,1,0,1,5,1,10,229,61,177 Data 250,237,152,171,122,193,71,7,5,215,190,164,64,85,165,214,23 Data 133,24,190,54,129,64,220,195,22,4,240,93,164,137,220,152,151 Data 30,125,218,56,90,218,107,40,236,37,90,175,230,8,228,204,204 Data 243,255,218,0,8,1,2,2,6,63,1,31,255,218,0,8,1,3,2,6,63,1,31 Data 255,218,0,8,1,1,1,6,63,1,199,85,114,102,91,83,79,209,58,211 Data 29,46,161,142,187,123,125,18,171,8,106,11,66,225,154,219,234 Data 74,226,252,13,221,153,208,149,217,141,255,0,71,195,147,255 Data 218,0,8,1,2,3,1,63,16,240,255,218,0,8,1,3,3,1,63,16,240,255 Data 218,0,8,1,1,3,1,63,16,178,30,196,59,157,254,12,153,115,192 Data 105,210,31,184,165,17,149,162,153,59,132,130,243,57,65,20,153 Data 215,144,174,25,39,143,88,130,217,234,226,169,123,220,77,224 Data -1 |