XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
DqUaliTy

offline
Опыт: 1,076
Активность:
Проблема с заклинанием.
Помогите со спеллом , Дамми которого создаю летит не правельно , с эим то и проблема.
На счёт спелла , летит дамми юнит на таргет юнита . Так сказать всё.
Это не конец спелла если что дальше его буду улучшать , пока такой экземпляр.
Прикрепленные файлы
Тип файла: w3x Spell.w3x (13.6 Кбайт, 5 просмотров )
Старый 05.09.2011, 19:12
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
DqUaliTy, нафига там атан2 и вот это if(((xc-x)*(xc-x)+(yc-y)*(yc-y))<=14400)then? Тебе какое движение нужно? Просто что бы летело вперед?
Старый 05.09.2011, 19:40
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
» Код вылаживать лучше и быстрее ответят.
globals
boolexpr filter
unit filterunit
endglobals

function Trig_Spell_Conditions takes nothing returns boolean
return GetSpellAbilityId()=='A000'
endfunction

function Spell_A000_Filter takes nothing returns boolean
set filterunit=GetFilterUnit()
return IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()),GetOwningPlayer(filterunit)) and GetWidgetLife(filterunit)>=0.405 and not IsUnitType(filterunit,UNIT_TYPE_STRUCTURE) and not IsUnitType(filterunit,UNIT_TYPE_MAGIC_IMMUNE)
endfunction

function move takes nothing returns nothing
local timer t=GetExpiredTimer()
local integer h=GetHandleId(t)
local unit d=LoadUnitHandle(udg_H,h,1)
local unit u=LoadUnitHandle(udg_H,h,2)
local unit c=LoadUnitHandle(udg_H,h,3)
local real a=LoadReal(udg_H,h,4)
local real x=GetUnitX(d)
local real y=GetUnitY(d)
local real xc=GetUnitX(c)
local real yc=GetUnitY(c)
call SetUnitX(d,x+25.*Cos(a))
call SetUnitY(d,y+25.*Sin(a))
if(((xc-x)*(xc-x)+(yc-y)*(yc-y))<=14400)then
    call PauseTimer(t)
    call UnitDamageTarget(u,c,GetUnitAbilityLevel(u,'A000')*50.,true,false,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_NORM​AL,null)
    call RemoveUnit(d)
    call FlushChildHashtable(udg_H,h)
    call DestroyTimer(t)
endif
set t=null
set u=null
set d=null
endfunction

function Trig_Spell_Actions takes nothing returns nothing
local timer t=CreateTimer()
local integer h=GetHandleId(t)
local unit u=GetSpellAbilityUnit()
local real x=GetUnitX(u)
local real y=GetUnitY(u)
local unit c=GetSpellTargetUnit()
local unit d=CreateUnit(GetOwningPlayer(u),'n000',x,y,0.)
local real a=Atan2(GetUnitY(c)-GetUnitY(u),GetUnitX(c)-GetUnitX(u))
call SetUnitX(d,x+25.*Cos(a))
call SetUnitX(d,y+25.*Sin(a))
call SaveUnitHandle(udg_H,h,1,d)
call SaveUnitHandle(udg_H,h,2,u)
call SaveUnitHandle(udg_H,h,3,c)
call SaveReal(udg_H,h,4,a)
call TimerStart(t,0.03,true,function move)
set t=null
set u=null
set c=null
set d=null
endfunction

function InitTrig_Spell takes nothing returns nothing
local trigger trg=CreateTrigger()
set udg_H=InitHashtable()
call TriggerRegisterAnyUnitEventBJ(trg,EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(trg,Condition(function Trig_Spell_Conditions))
call TriggerAddAction(trg,function Trig_Spell_Actions)
call FogEnable(false)
call FogMaskEnable(false)
set filter=Condition(function Spell_A000_Filter)
set trg=null
endfunction
По коду - к чему эта псевдо-оптимизация?
» Вида
local real x=GetUnitX(u)
local real y=GetUnitY(u)
local unit c=GetSpellTargetUnit()
local unit d=CreateUnit(GetOwningPlayer(u),'n000',x,y,0.)
local real a=Atan2(GetUnitY(c)-GetUnitY(u),GetUnitX(c)-GetUnitX(u))
К чему этот угол? Тебе необходимо чтобы снаряд летел не в юнита а по прямой?
Вобщем сделал чтобы спел работал правильно,летел только в цель
» вот код
globals
boolexpr filter
unit filterunit
endglobals

function Trig_Spell_Conditions takes nothing returns boolean
return GetSpellAbilityId()=='A000'
endfunction

function Spell_A000_Filter takes nothing returns boolean
set filterunit=GetFilterUnit()
return IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()),GetOwningPlayer(filterunit)) and GetWidgetLife(filterunit)>=0.405 and not IsUnitType(filterunit,UNIT_TYPE_STRUCTURE) and not IsUnitType(filterunit,UNIT_TYPE_MAGIC_IMMUNE)
endfunction

