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

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

Ответ
 
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,146
Активность:
MegaBlax, да это код для изучения глазами, а не для вставки в редактор, я не на компе, писал на коленях, потому тут не сделан триггер, событие и т. д. но суть думаю понять можно
Старый 16.06.2013, 11:44
MegaBlax

offline
Опыт: 2,352
Активность:
Sargaraser, можешь оъяснить как передвинуть юнита на определенное растояние через SetUnitX() SetUnitY()
Старый 16.06.2013, 11:50
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,146
Активность:
MegaBlax,
local unit u
local real dist = 0
local real angle = 0
local real x = GetUnitX(u) + dist * Cos(angle * bj_DEGTORAD)
local real y = GetUnitY(u) + dist * Sin(angle * bj_DEGTORAD)
call SetUnitX(u, x)
call SetUnitY(u, y)
u = твой юнит, dist = твоя дистанция на которую двигать, angle угол куда двигать(в градусах)
Sargaraser добавил:
это все есть ещё в статьях Сергея -_-
Старый 16.06.2013, 11:53
MegaBlax

offline
Опыт: 2,352
Активность:
там что-то вроде этого да?
((кат
((код jass
local unit u = GetTriggerUnit()
local real x = GetUnitX(u)
local real y = GetUnitY(u)
local real xx = x + dist * Cos(angle * bj_DEGTORAD)
local real yy = y + dist * Sin(angle * bj_DEGTORAD)
))
))
MegaBlax добавил:
а еще должна быть вот такая проверк вроде?
((кат
((код jass
globals
real Game_MaxX
real Game_MinX
real Game_MaxY
real Game_MinY
endglobals
function SetUpSafeXY takes nothing returns nothing
set Game_MaxX = GetRectMaxX(bj_mapInitialPlayableArea)-50.
set Game_MinX = GetRectMinX(bj_mapInitialPlayableArea)+50.
set Game_MaxY = GetRectMaxY(bj_mapInitialPlayableArea)-50.
set Game_MinY = GetRectMinY(bj_mapInitialPlayableArea)+50.
endfunction
function SafeX takes real x returns real
if x<Game_MinX then
return Game_MinX
elseif x>Game_MaxX then
return Game_MaxX
endif
return x
endfunction
function SafeY takes real y returns real
if y<Game_MinY then
return Game_MinY
elseif y>Game_MaxY then
return Game_MaxY
endif
return y
endfunction
))
))
Старый 16.06.2013, 11:57
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,146
Активность:
MegaBlax, да все верно
Старый 16.06.2013, 11:58
MegaBlax

offline
Опыт: 2,352
Активность:
Да блин, что не так то?! Почему после xx и yy ничего уже дальше не пашет?!
((кат
((код jass
local real x = GetUnitX(u)
local real y = GetUnitY(u)
local real xx = SafeX(x+d*Cos(a))
local real yy = SafeY(y+d*Sin(a))
))
))
((кат
((код jass
globals
real minX
real minY
real maxX
real maxY
endglobals
function SafeXY takes nothing returns nothing
set minX = GetRectMinX(bj_mapInitialPlayableArea)+50.
set minY = GetRectMinY(bj_mapInitialPlayableArea)+50.
set maxX = GetRectMaxX(bj_mapInitialPlayableArea)-50.
set maxY = GetRectMaxY(bj_mapInitialPlayableArea)-50.
endfunction
function SafeX takes real x returns real
if x<minX then
return minX
elseif x>maxX then
return maxX
endif
return x
endfunction
function SafeY takes real y returns real
if y<minY then
return minY
elseif y>maxY then
return maxY
endif
return y
endfunction
))
))
Старый 16.06.2013, 13:14
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,146
Активность:
MegaBlax, вот используй это, делал на 1 апреля) но все-таки суть там ясна, параллельные массивы там не используются, но нужны тебе не они, а сам безопасный рект
Старый 16.06.2013, 13:21
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
Sargaraser, у мегаблакса куда адекватнее система, чем отлов всех юнитов.
Старый 16.06.2013, 13:27
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,146
Активность:
Clamp, ты о чем конкретно? какой отлов?
Sargaraser добавил:
можно делать и так как он сделал, просто в функции на периодике я бы использовал всего один таймер
Старый 16.06.2013, 13:36
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
Я про проверку через SafeX/Y
А так да, в периодик мувенте только 1 таймер стоит использовать
Старый 16.06.2013, 13:38
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,146
Активность:
Clamp, да я думаю там проверка вовсе не нужна, ведь спел должен двигать кастера назад во времени на то место где он стоял, и тут вопрос, как этот таракан попадет за границы карты, если фиксируется только то место где он и так стоял?
Sargaraser добавил:
SafeX/Y нужно только для движения разнообразных даммиков в периодике снаряды там и т.д.
Старый 16.06.2013, 13:41
MegaBlax

