equal
deleted
inserted
replaced
21 unit uGearsHandlers; |
21 unit uGearsHandlers; |
22 interface |
22 interface |
23 |
23 |
24 uses uTypes; |
24 uses uTypes; |
25 |
25 |
26 procedure cakeStep(Gear: PGear); |
26 function cakeStep(Gear: PGear): boolean; |
27 |
27 |
28 implementation |
28 implementation |
29 |
29 |
30 uses SDLh, uFloat, uCollisions; |
30 uses SDLh, uFloat, uCollisions; |
31 |
31 |
33 |
33 |
34 const dirs: array[0..3] of TPoint = ((X: 0; Y: -1), (X: 1; Y: 0),(X: 0; Y: 1),(X: -1; Y: 0)); |
34 const dirs: array[0..3] of TPoint = ((X: 0; Y: -1), (X: 1; Y: 0),(X: 0; Y: 1),(X: -1; Y: 0)); |
35 |
35 |
36 procedure PrevAngle(Gear: PGear; dA: LongInt); inline; |
36 procedure PrevAngle(Gear: PGear; dA: LongInt); inline; |
37 begin |
37 begin |
|
38 inc(Gear^.WDTimer); |
38 Gear^.Angle := (LongInt(Gear^.Angle) - dA) and 3 |
39 Gear^.Angle := (LongInt(Gear^.Angle) - dA) and 3 |
39 end; |
40 end; |
40 |
41 |
41 procedure NextAngle(Gear: PGear; dA: LongInt); inline; |
42 procedure NextAngle(Gear: PGear; dA: LongInt); inline; |
42 begin |
43 begin |
|
44 inc(Gear^.WDTimer); |
43 Gear^.Angle := (LongInt(Gear^.Angle) + dA) and 3 |
45 Gear^.Angle := (LongInt(Gear^.Angle) + dA) and 3 |
44 end; |
46 end; |
45 |
47 |
46 procedure cakeStep(Gear: PGear); |
48 function cakeStep(Gear: PGear): boolean; |
47 var |
49 var |
48 xx, yy, xxn, yyn: LongInt; |
50 xx, yy, xxn, yyn: LongInt; |
49 dA: LongInt; |
51 dA: LongInt; |
50 begin |
52 begin |
51 dA := hwSign(Gear^.dX); |
53 dA := hwSign(Gear^.dX); |
55 yyn := dirs[(LongInt(Gear^.Angle) + dA) and 3].y; |
57 yyn := dirs[(LongInt(Gear^.Angle) + dA) and 3].y; |
56 |
58 |
57 if (xx = 0) then |
59 if (xx = 0) then |
58 if TestCollisionYwithGear(Gear, yy) <> 0 then |
60 if TestCollisionYwithGear(Gear, yy) <> 0 then |
59 PrevAngle(Gear, dA) |
61 PrevAngle(Gear, dA) |
60 else |
62 else |
61 begin |
|
62 Gear^.Tag := 0; |
|
63 Gear^.Y := Gear^.Y + int2hwFloat(yy); |
|
64 if TestCollisionXwithGear(Gear, xxn) = 0 then |
|
65 begin |
63 begin |
66 Gear^.X := Gear^.X + int2hwFloat(xxn); |
64 Gear^.Tag := 0; |
67 NextAngle(Gear, dA) |
65 |
|
66 if TestCollisionXwithGear(Gear, xxn) <> 0 then |
|
67 Gear^.WDTimer:= 0; |
|
68 |
|
69 Gear^.Y := Gear^.Y + int2hwFloat(yy); |
|
70 if TestCollisionXwithGear(Gear, xxn) = 0 then |
|
71 begin |
|
72 Gear^.X := Gear^.X + int2hwFloat(xxn); |
|
73 NextAngle(Gear, dA) |
|
74 end |
68 end; |
75 end; |
69 end; |
|
70 |
76 |
71 if (yy = 0) then |
77 if (yy = 0) then |
72 if TestCollisionXwithGear(Gear, xx) <> 0 then |
78 if TestCollisionXwithGear(Gear, xx) <> 0 then |
73 PrevAngle(Gear, dA) |
79 PrevAngle(Gear, dA) |
74 else |
80 else |
75 begin |
|
76 Gear^.Tag := 0; |
|
77 Gear^.X := Gear^.X + int2hwFloat(xx); |
|
78 if TestCollisionYwithGear(Gear, yyn) = 0 then |
|
79 begin |
81 begin |
80 Gear^.Y := Gear^.Y + int2hwFloat(yyn); |
82 Gear^.Tag := 0; |
81 NextAngle(Gear, dA) |
83 |
|
84 if TestCollisionYwithGear(Gear, yyn) <> 0 then |
|
85 Gear^.WDTimer:= 0; |
|
86 |
|
87 Gear^.X := Gear^.X + int2hwFloat(xx); |
|
88 if TestCollisionYwithGear(Gear, yyn) = 0 then |
|
89 begin |
|
90 Gear^.Y := Gear^.Y + int2hwFloat(yyn); |
|
91 NextAngle(Gear, dA) |
|
92 end |
82 end; |
93 end; |
83 end; |
94 |
|
95 cakeStep:= Gear^.WDTimer < 4 |
84 end; |
96 end; |
85 |
97 |
86 end. |
98 end. |