Сейчас 16:16:33 Суббота, 5 октября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Статья]Сборка предметов магическим кругом как в доте.
lawsonДата: Суббота, 19 Марта 2011, 23:20:26 | Сообщение # 1
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
И так эта статься для тех кто хочет сделать как в доте чтоб магический круг собирал предметы (когда герой скидывает их на круг) и выбрасывал их (при нажатии на кнопку).
Сначала нам понадобиться две способности.
1) Эта способность любая чтоб она была мгновенная. Назовен ее Drop Item - эта кнопка будет выбрасывать предметы.
2) Аналогичная первой. - Назовем ее Get Item - эта кнопка будет собирать предметы которые скинул на магический круг герой.
Теперь перейдем к триггера.
Первый триггер назовем Drop Item - он будет отвечать за скидывание предметов.
Его работа проста.
Создаем событие Юнит начинает применять способность.
Далле условие что применяемая способность равна = способности Drop Item.
И действие
Для начала создадим локальные перменные.
Code
local integer l = 0 - это наша перменная целоисчислительная для цикла.

Code
local unit u = GetTriggerUnit() - это наша перменная в которой знчение юнит применивший заклинание.

теперь делаем цикл
Code
loop
exitwhen l > 5
if (UnitItemInSlot(u, l) != null) then
call UnitDropItemPoint(u, UnitItemInSlot(u, l), GetUnitX(u), GetUnitY(u))
endif
set l = l + 1
endloop

Code
UnitItemInSlot() - это функция которая будет проверять есть ли у юнита предмет в слоте.

Если есть то делать действие
Code
call UnitDropItemPoint() - Эта функция отвечает за сбрасывание предмета у юнита на его положение на карте.

и все закрываем цикл и пишем
Code
set u = null(аля оптимизация)

Все наш триггер по сбросу предметов готов.
Теперь переходим к триггеру для поднятия предметов.
Создаем то же самое событие что и для первого триггера (юнит использует способность)
Далее условие что наша способность равна = способность GetItem
И действие.
Сначала создаем локалные чтоб было легче писать функции и сокрашать их.
Code
local unit u = GetTriggerUnit() - наш юнита который применил способность
local integer l = 0 - целоисчислительная для цикла.
local integer id = 0 - целоисчислительная для взятия у предметов их id.

и
Code
local rect r = Rect(GetUnitX(u) - 100, GetUnitY(u) - 100, GetUnitX(u) + 100, GetUnitY(u) + 100) - это наша область вокруг юнита для того чтоб юнит мог ориентироваться где ему собирать предметы.

теперь цикл
Code
loop
exitwhen l > 5 - 5 = это кол -во слотов у юнита. Счет начинаеться с 0.
дальше нам надо узнать есть ли у юнита свободные слоты.
if (UnitItemInSlot(u, l) == null) then
если етьс то выполнить следующие действия
set bj_lastRemovedItem = null - этим мы объявляем что все предметы которые были у нашого круга все они равны = null.

далле нам нужно опеределиться все предметы что есть в области вокруг юнита.
Code
call EnumItemsInRect(r, null, function SeeItem) - эта функция берет все предметы вокруг юнита и вызывает функцию для них - эту функцияю мы создадим для
Code
утановления bj_lastRemovedItem - что вокруг юнита есть предмет.

далее
мы создаем отдельную в этом жу триггер функция для установелния предметов вокруг юнита.
Code
function SeeItem takes nothing returns nothing
set bj_lastRemovedItem = GetEnumItem()
endfunction

возвращаемся к нашему циклу.
Теперь нам надо узнать не равен ли bj_lastRemovedItem нулю
Code
if (bj_lastRemovedItem != null) then

если не равен то делать действия.
Code
set id = GetItemTypeId(bj_lastRemovedItem) - помните нашу перменную id которую мы создали для записи id предмета которго выделии. Вот в нее мы и записываем id нашего выделенного вокруг юнита предмета.

и теперь можно добавить предмет юнита просто сделав так
Code
call UnitAddItemById(u, id)

и последнее это надо удалить предмет который мы выделяли.
Code
call RemoveItem(bj_lastRemovedItem)

все наш цикл готов можно его закрывать
Code
endif
endif
set l = l + 1
endloop

и обязательно оптимизация :)
Code
set u = null
call RemoveRect(r)
set r = null

Вот мы и сделали поднятие и выбрасывание предметов как в доте у магического круга.
Вот весь триггер.
1)

2)

Проверить можно просто скинуть предмет окол юнита а потом использовать способность GetItem.
Юнит(магический круг) соберет все около него предметы если у него есть свободные слоты.
Удачи. Всего наилучшего lawson. :)


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Суббота, 19 Марта 2011, 23:40:31
 

lawsonДата: Суббота, 19 Марта 2011, 23:27:34 | Сообщение # 2
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (Boomer-um)
фууууу JASS

Эхх скоро поймешь почему раньше не начал изучать.


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!
 

SPtrueДата: Воскресенье, 20 Марта 2011, 03:25:43 | Сообщение # 3
Mí alegre
Группа: Проверенные
Сообщений: 2732
Награды: 2
Репутация: 692
Блокировки:
Лучше бы написал как сделать, что бы можно было собирать предмет, если нет слотов, а остался один предмет :) И почему переменную u ты устанавливаешь как переключающий юнит, а не применяющий
 

lawsonДата: Воскресенье, 20 Марта 2011, 13:07:24 | Сообщение # 4
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (SPtrue)
как переключающий юнит, а не применяющий

ПОтому что юнит который вызывает событие и есть TriggerUnit()


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!
 

DreiiДата: Воскресенье, 20 Марта 2011, 14:42:19 | Сообщение # 5
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
Quote (SPtrue)
переключающий юнит, а не применяющий

Применяемый перезаписываеться а переключающийся нет


 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz