29 end; |
29 end; |
30 |
30 |
31 procedure AddGearCI(Gear: PGear); |
31 procedure AddGearCI(Gear: PGear); |
32 procedure DeleteCI(Gear: PGear); |
32 procedure DeleteCI(Gear: PGear); |
33 function CheckGearsCollision(Gear: PGear): PGearArray; |
33 function CheckGearsCollision(Gear: PGear): PGearArray; |
34 function TestCollisionXwithGear(Gear: PGear; Dir: integer): boolean; |
34 function TestCollisionXwithGear(Gear: PGear; Dir: LongInt): boolean; |
35 function TestCollisionYwithGear(Gear: PGear; Dir: integer): boolean; |
35 function TestCollisionYwithGear(Gear: PGear; Dir: LongInt): boolean; |
36 function TestCollisionY(Gear: PGear; Dir: integer): boolean; |
36 function TestCollisionY(Gear: PGear; Dir: LongInt): boolean; |
37 function TestCollisionXwithXYShift(Gear: PGear; ShiftX, ShiftY: hwFloat; Dir: integer): boolean; |
37 function TestCollisionXwithXYShift(Gear: PGear; ShiftX, ShiftY: hwFloat; Dir: LongInt): boolean; |
38 function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: integer; Dir: integer): boolean; |
38 function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: LongInt; Dir: LongInt): boolean; |
39 |
39 |
40 implementation |
40 implementation |
41 uses uMisc, uConsts, uLand, uLandGraphics; |
41 uses uMisc, uConsts, uLand, uLandGraphics; |
42 |
42 |
43 type TCollisionEntry = record |
43 type TCollisionEntry = record |
44 X, Y, Radius: integer; |
44 X, Y, Radius: LongInt; |
45 cGear: PGear; |
45 cGear: PGear; |
46 end; |
46 end; |
47 |
47 |
48 const MAXRECTSINDEX = 255; |
48 const MAXRECTSINDEX = 255; |
49 var Count: Longword = 0; |
49 var Count: Longword = 0; |
98 inc(ga.Count) |
98 inc(ga.Count) |
99 end; |
99 end; |
100 CheckGearsCollision:= Result |
100 CheckGearsCollision:= Result |
101 end; |
101 end; |
102 |
102 |
103 function TestCollisionXwithGear(Gear: PGear; Dir: integer): boolean; |
103 function TestCollisionXwithGear(Gear: PGear; Dir: LongInt): boolean; |
104 var x, y, i: integer; |
104 var x, y, i: LongInt; |
105 begin |
105 begin |
106 x:= hwRound(Gear^.X); |
106 x:= hwRound(Gear^.X); |
107 if Dir < 0 then x:= x - Gear^.Radius |
107 if Dir < 0 then x:= x - Gear^.Radius |
108 else x:= x + Gear^.Radius; |
108 else x:= x + Gear^.Radius; |
109 if (x and $FFFFF800) = 0 then |
109 if (x and $FFFFF800) = 0 then |
117 until (y > i); |
117 until (y > i); |
118 end; |
118 end; |
119 TestCollisionXwithGear:= false |
119 TestCollisionXwithGear:= false |
120 end; |
120 end; |
121 |
121 |
122 function TestCollisionXwithXYShift(Gear: PGear; ShiftX, ShiftY: hwFloat; Dir: integer): boolean; |
122 function TestCollisionXwithXYShift(Gear: PGear; ShiftX, ShiftY: hwFloat; Dir: LongInt): boolean; |
123 begin |
123 begin |
124 Gear^.X:= Gear^.X + ShiftX; |
124 Gear^.X:= Gear^.X + ShiftX; |
125 Gear^.Y:= Gear^.Y + ShiftY; |
125 Gear^.Y:= Gear^.Y + ShiftY; |
126 TestCollisionXwithXYShift:= TestCollisionXwithGear(Gear, Dir); |
126 TestCollisionXwithXYShift:= TestCollisionXwithGear(Gear, Dir); |
127 Gear^.X:= Gear^.X - ShiftX; |
127 Gear^.X:= Gear^.X - ShiftX; |
128 Gear^.Y:= Gear^.Y - ShiftY |
128 Gear^.Y:= Gear^.Y - ShiftY |
129 end; |
129 end; |
130 |
130 |
131 function TestCollisionYwithGear(Gear: PGear; Dir: integer): boolean; |
131 function TestCollisionYwithGear(Gear: PGear; Dir: LongInt): boolean; |
132 var x, y, i: integer; |
132 var x, y, i: LongInt; |
133 begin |
133 begin |
134 y:= hwRound(Gear^.Y); |
134 y:= hwRound(Gear^.Y); |
135 if Dir < 0 then y:= y - Gear^.Radius |
135 if Dir < 0 then y:= y - Gear^.Radius |
136 else y:= y + Gear^.Radius; |
136 else y:= y + Gear^.Radius; |
137 if (y and $FFFFFC00) = 0 then |
137 if (y and $FFFFFC00) = 0 then |
145 until (x > i); |
145 until (x > i); |
146 end; |
146 end; |
147 TestCollisionYwithGear:= false |
147 TestCollisionYwithGear:= false |
148 end; |
148 end; |
149 |
149 |
150 function TestCollisionY(Gear: PGear; Dir: integer): boolean; |
150 function TestCollisionY(Gear: PGear; Dir: LongInt): boolean; |
151 var x, y, i: integer; |
151 var x, y, i: LongInt; |
152 begin |
152 begin |
153 y:= hwRound(Gear^.Y); |
153 y:= hwRound(Gear^.Y); |
154 if Dir < 0 then y:= y - Gear^.Radius |
154 if Dir < 0 then y:= y - Gear^.Radius |
155 else y:= y + Gear^.Radius; |
155 else y:= y + Gear^.Radius; |
156 if (y and $FFFFFC00) = 0 then |
156 if (y and $FFFFFC00) = 0 then |
164 until (x > i); |
164 until (x > i); |
165 end; |
165 end; |
166 TestCollisionY:= false |
166 TestCollisionY:= false |
167 end; |
167 end; |
168 |
168 |
169 function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: integer; Dir: integer): boolean; |
169 function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: LongInt; Dir: LongInt): boolean; |
170 begin |
170 begin |
171 Gear^.X:= Gear^.X + ShiftX; |
171 Gear^.X:= Gear^.X + ShiftX; |
172 Gear^.Y:= Gear^.Y + ShiftY; |
172 Gear^.Y:= Gear^.Y + ShiftY; |
173 TestCollisionYwithXYShift:= TestCollisionYwithGear(Gear, Dir); |
173 TestCollisionYwithXYShift:= TestCollisionYwithGear(Gear, Dir); |
174 Gear^.X:= Gear^.X - ShiftX; |
174 Gear^.X:= Gear^.X - ShiftX; |