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