Это некоторые мои функций которые я часто использую в своих картах:
DistanceBetweenCoords. Находит расстояние между заданными координатами.
Code
function DistanceBetweenCoords takes real x1, real y1, real x2, real y2 returns real return SquareRoot((x1-x2) * (x1-x2) + (y1-y2) * (y1-y2)) endfunction
AngleBetweenCoords.Находит угол между заданными координатами.
Code
function AngleBetweenCoords takes real xa, real xb, real ya, real yb returns real return 57.295827 * Atan2(yb - ya, xb - xa) endfunction
Функция для того чтобы при использования движения юнита триггерно, юнит не выходил за пределы карты.
Code
function RectX takes real x returns real local real xm = GetRectMinX(bj_mapInitialPlayableArea)+50 if(x<xm)then return xm endif set xm = GetRectMaxX(bj_mapInitialPlayableArea)-50 if(x>xm)then return xm endif return x endfunction
function RectY takes real y returns real local real ym = GetRectMinY(bj_mapInitialPlayableArea)+50 if(y<ym)then return ym endif set ym = GetRectMaxY(bj_mapInitialPlayableArea)-50 if(y>ym)then return ym endif return y endfunction
Возраждения героя.
Code
function ReviveHeroTimed_Child eakes nothing returns nothing local timer t = GetExpiredTimer() local unit hero = LoadUnitHandle(udg_Hashtable,GetHandleId(t),0) local real x = LoadReal(udg_Hashtable,GetHandleId(t),1) local real y = LoadReal(udg_Hashtable,GetHandleId(t),2) local boolean show = LoadBoolean(udg_Hashtable,GetHandleId(t),3) call ReviveHero(hero,x,y,show) call FludhChildHashtable(udg_Hashtable,GetHandleId(t)) call DestroyTimer(t) set hero = null set t = null endfunction
function ReviveHeroTimed takes unit hero, real time, real x, real y, boolean doEyeCandy returns nothing local timer t = CreateTimer() call TimerStart(t,time,false,function ReviveHeroTimed_Child) call SaveUnitHandle(udg_Hashtable,GetHandleId(t),0,hero) call SaveReal(udg_Hashtable,GetHandleId(t),1,x) call SaveReal(udg_Hashtable,GetHandleId(t),2,y) call SaveBoolean(udg_Hashtable,GetHandleId(t),3,doEyeCandy) set t = null endfunction
Думаешь каждый нуб знает cJass? Ему и хватает Jass'a.
я наверно раскрою великую тайну, но чтобы использовать ту функцию достаточно просто ее копировать и использовать как обычную функцию жасса, никакие знания сжасс ненужны...
Quote (|DS|)
Действует так:
на вызов любой функции тратится время, у тебя 2 выходит у меня 1... и ненадо мне рассказывать что времени тратится мало, во первых при большом количестве "летательных" юнитов эт важно, во вторых это полюбому не повод делать хуже...
и еще каждый раз вызывать GetRectMinX(bj_mapInitialPlayableArea) и тд....
Моя функция быстрее, если передвигается 1 юнит, а твоя при 2ых и более.
дык функции по сути одинаковые (ну за исключением того, что у меня юнит когда наткнется на конец карты остановится, а у тебя по краю до угла ползти продолжит), у твоей проблема только одна по которой быстрее она быть неможет, а именно потому что их две <_< короче если вместо RectX и RectY сделать RectXY (надеюсь мысль ясна) будет ок
Кстати полярник для тех у кого нету JNGP (непонятно зачем таким жасс...) или кто сильно боится сжасса:
Code
function PolarUnit takes unit u, real angle, real dist return boolean local real x=GetUnitX(u)+dist*Cos(angle) local real y=GetUnitY(u)+dist*Sin(angle) if ((x>GetRectMinX(bj_mapInitialPlayableArea))&&(x<GetRectMaxX(bj_mapInitialPlayableArea))&&(y>GetRectMinY(bj_mapInitialPlayableArea))&&(y<GetRectMaxY(bj_mapInitialPlayableArea))) then return false else call SetUnitX(u,x) call SetUnitY(u,y) return true endif endfunction
Внимание XD супер функция) для того что-бы камера не проходила сквозь холмы)
Code
local location loc local real HeroZ set loc = (GetUnitLoc(udg_Hero)) set HeroZ = GetLocationZ(loc) call SetCameraFieldForPlayer( Player(0), CAMERA_FIELD_ZOFFSET, HeroZ, 0 )
Всё это я сделал сам, создав 6 мап в которых разные триггерные действия) я это в личный сценарий запихал и работаетБоло. Хочешь болосмайлы? их много xD пиши в ЛС!
AncientPenguin, vJASS и классический жасс разные вещи, последнее в свою очередь лучше первого, по многим причинам, к ним относятся и понимание кода функции, без каких либо констант-глобал и других различных функций. В cJASS всё намного проще, и сложнее одновременно. а vJASS сделали для лентяев которым влом учить cJASS.
void NTI(unit u,item i,player p,int lvl,string msg) { int id=0 if GetItemLevel(i) == lvl { whilenot id>6 { if GetItemLevel(UnitItemInSlot(u,id-1)) == lvl and UnitItemInSlot(u,id-1) != i { SetItemDropID(i, GetUnitTypeId(u)) CreateItem(GetItemTypeId(i),GetWidgetX(u),GetWidgetY(u)) DisplayTextToPlayer(p,0 ,0,m sg) } id++ } } u=null i=null p=n ull }
надо ведь было ему написать NULL раздельно, а особенно в vJASS. И насколько я помню, аргументы, переданные из первой вызова функции(действия) для другой, обнулять не надо, они сами обнуляются, или это в vJASS лишний гемор обнулять арг.-переменные?Мои статьи: 1. http://wc3-maps.ru/forum/78-1507-1 Школа тригеростроения, ГУИ. http://wc3-maps.ru/forum/99-1471-1