View difference between Paste ID: aus8ZDzG and vzmG9u4A
SHOW: | | - or go back to the newest paste.
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