107 AddVisualGear(hwRound(Gear^.X) - Gear^.Radius, hwRound(Gear^.Y) - Gear^.Radius, vgtBubble) |
107 AddVisualGear(hwRound(Gear^.X) - Gear^.Radius, hwRound(Gear^.Y) - Gear^.Radius, vgtBubble) |
108 end; |
108 end; |
109 |
109 |
110 //////////////////////////////////////////////////////////////////////////////// |
110 //////////////////////////////////////////////////////////////////////////////// |
111 procedure doStepFallingGear(Gear: PGear); |
111 procedure doStepFallingGear(Gear: PGear); |
112 var isFalling, isCollV, isCollH: boolean; |
112 var isFalling: boolean; |
113 tmp: QWord; |
|
114 begin |
113 begin |
115 Gear^.State:= Gear^.State and not gstCollision; |
114 Gear^.State:= Gear^.State and not gstCollision; |
116 isCollV:= false; |
|
117 isCollH:= false; |
|
118 |
115 |
119 if Gear^.dY.isNegative then |
116 if Gear^.dY.isNegative then |
120 begin |
117 begin |
121 isFalling:= true; |
118 isFalling:= true; |
122 if TestCollisionYwithGear(Gear, -1) then |
119 if TestCollisionYwithGear(Gear, -1) then |
123 begin |
120 begin |
124 isCollV:= true; |
|
125 Gear^.dX:= Gear^.dX * Gear^.Friction; |
121 Gear^.dX:= Gear^.dX * Gear^.Friction; |
126 Gear^.dY:= - Gear^.dY * Gear^.Elasticity; |
122 Gear^.dY:= - Gear^.dY * Gear^.Elasticity; |
127 Gear^.State:= Gear^.State or gstCollision |
123 Gear^.State:= Gear^.State or gstCollision |
128 end |
124 end |
129 end else |
125 end else |
130 if TestCollisionYwithGear(Gear, 1) then |
126 if TestCollisionYwithGear(Gear, 1) then |
131 begin |
127 begin |
132 isCollV:= true; |
|
133 isFalling:= false; |
128 isFalling:= false; |
134 Gear^.dX:= Gear^.dX * Gear^.Friction; |
129 Gear^.dX:= Gear^.dX * Gear^.Friction; |
135 Gear^.dY:= - Gear^.dY * Gear^.Elasticity; |
130 Gear^.dY:= - Gear^.dY * Gear^.Elasticity; |
136 Gear^.State:= Gear^.State or gstCollision |
131 Gear^.State:= Gear^.State or gstCollision |
137 end else isFalling:= true; |
132 end else isFalling:= true; |
138 |
133 |
139 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then |
134 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then |
140 begin |
135 begin |
141 isCollH:= true; |
|
142 Gear^.dX:= - Gear^.dX * Gear^.Elasticity; |
136 Gear^.dX:= - Gear^.dX * Gear^.Elasticity; |
143 Gear^.dY:= Gear^.dY * Gear^.Elasticity; |
137 Gear^.dY:= Gear^.dY * Gear^.Elasticity; |
144 Gear^.State:= Gear^.State or gstCollision |
138 Gear^.State:= Gear^.State or gstCollision |
145 end else |
|
146 if TestCollisionXwithGear(Gear, -hwSign(Gear^.dX)) then |
|
147 isCollH:= true; |
|
148 |
|
149 if isCollV and isCollH then |
|
150 begin |
|
151 tmp:= Gear^.dX.QWordValue; |
|
152 Gear^.dX.QWordValue:= Gear^.dY.QWordValue; |
|
153 Gear^.dY.QWordValue:= tmp; |
|
154 end; |
139 end; |
155 |
140 |
156 if isFalling then Gear^.dY:= Gear^.dY + cGravity; |
141 if isFalling then Gear^.dY:= Gear^.dY + cGravity; |
157 |
142 |
158 Gear^.X:= Gear^.X + Gear^.dX; |
143 Gear^.X:= Gear^.X + Gear^.dX; |