offline
Опыт: 2,352
Активность:
Sargaraser, я уже о другом спрашивал, мне именно нужно было движение.
MegaBlax добавил:
Ну-ка гляньте,
((кат
((код jass
globals
hashtable gc = InitHashtable()
endglobals
function SX takes real ux returns real
if ux > GetRectMaxX(bj_mapInitialPlayableArea)then
return GetRectMaxX(bj_mapInitialPlayableArea)
elseif ux < GetRectMinX(bj_mapInitialPlayableArea)then
return GetRectMinX(bj_mapInitialPlayableArea)
else
return ux
endif
endfunction
function SY takes real uy returns real
if uy > GetRectMaxY(bj_mapInitialPlayableArea)then
return GetRectMaxY(bj_mapInitialPlayableArea)
elseif uy < GetRectMinY(bj_mapInitialPlayableArea)then
return GetRectMinY(bj_mapInitialPlayableArea)
else
return uy
endif
endfunction
function Trig_FS_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A000'
endfunction
function Move takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer i = GetHandleId(t)
local unit u = LoadUnitHandle(gc,i,1)
local integer c = LoadInteger(gc,i,2)
local real d = 60.
local real a = GetUnitFacing(u)
local real x = GetUnitX(u)+d*Cos(a*bj_DEGTORAD)
local real y = GetUnitY(u)+d*Sin(a*bj_DEGTORAD)
if(c!=10)then
set c = c + 1
call SetUnitX(u,SX(x))
call SetUnitY(u,SX(y))
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\FlakCannons\\FlakTarget.mdl",x,y​))
call SaveInteger(gc,i,2,c)
else
call PauseTimer(t)
call DestroyTimer(t)
endif
set t = null
set u = null
endfunction
function Trig_FS_Actions takes nothing returns nothing
local timer t = CreateTimer()
local integer i = GetHandleId(t)
local unit u = GetSpellTargetUnit()
local integer c = 0
if(GetSpellTargetItem()!=null)then
set u = GetTriggerUnit()
endif
call SaveUnitHandle(gc,i,1,u)
call SaveInteger(gc,i,2,c)
call TimerStart(t,.03,true,function Move)
set t = null
set u = null
endfunction
function InitTrig_FS takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t,EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(t,Condition (function Trig_FS_Conditions))
call TriggerAddAction(t,function Trig_FS_Actions)
set t =null
endfunction
))
))
Двигает юнита вперед на 600 едениц.
MegaBlax добавил:
Ну и кто скаже как этой системой пользоваться?! Где писать SafeX/Y
((кат
((код jass
globals
real Game_MaxX
real Game_MinX
real Game_MaxY
real Game_MinY
hashtable gc = InitHashtable()
endglobals
function SetUpSafeXY takes nothing returns nothing
set Game_MaxX = GetRectMaxX(bj_mapInitialPlayableArea)-50.
set Game_MinX = GetRectMinX(bj_mapInitialPlayableArea)+50.
set Game_MaxY = GetRectMaxY(bj_mapInitialPlayableArea)-50.
set Game_MinY = GetRectMinY(bj_mapInitialPlayableArea)+50.
endfunction
function SafeX takes real x returns real
if x<Game_MinX then
return Game_MinX
elseif x>Game_MaxX then
return Game_MaxX
endif
return x
endfunction
function SafeY takes real y returns real
if y<Game_MinY then
return Game_MinY
elseif y>Game_MaxY then
return Game_MaxY
endif
return y
endfunction
))
))
Старый 16.06.2013, 13:53
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,146
Активность:
да правильно, только не знаю звчем перед уничтожением таймер паузить)
Старый 16.06.2013, 13:56
MegaBlax

offline
Опыт: 2,352
Активность:
Sargaraser, так, чисто формальности :)
Так все врубился где-что писать. Вот готово!
((кат
((код jass
function Trig_FS_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A000'
endfunction
function Move takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer i = GetHandleId(t)
local unit u = LoadUnitHandle(gc,i,1)
local integer c = LoadInteger(gc,i,2)
local real d = 60.
local real a = GetUnitFacing(u)
local real x = GetUnitX(u)
local real y = GetUnitY(u)
local real xx
local real yy
if(c!=10)then
set c = c + 1
set xx = SafeX(x+d*Cos(a*bj_DEGTORAD))
set yy = SafeY(y+d*Sin(a*bj_DEGTORAD))
call SetUnitX(u,xx)
call SetUnitY(u,yy)
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\FlakCannons\\FlakTarget.mdl",x,y​))
call SaveInteger(gc,i,2,c)
else
call PauseTimer(t)
call DestroyTimer(t)
endif
set t = null
set u = null
endfunction
function Trig_FS_Actions takes nothing returns nothing
local timer t = CreateTimer()
local integer i = GetHandleId(t)
local unit u = GetSpellTargetUnit()
local integer c = 0
if(GetSpellTargetItem()!=null)then
set u = GetTriggerUnit()
endif
call SaveUnitHandle(gc,i,1,u)
call SaveInteger(gc,i,2,c)
call TimerStart(t,.03,true,function Move)
set t = null
set u = null
endfunction
function InitTrig_FS takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t,EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(t,Condition (function Trig_FS_Conditions))
call TriggerAddAction(t,function Trig_FS_Actions)
set t =null
endfunction
))
))

Отредактировано MegaBlax, 16.06.2013 в 14:10.
Старый 16.06.2013, 13:58
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,146
Активность:
safex y это своего рода пропускные врата, которые не пропустят дизертира-координату, если он не лежит в ректе, используй так же как и мои функции через x проверяешь х, через у - у, только в инициализации нужно вызвать фукцию которая нам пропишет координаты игровой зоны
Sargaraser добавил:
таблицу нужно очищать если данные не используются
Старый 16.06.2013, 14:07
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
SetUnitX(unit, SafeX(coord))
Clamp добавил:
Даже так:
#define SetUnitX(a,b) = SetUnitX(a,SafeX(b))
#define SetUnitY(a,b) = SetUnitY(a,SafeY(b))
Старый 16.06.2013, 14:44
Ответ

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

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

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

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



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