TMap.RayCast
function RayCast(x1, y1, x2, y2: Single; Player, Flag, Bullet, CheckCollider: Boolean; Team: Byte): Boolean x1,y1: Coordinates of a starting point x2,y2: Coordinates of another point Player: if TRUE, Player collide polygons will be checked Flag: if TRUE, Flag collide polygons will be checked Bullet: if TRUE, Bullet collide polygons will be checked CheckCollider: if TRUE, colliders will be checked Team: if Player or Flag are TRUE, Team defines which team colliders are checked Result: FALSE if there are no colliders between the points, TRUE if there are
Description
This function will check whether there are colliders between two coordinates on the map.
Example
Below example check whether there is vision between a specified point and a player.
Works only for player with ID = 1.
To define 1st point, type "mark". To stop displaying, type "stop".
const
TICKINTERVAL = 4;
var
newObj: TNewMapObject;
newX,newY: single;
pX,pY: single;
lastObj: byte;
count: integer;
procedure OnTick(t: integer);
begin
// create new object if X,Y not 0;
if newX <> 0 then
begin
newObj := TNewMapObject.Create;
newObj.Style := 16;
newObj.X := newX;
newObj.Y := newY;
if lastObj > 0 then
if Map.Objects[lastObj].Active then
Map.Objects[lastObj].Kill;
lastObj := Map.AddObject(newObj).ID;
newObj.Free;
end;
// display result in bigtext for player 1
if Players[1].Active then
begin
if newX <> 0 then
begin
pX := Players[1].X;
pY := Players[1].Y;
try
if Map.RayCast(newX,newY,pX,pY,FALSE,FALSE,FALSE,FALSE,1) then
Players[1].BigText(11,inttostr(count)+': TRUE',200,$FFFFFF,0.08,100,100)
else
Players[1].BigText(11,inttostr(count)+': FALSE',200,$FFFFFF,0.08,100,100);
except
Players[1].BigText(11,inttostr(count)+': ERROR',200,$FF0000,0.08,100,100);
break;
end;
count := count + 1;
end;
end
else // stop if player became inactive
newX := 0;
end;
procedure OnSpeak(P: TActivePlayer; Text: string);
begin
if lowercase(Text) = 'mark' then
begin
newX := P.X;
newY := P.Y;
P.BigText(10,'Done',200,$666666,0.08,100,80);
end
else if lowercase(Text) = 'stop' then
begin
newX := 0;
newY := 0;
if lastObj > 0 then
if Map.Objects[lastObj].Active then
Map.Objects[lastObj].Kill;
count := 1;
end;
end;
begin
newX := 0;
newY := 0;
lastObj := 0;
count := 1;
Game.OnClockTick := @OnTick;
Game.TickThreshold := TICKINTERVAL;
Players[1].OnSpeak := @OnSpeak;
end.