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
Da Wasserfälle ja niemanden ansehen können (LookAt), oder sich auch nicht drehen können (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