93 EnableTexture(true); |
93 EnableTexture(true); |
94 end |
94 end |
95 end; |
95 end; |
96 |
96 |
97 |
97 |
98 function DrawRopeLine(X1, Y1, X2, Y2, roplen: LongInt; LayerIndex: Longword): LongInt; |
98 procedure DrawRopeLine(X1, Y1, X2, Y2: Real; LayerIndex: Longword; var linesLength, ropeLength: Real); |
99 var eX, eY, dX, dY: LongInt; |
99 var dX, dY, angle, length: Real; |
100 i, sX, sY, x, y, d: LongInt; |
100 FrameIndex: LongWord; |
101 b: boolean; |
|
102 angle: real; |
|
103 begin |
101 begin |
104 if (X1 = X2) and (Y1 = Y2) then |
102 if (X1 = X2) and (Y1 = Y2) then |
105 begin |
103 exit; |
106 //OutError('WARNING: zero length rope line!', false); |
104 |
107 DrawRopeLine:= 0; |
|
108 exit |
|
109 end; |
|
110 eX:= 0; |
|
111 eY:= 0; |
|
112 dX:= X2 - X1; |
105 dX:= X2 - X1; |
113 dY:= Y2 - Y1; |
106 dY:= Y2 - Y1; |
|
107 length:= sqrt(sqr(dX) + sqr(dY)); |
114 angle:= arctan2(dY, dX) * 180 / PI - 90; |
108 angle:= arctan2(dY, dX) * 180 / PI - 90; |
115 |
109 |
116 if (dX > 0) then |
110 dX:= dX / length; |
117 sX:= 1 |
111 dY:= dY / length; |
118 else |
112 |
119 if (dX < 0) then |
113 while (ropeLength - linesLength) <= length do |
120 begin |
114 begin |
121 sX:= -1; |
115 FrameIndex:= round(ropeLength / cRopeNodeStep); |
122 dX:= -dX |
116 if (FrameIndex mod cRopeLayers) = LayerIndex then |
123 end |
117 DrawSpriteRotatedFReal(sprRopeNode, |
124 else sX:= dX; |
118 X1 + (ropeLength - linesLength) * dX, |
125 |
119 Y1 + (ropeLength - linesLength) * dY, |
126 if (dY > 0) then |
120 FrameIndex, 1, angle); |
127 sY:= 1 |
121 ropeLength:= ropeLength + cRopeNodeStep; |
128 else |
|
129 if (dY < 0) then |
|
130 begin |
|
131 sY:= -1; |
|
132 dY:= -dY |
|
133 end |
|
134 else |
|
135 sY:= dY; |
|
136 |
|
137 if (dX > dY) then |
|
138 d:= dX |
|
139 else |
|
140 d:= dY; |
|
141 |
|
142 x:= X1; |
|
143 y:= Y1; |
|
144 |
|
145 for i:= 0 to d do |
|
146 begin |
|
147 inc(eX, dX); |
|
148 inc(eY, dY); |
|
149 b:= false; |
|
150 if (eX > d) then |
|
151 begin |
|
152 dec(eX, d); |
|
153 inc(x, sX); |
|
154 b:= true |
|
155 end; |
|
156 if (eY > d) then |
|
157 begin |
|
158 dec(eY, d); |
|
159 inc(y, sY); |
|
160 b:= true |
|
161 end; |
|
162 if b then |
|
163 begin |
|
164 inc(roplen); |
|
165 if (roplen mod (cRopeNodeStep * cRopeLayers)) = (cRopeNodeStep * LayerIndex) then |
|
166 DrawSpriteRotatedF(sprRopeNode, x, y, roplen div cRopeNodeStep, 1, angle); |
|
167 end |
|
168 end; |
122 end; |
169 DrawRopeLine:= roplen; |
123 linesLength:= linesLength + length |
170 end; |
124 end; |
171 |
125 |
172 procedure DrawRopeLayer(Gear: PGear; LayerIndex: LongWord); |
126 procedure DrawRopeLayer(Gear: PGear; LayerIndex: LongWord); |
173 var roplen, i: LongInt; |
127 var i: LongInt; |
|
128 linesLength, ropeLength: Real; |
174 begin |
129 begin |
175 roplen:= 0; |
130 linesLength:= 0; |
|
131 ropeLength:= cRopeNodeStep; |
176 if RopePoints.Count > 0 then |
132 if RopePoints.Count > 0 then |
177 begin |
133 begin |
178 i:= 0; |
134 i:= 0; |
179 while i < Pred(RopePoints.Count) do |
135 while i < Pred(RopePoints.Count) do |
180 begin |
136 begin |
181 roplen:= DrawRopeLine(hwRound(RopePoints.ar[i].X) + WorldDx, hwRound(RopePoints.ar[i].Y) + WorldDy, |
137 DrawRopeLine(hwFloat2Float(RopePoints.ar[i].X) + WorldDx, hwFloat2Float(RopePoints.ar[i].Y) + WorldDy, |
182 hwRound(RopePoints.ar[Succ(i)].X) + WorldDx, hwRound(RopePoints.ar[Succ(i)].Y) + WorldDy, roplen, LayerIndex); |
138 hwFloat2Float(RopePoints.ar[Succ(i)].X) + WorldDx, hwFloat2Float(RopePoints.ar[Succ(i)].Y) + WorldDy, |
|
139 LayerIndex, linesLength, ropeLength); |
183 inc(i) |
140 inc(i) |
184 end; |
141 end; |
185 roplen:= DrawRopeLine(hwRound(RopePoints.ar[i].X) + WorldDx, hwRound(RopePoints.ar[i].Y) + WorldDy, |
142 |
186 hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, roplen, LayerIndex); |
143 DrawRopeLine(hwFloat2Float(RopePoints.ar[i].X) + WorldDx, hwFloat2Float(RopePoints.ar[i].Y) + WorldDy, |
187 roplen:= DrawRopeLine(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, |
144 hwFloat2Float(Gear^.X) + WorldDx, hwFloat2Float(Gear^.Y) + WorldDy, |
188 hwRound(Gear^.Hedgehog^.Gear^.X) + WorldDx, hwRound(Gear^.Hedgehog^.Gear^.Y) + WorldDy, roplen, LayerIndex); |
145 LayerIndex, linesLength, ropeLength); |
|
146 |
|
147 DrawRopeLine(hwFloat2Float(Gear^.X) + WorldDx, hwFloat2Float(Gear^.Y) + WorldDy, |
|
148 hwFloat2Float(Gear^.Hedgehog^.Gear^.X) + WorldDx, hwFloat2Float(Gear^.Hedgehog^.Gear^.Y) + WorldDy, |
|
149 LayerIndex, linesLength, ropeLength); |
189 end |
150 end |
190 else |
151 else |
191 if Gear^.Elasticity.QWordValue > 0 then |
152 if Gear^.Elasticity.QWordValue > 0 then |
192 roplen:= DrawRopeLine(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, |
153 DrawRopeLine(hwFloat2Float(Gear^.X) + WorldDx, hwFloat2Float(Gear^.Y) + WorldDy, |
193 hwRound(Gear^.Hedgehog^.Gear^.X) + WorldDx, hwRound(Gear^.Hedgehog^.Gear^.Y) + WorldDy, roplen, LayerIndex); |
154 hwFloat2Float(Gear^.Hedgehog^.Gear^.X) + WorldDx, hwFloat2Float(Gear^.Hedgehog^.Gear^.Y) + WorldDy, |
|
155 LayerIndex, linesLength, ropeLength); |
194 end; |
156 end; |
195 |
157 |
196 procedure DrawRope(Gear: PGear); |
158 procedure DrawRope(Gear: PGear); |
197 var i: LongInt; |
159 var i: LongInt; |
198 begin |
160 begin |