function move takes nothing returns nothing
local timer t=GetExpiredTimer()
local integer h=GetHandleId(t)
local unit d=LoadUnitHandle(udg_H,h,1)
local unit u=LoadUnitHandle(udg_H,h,2)
local unit c=LoadUnitHandle(udg_H,h,3)
local real x=GetUnitX(d)
local real y=GetUnitY(d)
local real tx=GetUnitX(c)
local real ty=GetUnitY(c)
local real angle=Atan2(ty-y,tx-x)
local real distance=SquareRoot((tx - x) * (tx - x) + (ty - y) * (ty - y))
if distance<=10. then
    call PauseTimer(t)
    call DestroyTimer(t)
    call FlushChildHashtable(udg_H,h)
    call RemoveUnit(d)
    call UnitDamageTarget(u,c,GetUnitAbilityLevel(u,'A000')*50.,true,false,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_NORM​AL,null)
else
    call SetUnitX(d,x+25.*Cos(angle))
    call SetUnitY(d,y+25.*Sin(angle))
endif
set t=null
set u=null
set d=null
endfunction

function Trig_Spell_Actions takes nothing returns nothing
local timer t=CreateTimer()
local integer h=GetHandleId(t)
local unit u=GetSpellAbilityUnit()
local unit c=GetSpellTargetUnit()
local real x=GetUnitX(u)
local real y=GetUnitY(u)
local real tx=GetUnitX(c)
local real ty=GetUnitY(c)
local unit d=CreateUnit(GetOwningPlayer(u),'n000',x,y,0.)
call SaveUnitHandle(udg_H,h,1,d)
call SaveUnitHandle(udg_H,h,2,u)
call SaveUnitHandle(udg_H,h,3,c)
call TimerStart(t,0.03,true,function move)
set t=null
set u=null
set c=null
set d=null
endfunction

function InitTrig_Spell takes nothing returns nothing
local trigger trg=CreateTrigger()
set udg_H=InitHashtable()
call TriggerRegisterAnyUnitEventBJ(trg,EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(trg,Condition(function Trig_Spell_Conditions))
call TriggerAddAction(trg,function Trig_Spell_Actions)
call FogEnable(false)
call FogMaskEnable(false)
set filter=Condition(function Spell_A000_Filter)
set trg=null
endfunction
Старый 05.09.2011, 19:48
DqUaliTy

offline
Опыт: 1,076
Активность:
Я искал угол между моим героем и таргет юнитом , и по нему хотел двигать дамми .
Эх мне бы Джасс учителя :D
Щас посмотрим что будет...
Да надо чтобы летел в указоного юнито
DqUaliTy добавил:
Впринципе всё понятно , только объсни этот принцип .
local real distance=SquareRoot((tx - x) * (tx - x) + (ty - y) * (ty - y))
if distance<=10. then
Объясни как это )))
Старый 05.09.2011, 22:30
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
distance=SquareRoot((tx - x) * (tx - x) + (ty - y) * (ty - y)) - это расстояние между координатами,найденное по теореме Пифагора(если считать расстояние от нуля координат до координат х и у за катеты,то расстояние между координатами - гипотенуза.
Потом если расстояние меньше определенного числа - значит снаряд долетел - значит делаем нужные действия.

Отредактировано Nerevar, 05.09.2011 в 22:55.
Старый 05.09.2011, 22:40
DqUaliTy

offline
Опыт: 1,076
Активность:
СПасибо ))
Можно закрывать тему
Старый 05.09.2011, 22:46
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 04:02.