hedgewars/uCollisions.pas
changeset 371 731ad6d27bd1
parent 351 29bc9c36ad5f
child 393 db01cc79f278
equal deleted inserted replaced
370:c75410fe3133 371:731ad6d27bd1
    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;
    77    dec(Count)
    77    dec(Count)
    78    end;
    78    end;
    79 end;
    79 end;
    80 
    80 
    81 function CheckGearsCollision(Gear: PGear): PGearArray;
    81 function CheckGearsCollision(Gear: PGear): PGearArray;
    82 var mx, my: integer;
    82 var mx, my: LongInt;
    83     i: Longword;
    83     i: Longword;
    84     Result: PGearArray;
    84     Result: PGearArray;
    85 begin
    85 begin
    86 Result:= @ga;
    86 Result:= @ga;
    87 ga.Count:= 0;
    87 ga.Count:= 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;