[[http://www.siedler-games.de|{{:sg-link.jpg|}}]]
==== Winkel zwischen zwei Punkten ====
[[http://www.siedler-portal.de/vb3/sendmessage.php?do=mailmember&u=2060|Robert]]
Diese Funktion gibt den Winkel zwischen zwei Punkten an.
Die Parameter (_Pos1,_Pos2) können sowohl Punkte, Entity_Name oder auch Entity_ID sein.
Rückgabe ist der Winkel in Grad. Siehe Anwendungsbeispiel.
function Winkel(_Pos1,_Pos2)
local delta_X = 0;
local delta_Y = 0;
local alpha = 0
if type (_Pos1) == "string" or type (_Pos1) == "number" then
_Pos1 = GetPosition(GetEntityId(_Pos1));
end
if type (_Pos2) == "string" or type (_Pos2) == "number" then
_Pos2 = GetPosition(GetEntityId(_Pos2));
end
delta_X = _Pos1.X - _Pos2.X
delta_Y = _Pos1.Y - _Pos2.Y
if delta_X == 0 and delta_Y == 0 then -- Gleicher Punkt
return 0
end
alpha = math.deg(math.asin(math.abs(delta_X)/(math.sqrt(__pow(delta_X, 2)+__pow(delta_Y, 2)))))
if delta_X >= 0 and delta_Y > 0 then
alpha = 270 - alpha
elseif delta_X < 0 and delta_Y > 0 then
alpha = 270 + alpha
elseif delta_X < 0 and delta_Y <= 0 then
alpha = 90 - alpha
elseif delta_X >= 0 and delta_Y <= 0 then
alpha = 90 + alpha
end
return alpha
end
=== Anwendungsbeispiel ===
Da Wasserfälle ja niemanden ansehen können ([[reference:LookAt]]), oder sich auch nicht drehen können ([[reference:RotateEntity]]), ich aber wollte, daß sie das tun, habe ich diese Funktion oben geschrieben. Einfach den Bauern in die Nähe des Wasserfalls bringen. Es gibt vielleicht auch sinnvolle Anwendungen dafür.
-- dies hier in die FirstMapAction
nBauer=CreateEntity (1,Entities.PU_Serf,{X=19000,Y=19000},"Bauer")
nIDWasserfall=Logic.CreateEntity( Entities.XD_Waterfall4, 19500, 19500, 0, 1 )
for i = 1 ,10 do
Logic.CreateEntity( Entities.XD_Waterfall4, 19500+i*40, 19500, 0, 1 )
end
StartSimpleJob("Nassmachen")
-- bis hier
function Nassmachen()
if IsNear("Bauer",nIDWasserfall,400) then
DestroyEntity(nIDWasserfall)
nIDWasserfall=Logic.CreateEntity( Entities.XD_Waterfall4, 19500, 19500, Winkel({X=19500, Y=19500},"Bauer")+90, 1 )
end
end