Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; particles
- ; определяем параметры дисплея
- ExamineDesktops()
- Global DesktopW = DesktopWidth(0)
- Global DesktopH = DesktopHeight(0)
- Global DesktopD = DesktopDepth(0)
- Global DesktopF = DesktopFrequency(0)
- ; загружаем шрифт для вывода инфы (не обязательно)
- If Not LoadFont(1,"Arial",12,#PB_Font_Bold)
- DisplayInfo = #False
- Else
- DisplayInfo = #True
- EndIf
- ; берем количество частиц из параметра
- Global numParticles = Val(ProgramParameter())-1
- If numParticles < 0
- numParticles = 9999
- EndIf
- ; открываем окно
- If Not InitSprite() Or Not InitKeyboard() Or Not InitMouse() : End : EndIf
- OpenScreen(DesktopW,DesktopH,DesktopD,"particles!",#PB_Screen_SmartSynchronization,DesktopF)
- ; задаем начальные рандомные координаты частиц
- Global Dim ParticleCoordsX(numParticles)
- For i=0 To numParticles
- ParticleCoordsX(i) = Random(DesktopW)
- Next
- Global Dim ParticleCoordsY(numParticles)
- For i=0 To numParticles
- ParticleCoordsY(i) = Random(DesktopH)
- Next
- Global mX,mY
- Global PointerMode = 0
- Global forceR = 200
- ; физика
- Procedure DoPhysics()
- For i=0 To numParticles
- ; элемент ВНЕЗАПНОСТИ
- If Random(10) > 2
- ; если частица в радиусе окружности
- If Pow(forceR,2) >= Pow(ParticleCoordsX(i)-mX,2) + Pow(ParticleCoordsY(i)-mY,2)
- ; если расстояние до курсора по оси Х больше чем по оси У
- If Pow(mX-ParticleCoordsX(i),2) >= Pow(mY-ParticleCoordsY(i),2)
- ; если курсор справа
- If mX > ParticleCoordsX(i)
- ; если курсор притягивает то отдаляемся от него на два пикселя, иначе приближаемся
- ; дальше по аналогии
- If PointerMode = 0 : ParticleCoordsX(i)+2 : Else : ParticleCoordsX(i)-2 : EndIf
- If mY > ParticleCoordsY(i)
- If PointerMode = 0 : ParticleCoordsY(i)+1 : Else : ParticleCoordsY(i)-1 : EndIf
- ElseIf mY = ParticleCoordsY(i)
- Else
- If PointerMode = 0 : ParticleCoordsY(i)-1 : Else : ParticleCoordsY(i)+1 : EndIf
- EndIf
- ; если на том же уровне (ничего не делаем)
- ElseIf mX = ParticleCoordsX(i)
- ; если курсор слева
- Else
- If PointerMode = 0 : ParticleCoordsX(i)-2 : Else : ParticleCoordsX(i)+2 : EndIf
- If mY > ParticleCoordsY(i)
- If PointerMode = 0 : ParticleCoordsY(i)+1 : Else : ParticleCoordsY(i)-1 : EndIf
- ElseIf mY = ParticleCoordsY(i)
- Else
- If PointerMode = 0 : ParticleCoordsY(i)-1 : Else : ParticleCoordsY(i)+1 : EndIf
- EndIf
- EndIf
- ; если расстояние до курсора по оси Х меньше чем по оси У
- Else
- If mY > ParticleCoordsY(i)
- If PointerMode = 0 : ParticleCoordsY(i)+2 : Else : ParticleCoordsY(i)-2 : EndIf
- If mX > ParticleCoordsX(i)
- If PointerMode = 0 : ParticleCoordsX(i)+1 : Else : ParticleCoordsX(i)-1 : EndIf
- ElseIf mX = ParticleCoordsX(i)
- Else
- If PointerMode = 0 : ParticleCoordsX(i)-1 : Else : ParticleCoordsX(i)+1 : EndIf
- EndIf
- ElseIf mY = ParticleCoordsY(i)
- Else
- If PointerMode = 0 : ParticleCoordsY(i)-2 : Else : ParticleCoordsY(i)+2 : EndIf
- If mX > ParticleCoordsX(i)
- If PointerMode = 0 : ParticleCoordsX(i)+1 : Else : ParticleCoordsX(i)-1 : EndIf
- ElseIf mX = ParticleCoordsX(i)
- Else
- If PointerMode = 0 : ParticleCoordsX(i)-1 : Else : ParticleCoordsX(i)+1 : EndIf
- EndIf
- EndIf
- EndIf
- EndIf
- EndIf
- ; задаем тупое рандомное движение в любые стороны
- mov = 1
- ; 8 - не баг
- Select Random(8)
- Case 0:
- ParticleCoordsX(i)+mov
- Case 1:
- ParticleCoordsY(i)+mov
- Case 2:
- ParticleCoordsX(i)-mov
- Case 3:
- ParticleCoordsY(i)-mov
- Case 4:
- ParticleCoordsX(i)+mov
- ParticleCoordsY(i)+mov
- Case 5:
- ParticleCoordsX(i)-mov
- ParticleCoordsY(i)-mov
- Case 6:
- ParticleCoordsX(i)+mov
- ParticleCoordsY(i)-mov
- Case 7:
- ParticleCoordsX(i)-mov
- ParticleCoordsY(i)+mov
- EndSelect
- Next
- EndProcedure
- ; начинаем считать время чтобы выводить FPS
- CurTime = ElapsedMilliseconds()
- ; главный цикл
- Repeat
- mX = MouseX()
- mY = MouseY()
- ; заливаем экран чооорным
- ClearScreen($000000)
- ; вызываем процедурку обрабатывающую движение частиц
- DoPhysics()
- ; рисуем частицы по их координатам
- activeParticles = 0
- StartDrawing(ScreenOutput())
- For i=0 To numParticles
- If ParticleCoordsX(i) < DesktopW And ParticleCoordsY(i) < DesktopH And ParticleCoordsX(i) => 0 And ParticleCoordsY(i) => 0
- ;Debug ParticleCoordsX(i)
- ;Debug ParticleCoordsY(i)
- Plot(ParticleCoordsX(i),ParticleCoordsY(i),$ffffff)
- activeParticles + 1
- EndIf
- Next
- ; выводим курсор
- mX - 1
- mY - 1
- For x=0 To 4
- For y=0 To 4
- If mX+x < DesktopW And mY+y < DesktopH And mX+x => 0 And mY+y => 0
- Plot(mX+x,mY+y,$aaaaaa)
- EndIf
- Next
- Next
- ; выводим инфо
- If DisplayInfo
- FPSCounter + 1
- DrawingMode(#PB_2DDrawing_Transparent)
- DrawingFont(FontID(1))
- DrawText(4,DesktopH-60,"FPS: " + Str(FPS))
- DrawText(4,DesktopH-40,"Free vmem: " + Str(Round(AvailableScreenMemory()/1024/1024,#PB_Round_Nearest)))
- DrawText(4,DesktopH-20,"Display: " + Str(DesktopW) + "x" + Str(DesktopH) + "@" + Str(DesktopD) + "bpp")
- If ElapsedMilliseconds() - CurTime >= 1000
- CurTime = ElapsedMilliseconds()
- FPS = FPSCounter
- FPSCounter = 0
- EndIf
- DrawText(4,4,"Particles: " + Str(activeParticles))
- If PointerMode = 0
- DrawText(4,24,"Pointer mode (m): attraction")
- Else
- DrawText(4,24,"Pointer mode (m): repulsion")
- EndIf
- DrawText(4,44,"Force radius (-/+): " + Str(forceR))
- EndIf
- StopDrawing()
- ; смотрим что за время последнего цикла произошло с мышкой и клавой
- ExamineKeyboard()
- ExamineMouse()
- If KeyboardReleased(#PB_Key_M)
- If PointerMode = 0
- PointerMode = 1
- Else
- PointerMode = 0
- EndIf
- EndIf
- If KeyboardPushed(#PB_Key_Equals)
- forceR + 1
- EndIf
- If KeyboardPushed(#PB_Key_Minus)
- If forceR - 1 => 0
- forceR - 1
- EndIf
- EndIf
- ; меняем местами буфер чтобы показать что мы там нарисовали
- FlipBuffers()
- Until KeyboardPushed(#PB_Key_Escape)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement