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