Advertisement
deseven

particles

Oct 19th, 2012
517
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; particles
  2.  
  3. ; определяем параметры дисплея
  4. ExamineDesktops()
  5. Global DesktopW = DesktopWidth(0)
  6. Global DesktopH = DesktopHeight(0)
  7. Global DesktopD = DesktopDepth(0)
  8. Global DesktopF = DesktopFrequency(0)
  9.  
  10. ; загружаем шрифт для вывода инфы (не обязательно)
  11. If Not LoadFont(1,"Arial",12,#PB_Font_Bold)
  12.   DisplayInfo = #False
  13. Else
  14.   DisplayInfo = #True
  15. EndIf
  16.  
  17. ; берем количество частиц из параметра
  18. Global numParticles = Val(ProgramParameter())-1
  19. If numParticles < 0
  20.   numParticles = 9999
  21. EndIf
  22.  
  23. ; открываем окно
  24. If Not InitSprite() Or Not InitKeyboard() Or Not InitMouse() : End : EndIf
  25. OpenScreen(DesktopW,DesktopH,DesktopD,"particles!",#PB_Screen_SmartSynchronization,DesktopF)
  26.  
  27. ; задаем начальные рандомные координаты частиц
  28. Global Dim ParticleCoordsX(numParticles)
  29. For i=0 To numParticles
  30.   ParticleCoordsX(i) = Random(DesktopW)
  31. Next
  32.  
  33. Global Dim ParticleCoordsY(numParticles)
  34. For i=0 To numParticles
  35.   ParticleCoordsY(i) = Random(DesktopH)
  36. Next
  37.  
  38. Global mX,mY
  39. Global PointerMode = 0
  40. Global forceR = 200
  41.  
  42. ; физика
  43. Procedure DoPhysics()
  44.  
  45.   For i=0 To numParticles
  46.    
  47.     ; элемент ВНЕЗАПНОСТИ
  48.     If Random(10) > 2
  49.      
  50.       ; если частица в радиусе окружности
  51.       If Pow(forceR,2) >= Pow(ParticleCoordsX(i)-mX,2) + Pow(ParticleCoordsY(i)-mY,2)
  52.        
  53.         ; если расстояние до курсора по оси Х больше чем по оси У
  54.         If Pow(mX-ParticleCoordsX(i),2) >= Pow(mY-ParticleCoordsY(i),2)
  55.           ; если курсор справа
  56.           If mX > ParticleCoordsX(i)
  57.             ; если курсор притягивает то отдаляемся от него на два пикселя, иначе приближаемся
  58.             ; дальше по аналогии
  59.             If PointerMode = 0 : ParticleCoordsX(i)+2 : Else : ParticleCoordsX(i)-2 : EndIf
  60.             If mY > ParticleCoordsY(i)
  61.               If PointerMode = 0 : ParticleCoordsY(i)+1 : Else : ParticleCoordsY(i)-1 : EndIf
  62.             ElseIf mY = ParticleCoordsY(i)
  63.             Else
  64.               If PointerMode = 0 : ParticleCoordsY(i)-1 : Else : ParticleCoordsY(i)+1 : EndIf
  65.             EndIf
  66.           ; если на том же уровне (ничего не делаем)
  67.           ElseIf mX = ParticleCoordsX(i)
  68.           ; если курсор слева
  69.           Else
  70.             If PointerMode = 0 : ParticleCoordsX(i)-2 : Else : ParticleCoordsX(i)+2 : EndIf
  71.             If mY > ParticleCoordsY(i)
  72.               If PointerMode = 0 : ParticleCoordsY(i)+1 : Else : ParticleCoordsY(i)-1 : EndIf
  73.             ElseIf mY = ParticleCoordsY(i)
  74.             Else
  75.               If PointerMode = 0 : ParticleCoordsY(i)-1 : Else : ParticleCoordsY(i)+1 : EndIf
  76.             EndIf
  77.           EndIf
  78.         ; если расстояние до курсора по оси Х меньше чем по оси У
  79.         Else
  80.           If mY > ParticleCoordsY(i)
  81.             If PointerMode = 0 : ParticleCoordsY(i)+2 : Else : ParticleCoordsY(i)-2 : EndIf
  82.             If mX > ParticleCoordsX(i)
  83.               If PointerMode = 0 : ParticleCoordsX(i)+1 : Else : ParticleCoordsX(i)-1 : EndIf
  84.             ElseIf mX = ParticleCoordsX(i)
  85.             Else
  86.               If PointerMode = 0 : ParticleCoordsX(i)-1 : Else : ParticleCoordsX(i)+1 : EndIf
  87.             EndIf
  88.           ElseIf mY = ParticleCoordsY(i)
  89.           Else
  90.             If PointerMode = 0 : ParticleCoordsY(i)-2 : Else : ParticleCoordsY(i)+2 : EndIf
  91.             If mX > ParticleCoordsX(i)
  92.               If PointerMode = 0 : ParticleCoordsX(i)+1 : Else : ParticleCoordsX(i)-1 : EndIf
  93.             ElseIf mX = ParticleCoordsX(i)
  94.             Else
  95.               If PointerMode = 0 : ParticleCoordsX(i)-1 : Else : ParticleCoordsX(i)+1 : EndIf
  96.             EndIf
  97.           EndIf
  98.         EndIf
  99.       EndIf
  100.     EndIf
  101.    
  102.     ; задаем тупое рандомное движение в любые стороны
  103.     mov = 1
  104.     ; 8 - не баг
  105.     Select Random(8)
  106.       Case 0:
  107.         ParticleCoordsX(i)+mov
  108.       Case 1:
  109.         ParticleCoordsY(i)+mov
  110.       Case 2:
  111.         ParticleCoordsX(i)-mov
  112.       Case 3:
  113.         ParticleCoordsY(i)-mov
  114.       Case 4:
  115.         ParticleCoordsX(i)+mov
  116.         ParticleCoordsY(i)+mov
  117.       Case 5:
  118.         ParticleCoordsX(i)-mov
  119.         ParticleCoordsY(i)-mov
  120.       Case 6:
  121.         ParticleCoordsX(i)+mov
  122.         ParticleCoordsY(i)-mov
  123.       Case 7:
  124.         ParticleCoordsX(i)-mov
  125.         ParticleCoordsY(i)+mov
  126.     EndSelect
  127.    
  128.   Next
  129. EndProcedure
  130.  
  131. ; начинаем считать время чтобы выводить FPS
  132. CurTime = ElapsedMilliseconds()
  133.  
  134. ; главный цикл
  135. Repeat
  136.   mX = MouseX()
  137.   mY = MouseY()
  138.  
  139.   ; заливаем экран чооорным
  140.   ClearScreen($000000)
  141.  
  142.   ; вызываем процедурку обрабатывающую движение частиц
  143.   DoPhysics()
  144.  
  145.   ; рисуем частицы по их координатам
  146.   activeParticles = 0
  147.   StartDrawing(ScreenOutput())
  148.   For i=0 To numParticles
  149.     If ParticleCoordsX(i) < DesktopW And ParticleCoordsY(i) < DesktopH And ParticleCoordsX(i) => 0 And ParticleCoordsY(i) => 0
  150.       ;Debug ParticleCoordsX(i)
  151.       ;Debug ParticleCoordsY(i)
  152.       Plot(ParticleCoordsX(i),ParticleCoordsY(i),$ffffff)
  153.       activeParticles + 1
  154.     EndIf
  155.   Next
  156.  
  157.   ; выводим курсор
  158.   mX - 1
  159.   mY - 1
  160.  
  161.   For x=0 To 4
  162.     For y=0 To 4
  163.       If mX+x < DesktopW And mY+y < DesktopH And mX+x => 0 And mY+y => 0
  164.         Plot(mX+x,mY+y,$aaaaaa)
  165.       EndIf
  166.     Next
  167.   Next
  168.  
  169.   ; выводим инфо
  170.   If DisplayInfo
  171.     FPSCounter + 1
  172.     DrawingMode(#PB_2DDrawing_Transparent)
  173.     DrawingFont(FontID(1))
  174.     DrawText(4,DesktopH-60,"FPS: " + Str(FPS))
  175.     DrawText(4,DesktopH-40,"Free vmem: " + Str(Round(AvailableScreenMemory()/1024/1024,#PB_Round_Nearest)))
  176.     DrawText(4,DesktopH-20,"Display: " + Str(DesktopW) + "x" + Str(DesktopH) + "@" + Str(DesktopD) + "bpp")
  177.     If ElapsedMilliseconds() - CurTime >= 1000
  178.       CurTime = ElapsedMilliseconds()
  179.       FPS = FPSCounter
  180.       FPSCounter = 0
  181.     EndIf
  182.     DrawText(4,4,"Particles: " + Str(activeParticles))
  183.     If PointerMode = 0
  184.       DrawText(4,24,"Pointer mode (m): attraction")
  185.     Else
  186.       DrawText(4,24,"Pointer mode (m): repulsion")
  187.     EndIf
  188.     DrawText(4,44,"Force radius (-/+): " + Str(forceR))
  189.   EndIf
  190.  
  191.   StopDrawing()
  192.  
  193.   ; смотрим что за время последнего цикла произошло с мышкой и клавой
  194.   ExamineKeyboard()
  195.   ExamineMouse()
  196.  
  197.   If KeyboardReleased(#PB_Key_M)
  198.     If PointerMode = 0
  199.       PointerMode = 1
  200.     Else
  201.       PointerMode = 0
  202.     EndIf
  203.   EndIf
  204.  
  205.   If KeyboardPushed(#PB_Key_Equals)
  206.     forceR + 1
  207.   EndIf
  208.  
  209.   If KeyboardPushed(#PB_Key_Minus)
  210.     If forceR - 1 => 0
  211.       forceR - 1
  212.     EndIf
  213.   EndIf
  214.  
  215.   ; меняем местами буфер чтобы показать что мы там нарисовали
  216.   FlipBuffers()
  217.  
  218. Until KeyboardPushed(#PB_Key_Escape)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement