Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Structure Canvas
- Offset_X.d
- Offset_Y.d
- Zoom.d
- EndStructure
- Global Canvas.Canvas
- Canvas\Zoom = 1 ; Must not be 0!
- Structure Entity
- X.d
- Y.d
- V_X.d ; Velocity in X
- V_Y.d ; Velocity in Y
- Radius.d
- EndStructure
- Global NewList Entity.Entity()
- ; #### 0 is in the middle of the screen
- ; #### X+ is right
- ; #### Y+ is down
- ; #### Zoom = 1 is no zoom
- ; #### Zoom+ zooms in
- Macro Real_2_Screen_X(Coordinate)
- ((Coordinate) * Canvas\Zoom + Canvas\Offset_X + Width/2)
- EndMacro
- Macro Real_2_Screen_Y(Coordinate)
- ((Coordinate) * Canvas\Zoom + Canvas\Offset_Y + Height/2)
- EndMacro
- Macro Screen_2_Real_X(Coordinate)
- ((Coordinate) - Canvas\Offset_X - Width/2)/Canvas\Zoom
- EndMacro
- Macro Screen_2_Real_Y(Coordinate)
- ((Coordinate) - Canvas\Offset_Y - Height/2)/Canvas\Zoom
- EndMacro
- Procedure Scope_AddPathGrid(Offset_X.d, Offset_Y.d, Zoom_X.d, Zoom_Y.d, Width.d, Height.d, Spacing.d, Divider, Color)
- If Divider < 2
- ProcedureReturn #False
- EndIf
- Protected Level_X = Round(Log(Zoom_X) / Log(Divider), #PB_Round_Down)
- Protected Level_Y = Round(Log(Zoom_Y) / Log(Divider), #PB_Round_Down)
- Protected Divider_X.d = Pow(Divider, Level_X)
- Protected Divider_Y.d = Pow(Divider, Level_Y)
- Protected Display_Spacing_X.d = Spacing * Zoom_X / Divider_X
- Protected Display_Spacing_Y.d = Spacing * Zoom_Y / Divider_Y
- Protected Steps_X = Round(Width / Display_Spacing_X, #PB_Round_Up)
- Protected Steps_Y = Round(Height / Display_Spacing_Y, #PB_Round_Up)
- Offset_X + Width / 2
- Offset_Y + Height / 2
- Protected Display_X.d = Offset_X - Round(Offset_X * Divider_X / Spacing / Zoom_X, #PB_Round_Down) / Divider_X * Spacing * Zoom_X
- Protected i
- For i = 0 To Steps_X
- LineXY(Display_X, 0, Display_X, Height, Color)
- Display_X + Display_Spacing_X
- Next
- Protected Display_Y.d = Offset_Y - Round(Offset_Y * Divider_Y / Spacing / Zoom_Y, #PB_Round_Down) / Divider_Y * Spacing * Zoom_Y
- For i = 0 To Steps_Y
- LineXY(0, Display_Y, Width, Display_Y, Color)
- Display_Y + Display_Spacing_Y
- Next
- ProcedureReturn #True
- EndProcedure
- Procedure Redraw()
- Protected Width.d, Height.d
- Protected Real_X.d, Real_Y.d
- Protected Screen_X.d, Screen_Y.d
- If StartDrawing(CanvasOutput(0))
- Width = OutputWidth()
- Height = OutputHeight()
- ; #### Clear screen
- Box(0, 0, Width, Height, RGB(0,0,0))
- ; #### Draw grid
- Scope_AddPathGrid(Canvas\Offset_X, Canvas\Offset_Y, Canvas\Zoom, Canvas\Zoom, Width, Height, 10, 10, RGB(50,50,50))
- Scope_AddPathGrid(Canvas\Offset_X, Canvas\Offset_Y, Canvas\Zoom, Canvas\Zoom, Width, Height, 10*10, 10, RGB(100,100,100))
- ; #### Draw all entites
- ForEach Entity()
- Screen_X = Real_2_Screen_X(Entity()\X)
- Screen_Y = Real_2_Screen_Y(Entity()\Y)
- Circle(Screen_X, Screen_Y, Entity()\Radius * Canvas\Zoom, RGB(255,255,255))
- Next
- StopDrawing()
- EndIf
- EndProcedure
- If OpenWindow(0, 0, 0, 800, 600, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
- CanvasGadget(0, 0, 0, 800, 600, #PB_Canvas_Keyboard)
- Repeat
- Event = WindowEvent()
- If Event = #PB_Event_Gadget And EventGadget() = 0
- Select EventType()
- Case #PB_EventType_LeftButtonDown
- AddElement(Entity())
- Width = GadgetWidth(0)
- Height = GadgetHeight(0)
- Entity()\X = Screen_2_Real_X(GetGadgetAttribute(0, #PB_Canvas_MouseX))
- Entity()\Y = Screen_2_Real_Y(GetGadgetAttribute(0, #PB_Canvas_MouseY))
- Entity()\V_X = (Random(2000)-1000) / 500
- Entity()\V_Y = (Random(2000)-1000) / 500
- Entity()\Radius = Random(20) + 5
- EndSelect
- EndIf
- ; #### Let all entites move (New_Position = Old_Position + Velocity) (There should be some factor to compensate the framerate later...)
- ForEach Entity()
- Entity()\X + Entity()\V_X
- Entity()\Y + Entity()\V_Y
- Next
- ; #### Center on the first entity, if there is one
- If FirstElement(Entity())
- Canvas\Zoom = Sin(Counter*0.03) * 0.9 + 1
- Canvas\Offset_X = -Entity()\X * Canvas\Zoom
- Canvas\Offset_Y = -Entity()\Y * Canvas\Zoom
- Counter + 1
- EndIf
- Redraw()
- Delay(10)
- Until Event = #PB_Event_CloseWindow
- EndIf
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement