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

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

Ответ
 
Zeds

offline
Опыт: 346
Активность:
Waypoints
Библиотека является системой для гибкого управления юнитами компьютерных игроков.
Даёт возможность заготовить шаблоны путей и в любой момент отправлять юнитов в движение по ним.
Путь юнитам можно задать в обратном порядке, а так же приказать патрулировать его.
Пути можно легко подменять в зависимости от ситуации.
Система может быть особенно полезна для создания карт жанра Tower Defense или для создания.
» Код библиотеки
((код jass
/**
  • Waypoints
  • Библиотека для гибкого управления юнитами компьютерных игроков
*
  • Created by Zeds
  • Version: 1.1
*/
library Waypoints initializer Init {
private hashtable ht
private path array paths

Создать путь
public path CreatePath(integer id) {
path p = path.create()
p.Register(id)
return p
}

Добавить область к пути
public nothing PathAddRect(integer id, rect rt) {
path p = paths[id]
if (p == null) {
p = CreatePath(id)
}

p.AddRect(rt)
}

Прикрепить юниту направляющую
public nothing SetUnitGuide(unit u, integer pathId, string order, boolean reverse, boolean infinite) {
integer uId = GetHandleId(u)
guide g = guide.create()
guide oldg = LoadInteger(ht, uId, -1)

if (oldg != null) {
oldg.destroy()
}

g.u = u
g.order = order
g.p = paths[pathId]
if (reverse) {
g.pos = g.p.GetCount() - 1
g.direction = -1
}

g.infinite = infinite
SaveInteger(ht, uId, -1, g)
g.Order()
}

Получить направляющую юнита
public guide GetUnitGuide(unit u) {
integer uId = GetHandleId(u)
return LoadInteger(ht, uId, -1)
}

private nothing EnterAction() {
unit u = GetTriggerUnit()
integer uId = GetHandleId(u)
guide g = LoadInteger(ht, uId, -1)
g.pos += g.direction
if (g.infinite and g.direction == 1 and g.pos == g.p.GetCount() - 1) {
g.direction = -1
g.Order()
return
}

if (g.infinite and g.direction == -1 and g.pos == 0) {
g.direction = 1
g.Order()
return
}

if (g.direction == 1 and g.pos < g.p.GetCount()) {
g.Order()
return
}

if (g.direction == -1 and g.pos >= 0) {
g.Order()
return
}

g.destroy()
}

private boolean EnterCondition() {
unit u = GetTriggerUnit()
real x = GetUnitX(u)
real y = GetUnitY(u)
integer uId = GetHandleId(u)
guide g = LoadInteger(ht, uId, -1)

if (g == null) {
return false
}

rect rt = LoadRectHandle(ht, g.p, g.pos)

rt = Rect(GetRectMinX(rt) - 32, GetRectMinY(rt) - 32, GetRectMaxX(rt) + 32, GetRectMaxY(rt) + 32)

if ((GetRectMinX(rt) <= x) and (x <= GetRectMaxX(rt)) and (GetRectMinY(rt) <= y) and (y <= GetRectMaxY(rt))) {
return true
}

return false
}

private boolean UnitDeathCondition() {
unit u = GetTriggerUnit()
integer uId = GetHandleId(u)
guide g = LoadInteger(ht, uId, -1)

return g != null
}

private nothing UnitDeathAction() {
unit u = GetTriggerUnit()
integer uId = GetHandleId(u)
guide g = LoadInteger(ht, uId, -1)
g.destroy()
}

Направляющая(объект для управления юнитом)
struct guide {
unit u
path p
string order
boolean infinite
integer direction = 1
integer pos = 0

Отдать приказ движения к текущей цели
nothing Order() {
rect rt = LoadRectHandle(ht, this.p, this.pos)
real x = GetRectCenterX(rt)
real y = GetRectCenterY(rt)
IssuePointOrder(this.u, this.order, x, y)
}

nothing onDestroy() {
FlushChildHashtable(ht, GetHandleId(this.u))
}
}
Путь(Объект для управления путями)
struct path {
private region rg = CreateRegion()
private integer count = 0
private integer id = -1
trigger trig = CreateTrigger()
event e

region GetRegion() {
return this.rg
}

integer GetCount() {
return this.count
}

nothing Register(integer id) {
integer rgId = GetHandleId(this.rg)

SaveInteger(ht, rgId, -1, id)

this.id = id
paths[id] = this
}

nothing AddRect(rect rt) {
integer trId = GetHandleId(rt)
integer rgId = GetHandleId(this.rg)

RegionAddRect(this.rg, rt)

if (this.e == null) {
this.e = TriggerRegisterEnterRegion(this.trig, this.rg, null)
TriggerAddCondition(this.trig, function EnterCondition)
TriggerAddAction(this.trig, function EnterAction)
}

SaveInteger(ht, trId, -1, this)
SaveRectHandle(ht, this, this.count, rt)

this.count++
}
}
private nothing Init() {
ht = InitHashtable()
trigger trig = CreateTrigger()
integer i = 0
loop {
TriggerRegisterPlayerUnitEvent(trig, Player(i), EVENT_PLAYER_UNIT_DEATH, null)
i++
exitwhen i == 12
}

TriggerAddCondition(trig, function UnitDeathCondition)
TriggerAddAction(trig, function UnitDeathAction)
}
}
))
» История версий
((код
v1.1
  • Более логичный нэйминг функций, структур и переменных
+ Добавлена возможность регистрировать пути на триггерах
))

Отредактировано Zeds, 27.03.2015 в 12:31.
Старый 25.03.2015, 17:00
Ответ

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

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

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

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



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