Hares
полупротосс
offline
Опыт:
6,966Активность: |
Помогите, пожалуйста. Делаю ф-ю, чтоб юнита по параболе бросало.
я рассчитал ур-е той самой параболы, а именно: (-4h/(d^2))x(x-d), где d - дистанция полёта, а h - его высота.
Самое смешное - все сообщения выдают, что юнит не только подлетает, но и смещается в заданном направлении. Ну, с полётом мне более или менее понятно, там надо дать способность полёта. Но почему он тупо стоит на месте? [+] замечание от Hanabishi: 4.3 (археология)
|
23.05.2011, 20:09 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
карту не качал пока.
скорость юнита больше 0?
алсо, нехендловые переменные обнулять не надо + конструкция типа Value == false убога, юзай not Value.
Doc добавил: и что за ужас, полледвэйты омг, локейшены, кто вас учил такое делать? |
23.05.2011, 20:51 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Helpmeplz
offline
Опыт:
11,698Активность: |
полледвейт в цикле :facepalm:, утечки, локации, обнуление вещественных
делай через координаты, таймер и хеш таблицу в барахолке куча наработок |
23.05.2011, 21:02 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
FKoFF
Venomancer 89lvl. Europe
offline
Опыт:
5,975Активность: |
((код jass
function Polar takes location Loc, real Distance, real Angle returns location
return Location(GetLocationX(Loc) + Distance * CosBJ(Angle), GetLocationY(Loc) + Distance * SinBJ(Angle)) endfunction )) бог ты мой, you made my day :D
а если серьезно то эта функция - просто эпический фейл, мало того что ни один джассер не использует локации ибо они абсолютно не нужны при работе с любыми объектами, так еще ведь проблема что эта функция создает еще одну локацию, тогда как самым разумным вариантом было бы сместить локацию, которую функция берет как аргумент. Но это еще не все. Ржака заключается в том числе еще и в том что в итоге локация работает на бж функциях, а это вдвойне ужасно.
ладно, ржаку словили, пора бы и помочь юзверю, объяснив все ошибки и подробно поглумившись над его действиями.
Я не знаю кто, когда и зачем дал автору в руки учебник "как строить спеллы на ГУИ" где рассказывалось что в циклах надо использовать вейты, что арка получается по формуле
((код jass
set y = GetY(a, -a*d, 0, x)
a * x * x + b * x + c )) в общем то математические способности автора поражают не на шутку когда речь заходит о построении "параболы", но глум глумом , а здесь то помочь можно.
((код jass
function GetArc takes real mh, real md, real cd returns real
return ( ( ( 4.00 * mh ) / md ) * ( ( md - cd ) * ( cd / md ) ) ) mh = max height, md = max distance, cd=current distance endfunction )) Ну да впрочем ладно, здесь есть что обсуждать.
((код jass
set udg_Index[0] = udg_Index[0] + 1
call SaveUnitHandle(udg_Jump, 0, udg_Index[0], Target) call SaveReal(udg_Jump, 1, udg_Index[0], Distance) call SaveReal(udg_Jump, 2, udg_Index[0], Height) call SaveReal(udg_Jump, 3, udg_Index[0], Angle) call SaveReal(udg_Jump, 4, udg_Index[0], Time) call TriggerExecute( gg_trg_Jump ) )) Парень, а ты не шутишь? на кой черт тебе сдался этот массив? Где же тот сенсей, что б его подняло да прихлопнуло, который тебя учил так обращаться с хэш-таблицами? Да и еще - какого, простите, инфернального члена я вижу отдельную хэш-таблицу для спелла? Знаешь ли ты что хэш-таблицы - самые тяжелые объекты в игре и большое их количество просто выбивает игру фаталом?
*глаза идут ниже и упираются в функцию call SetUnitPositionLoc(Target, Polar(GetUnitLoc(Target), d / Time * Periodic, Angle))*
Дружище, а ты не тролль? Зачем использовать джасс даже не удаляя утечки?
*увидел PolledWait*
Это не говнокодер, и не быдлокодер, и даже не индус, это, черт его дери, всадник апокалипсиса!
Одно дело когда нубогуишник выкладывает конверт триггера в джасс, и кодер офигивает от увиденного кошмара, другое дело когда выкладывают вроде бы осмысленный джасс код, а видим мы нечто срашнее чем конвертированный гуи. впрочем ладно, хватит говорить гадости...
((код jass
function SimpleJumpcb takes nothing returns nothing
local timer t=GetExpiredTimer() local integer ti=GetHandleId(t) local unit u=LoadUnitHandle(udg_Data,ti,0) local real x2=LoadReal(udg_Data,ti,1) local real y2=LoadReal(udg_Data,ti,2) local real mh=LoadReal(udg_Data,ti,3) local real speed=LoadReal(udg_Data,ti,4) local real md=LoadReal(udg_Data,ti,5) local real cd=LoadReal(udg_Data,ti,6) local real x1=GetWidgetX(u) local real y1=GetWidgetY(u) local real angle=bj_RADTODEG * Atan2(y2 - y1, x2 - x1) if cd<md then
call SetUnitPosition(u,x1+speed*Cos(angle*bj_DEGTORAD),y1+speed*Sin(angle*bj_DEGTORAD)) call SetUnitFlyHeight(u,( ( ( 4.00 * mh ) / md ) * ( ( md - cd ) * ( cd / md ) ) ),0.03) set cd=cd+speed call SaveReal(udg_Data,ti,6,cd) else call RemoveSavedHandle(udg_Data,ti,0) call FlushChildHashtable(udg_Data,ti) call DestroyTimer(t) call SetUnitPathing(u,true) call UnitRemoveAbility(u,'Aave') call PauseUnit(u,false) endif set t=null
set u=null endfunction function SimpleJump takes unit u, real targx, real targy, real height, real speed returns nothing
local timer t=CreateTimer() local integer ti=GetHandleId(t) call PauseUnit(u,true)
call SetUnitPathing(u,false) call UnitAddAbility(u,'Aave') call SaveUnitHandle(udg_Data,ti,0,u) call SaveReal(udg_Data,ti,1,targx) call SaveReal(udg_Data,ti,2,targy) call SaveReal(udg_Data,ti,3,height) call SaveReal(udg_Data,ti,4,speed) call SaveReal(udg_Data,ti,5,SquareRoot((targx-GetWidgetX(u)) * (targx-GetWidgetX(u)) + (targy-GetWidgetY(u)) * (targy-GetWidgetY(u)))) call SaveReal(udg_Data,ti,6,0) call TimerStart(t,0.03,true,function SimpleJumpcb) set t=null endfunction )) unit u - юнит который должен сигануть real targx - конечная точка по оси X real targy - конечноая точка по оси Y real height - понятное дело, максимальная высота для дуги real speed - скорость с которой юнит будет двигаться. |
24.05.2011, 01:44 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Helpmeplz
offline
Опыт:
11,698Активность: |
FKoFF, не проще ли движение задавать временем, расстоянием и углом, вместо координат и скорости. в таком случае перед движением придется вычислить лишь угол.
а у тебя мало того, что все равно придется вычислять угол, так еще надо находить координаты. не говоря уже про расчет скорости с учетом периода 0.03 с. угол и смещение можно посчитать единожды для юнита и сразу сохранить в хеш-таблицу, а не производить это 33.(3) раза в секунду |
24.05.2011, 10:55 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Nekit1234007
offline
Опыт:
11,916Активность: |
Векторы <3 |
24.05.2011, 13:10 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
FKoFF
Venomancer 89lvl. Europe
offline
Опыт:
5,975Активность: |
Helpmeplz:
так тоже можно, однако мне конкретно приглянулся вариант с координатами. Helpmeplz:
Что мешает дописать один SaveReal? и один LoadReal? Helpmeplz: мне кажется или кто то палится? Скорость с учетом такого периода расчитывается на раз-два, достаточно знать что 10 = 333, 15 = 500, 20 = 666, это запомнить и исходя из этого мыслить, как мне кажется, достаточно просто. Helpmeplz:
смещение в любом случае записывается Helpmeplz:
никогда не думал что формулы хоть сколько-то нагружают систему, это тебе не объекты. |
24.05.2011, 13:45 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hares
полупротосс
offline
Опыт:
6,966Активность: |
И всё равно не работает |
31.05.2011, 15:13 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|