162 AddVisualGear(hwRound(Gear^.X) - Gear^.Radius, hwRound(Gear^.Y) - Gear^.Radius, vgtBubble) |
162 AddVisualGear(hwRound(Gear^.X) - Gear^.Radius, hwRound(Gear^.Y) - Gear^.Radius, vgtBubble) |
163 end; |
163 end; |
164 |
164 |
165 //////////////////////////////////////////////////////////////////////////////// |
165 //////////////////////////////////////////////////////////////////////////////// |
166 procedure doStepFallingGear(Gear: PGear); |
166 procedure doStepFallingGear(Gear: PGear); |
167 var isFalling: boolean; |
167 var isFalling, isCollV, isCollH: boolean; |
|
168 tmp: QWord; |
168 begin |
169 begin |
169 Gear^.State:= Gear^.State and not gstCollision; |
170 Gear^.State:= Gear^.State and not gstCollision; |
|
171 isCollV:= false; |
|
172 isCollH:= false; |
170 |
173 |
171 if Gear^.dY.isNegative then |
174 if Gear^.dY.isNegative then |
172 begin |
175 begin |
173 isFalling:= true; |
176 isFalling:= true; |
174 if TestCollisionYwithGear(Gear, -1) then |
177 if TestCollisionYwithGear(Gear, -1) then |
175 begin |
178 begin |
|
179 isCollV:= true; |
176 Gear^.dX:= Gear^.dX * Gear^.Friction; |
180 Gear^.dX:= Gear^.dX * Gear^.Friction; |
177 Gear^.dY:= - Gear^.dY * Gear^.Elasticity; |
181 Gear^.dY:= - Gear^.dY * Gear^.Elasticity; |
178 Gear^.State:= Gear^.State or gstCollision |
182 Gear^.State:= Gear^.State or gstCollision |
179 end |
183 end |
180 end else |
184 end else |
181 if TestCollisionYwithGear(Gear, 1) then |
185 if TestCollisionYwithGear(Gear, 1) then |
182 begin |
186 begin |
|
187 isCollV:= true; |
183 isFalling:= false; |
188 isFalling:= false; |
184 Gear^.dX:= Gear^.dX * Gear^.Friction; |
189 Gear^.dX:= Gear^.dX * Gear^.Friction; |
185 Gear^.dY:= - Gear^.dY * Gear^.Elasticity; |
190 Gear^.dY:= - Gear^.dY * Gear^.Elasticity; |
186 Gear^.State:= Gear^.State or gstCollision |
191 Gear^.State:= Gear^.State or gstCollision |
187 end else isFalling:= true; |
192 end else isFalling:= true; |
188 |
193 |
|
194 |
189 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then |
195 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then |
190 begin |
196 begin |
|
197 isCollH:= true; |
191 Gear^.dX:= - Gear^.dX * Gear^.Elasticity; |
198 Gear^.dX:= - Gear^.dX * Gear^.Elasticity; |
192 Gear^.dY:= Gear^.dY * Gear^.Elasticity; |
199 Gear^.dY:= Gear^.dY * Gear^.Elasticity; |
193 Gear^.State:= Gear^.State or gstCollision |
200 Gear^.State:= Gear^.State or gstCollision |
194 end; |
201 end |
|
202 else if Gear^.AdvBounce and TestCollisionXwithGear(Gear, -hwSign(Gear^.dX)) then isCollH:= true; |
|
203 |
|
204 if isCollV and isCollH and Gear^.AdvBounce then |
|
205 begin |
|
206 tmp:= Gear^.dX.QWordValue; |
|
207 Gear^.dX.QWordValue:= Gear^.dY.QWordValue; |
|
208 Gear^.dY.QWordValue:= tmp; |
|
209 end; |
195 |
210 |
196 if isFalling then Gear^.dY:= Gear^.dY + cGravity; |
211 if isFalling then Gear^.dY:= Gear^.dY + cGravity; |
197 |
212 |
198 Gear^.X:= Gear^.X + Gear^.dX; |
213 Gear^.X:= Gear^.X + Gear^.dX; |
199 Gear^.Y:= Gear^.Y + Gear^.dY; |
214 Gear^.Y:= Gear^.Y + Gear^.dY; |