Advertisement
Guest User

Untitled

a guest
Jan 1st, 2016
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Structure Canvas
  2.   Offset_X.d
  3.   Offset_Y.d
  4.   Zoom.d
  5. EndStructure
  6. Global Canvas.Canvas
  7.  
  8. Canvas\Zoom = 1 ; Must not be 0!
  9.  
  10. Structure Entity
  11.   X.d
  12.   Y.d
  13.  
  14.   V_X.d ; Velocity in X
  15.   V_Y.d ; Velocity in Y
  16.  
  17.   Radius.d
  18. EndStructure
  19. Global NewList Entity.Entity()
  20.  
  21. ; #### 0 is in the middle of the screen
  22. ; #### X+ is right
  23. ; #### Y+ is down
  24. ; #### Zoom = 1 is no zoom
  25. ; #### Zoom+ zooms in
  26. Macro Real_2_Screen_X(Coordinate)
  27.   ((Coordinate) * Canvas\Zoom + Canvas\Offset_X + Width/2)
  28. EndMacro
  29. Macro Real_2_Screen_Y(Coordinate)
  30.   ((Coordinate) * Canvas\Zoom + Canvas\Offset_Y + Height/2)
  31. EndMacro
  32.  
  33. Macro Screen_2_Real_X(Coordinate)
  34.   ((Coordinate) - Canvas\Offset_X - Width/2)/Canvas\Zoom
  35. EndMacro
  36. Macro Screen_2_Real_Y(Coordinate)
  37.   ((Coordinate) - Canvas\Offset_Y - Height/2)/Canvas\Zoom
  38. EndMacro
  39.  
  40. Procedure Scope_AddPathGrid(Offset_X.d, Offset_Y.d, Zoom_X.d, Zoom_Y.d, Width.d, Height.d, Spacing.d, Divider, Color)
  41.   If Divider < 2
  42.     ProcedureReturn #False
  43.   EndIf
  44.   Protected Level_X = Round(Log(Zoom_X) / Log(Divider), #PB_Round_Down)
  45.   Protected Level_Y = Round(Log(Zoom_Y) / Log(Divider), #PB_Round_Down)
  46.   Protected Divider_X.d = Pow(Divider, Level_X)
  47.   Protected Divider_Y.d = Pow(Divider, Level_Y)
  48.   Protected Display_Spacing_X.d = Spacing * Zoom_X / Divider_X
  49.   Protected Display_Spacing_Y.d = Spacing * Zoom_Y / Divider_Y
  50.  
  51.   Protected Steps_X = Round(Width / Display_Spacing_X, #PB_Round_Up)
  52.   Protected Steps_Y = Round(Height / Display_Spacing_Y, #PB_Round_Up)
  53.  
  54.   Offset_X + Width / 2
  55.   Offset_Y + Height / 2
  56.  
  57.   Protected Display_X.d = Offset_X - Round(Offset_X * Divider_X / Spacing / Zoom_X, #PB_Round_Down) / Divider_X * Spacing * Zoom_X
  58.   Protected i
  59.   For i = 0 To Steps_X
  60.     LineXY(Display_X, 0, Display_X, Height, Color)
  61.     Display_X + Display_Spacing_X
  62.   Next
  63.  
  64.   Protected Display_Y.d = Offset_Y - Round(Offset_Y * Divider_Y / Spacing / Zoom_Y, #PB_Round_Down) / Divider_Y * Spacing * Zoom_Y
  65.   For i = 0 To Steps_Y
  66.     LineXY(0, Display_Y, Width, Display_Y, Color)
  67.     Display_Y + Display_Spacing_Y
  68.   Next
  69.      
  70.   ProcedureReturn #True
  71. EndProcedure
  72.  
  73. Procedure Redraw()
  74.   Protected Width.d, Height.d
  75.   Protected Real_X.d, Real_Y.d
  76.   Protected Screen_X.d, Screen_Y.d
  77.  
  78.   If StartDrawing(CanvasOutput(0))
  79.    
  80.     Width = OutputWidth()
  81.     Height = OutputHeight()
  82.    
  83.     ; #### Clear screen
  84.     Box(0, 0, Width, Height, RGB(0,0,0))
  85.    
  86.     ; #### Draw grid
  87.     Scope_AddPathGrid(Canvas\Offset_X, Canvas\Offset_Y, Canvas\Zoom, Canvas\Zoom, Width, Height, 10, 10, RGB(50,50,50))
  88.     Scope_AddPathGrid(Canvas\Offset_X, Canvas\Offset_Y, Canvas\Zoom, Canvas\Zoom, Width, Height, 10*10, 10, RGB(100,100,100))
  89.    
  90.     ; #### Draw all entites
  91.     ForEach Entity()
  92.       Screen_X = Real_2_Screen_X(Entity()\X)
  93.       Screen_Y = Real_2_Screen_Y(Entity()\Y)
  94.      
  95.       Circle(Screen_X, Screen_Y, Entity()\Radius * Canvas\Zoom, RGB(255,255,255))
  96.      
  97.     Next
  98.    
  99.     StopDrawing()
  100.   EndIf
  101.  
  102. EndProcedure
  103.  
  104. If OpenWindow(0, 0, 0, 800, 600, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  105.   CanvasGadget(0, 0, 0, 800, 600, #PB_Canvas_Keyboard)
  106.  
  107.   Repeat
  108.     Event = WindowEvent()
  109.        
  110.     If Event = #PB_Event_Gadget And EventGadget() = 0
  111.       Select EventType()
  112.         Case #PB_EventType_LeftButtonDown
  113.           AddElement(Entity())
  114.           Width = GadgetWidth(0)
  115.           Height = GadgetHeight(0)
  116.           Entity()\X = Screen_2_Real_X(GetGadgetAttribute(0, #PB_Canvas_MouseX))
  117.           Entity()\Y = Screen_2_Real_Y(GetGadgetAttribute(0, #PB_Canvas_MouseY))
  118.           Entity()\V_X = (Random(2000)-1000) / 500
  119.           Entity()\V_Y = (Random(2000)-1000) / 500
  120.           Entity()\Radius = Random(20) + 5
  121.        
  122.       EndSelect
  123.     EndIf    
  124.    
  125.     ; #### Let all entites move (New_Position = Old_Position + Velocity) (There should be some factor to compensate the framerate later...)
  126.     ForEach Entity()
  127.       Entity()\X + Entity()\V_X
  128.       Entity()\Y + Entity()\V_Y
  129.     Next
  130.    
  131.     ; #### Center on the first entity, if there is one
  132.     If FirstElement(Entity())
  133.       Canvas\Zoom = Sin(Counter*0.03) * 0.9 + 1
  134.       Canvas\Offset_X = -Entity()\X * Canvas\Zoom
  135.       Canvas\Offset_Y = -Entity()\Y * Canvas\Zoom
  136.       Counter + 1
  137.     EndIf
  138.    
  139.     Redraw()
  140.    
  141.     Delay(10)
  142.    
  143.   Until Event = #PB_Event_CloseWindow
  144. EndIf
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement