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

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

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

offline
Опыт: 108,439
Активность:
Medivx, создать в РО способность на базе спелбука, добавить в нее необходимый спелл, запретить тригерно данную способность для игрока и добавить данный спелбук юниту.

ADOLF добавил:
ппц, стопицот раз обсуждали...

ADOLF добавил:
df Hunter, кста насчет фрислота глянь еще как уничтожаются структы в вЖасс... для полной ясности=)
Старый 20.09.2007, 21:03
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
да всё норм, я там ошибку небольшую допустил :):
Старый 20.09.2007, 22:23
Void

offline
Опыт: 1,632
Активность:
Я хочу создать функцию которая определяет самого котцанного юнита в группе.
Старый 21.09.2007, 17:16
S

offline
Опыт: 43,833
Активность:
Цитата:
Сообщение от Void
Я хочу создать функцию которая определяет самого котцанного юнита в группе.

Это тема в которой помогают оптимизировать\усовершенствовать код, а не делать всё за тебя. Подсказка - сравнивай хп всех юнитов в группе.
Старый 21.09.2007, 17:22
adic3x

offline
Опыт: 108,439
Активность:
Код:
globals
 unit udg_u
 group udg_g
 real udg_r
endglobals

function Func takes nothing returns nothing
 local unit u=GetEnumUnit()
  if GetWidgetLife(u)<udg_r then
   set udg_r=GetWidgetLife(u)
   set udg_u=u
 endif
 set u=null
endfunction

...
 set udg_r=GetWidgetLife(FirstOfGroup(udg_g))
 call ForGroup(udg_g, function Func)
...


что то вроде...

Отредактировано ADOLF, 22.09.2007 в 10:07.
Старый 21.09.2007, 17:23
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
ADOLF, у тебя численное значение, да еще и r = 0. Что может иметь hp < 0 ?
Код:
// udg_r1 - процент макс. жизни юнита;
// udg_r2 - численное значение жизни;
// udg_u - юнит;
// udg_g - группа;

globals
 unit udg_u
 group udg_g
 real udg_r1
 real udg_r2
endglobals

function FuncName takes nothing returns nothing
 local unit u=GetEnumUnit()
 local real state = (GetWidgetLife(u)/GetUnitState(u,UNIT_STATE_MAX_LIFE))
//или так:  local real state = (GetWidgetLife(u)/(GetUnitState(u,UNIT_STATE_MAX_LIFE)/100.0))
  if state<udg_r1 then
   set udg_r1=state
   set udg_r2=GetWidgetLife(u)
   set udg_u=u
 endif
 set u=null
endfunction

...
 set udg_r1=100.00
 set udg_g =*группа*
 call ForGroup(udg_g, function FuncName)
...

Отредактировано FellGuard, 22.09.2007 в 11:25.
Старый 21.09.2007, 21:37
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
Цитата:
Что может иметь hp < 0 ?

кстати может такое быть
например дай герою абилку -10000 хп, он умрёт, а потом воскреси его (помойму так, просто был такой баг года 2!!! назад, дайствие вроде было такое)
+ кстати надо уточнить, по количество ХП или по проценту
Старый 21.09.2007, 21:53
J
expert
offline
Опыт: 48,447
Активность:
ужс.. куча глобалок функций... почему нельзя делать ноглядно?
Код:
function CopyGroup takes group gr1, group gr2 returns group
    set bj_groupAddGroupDest = gr2
    call ForGroup(gr1, function GroupAddGroupEnum)
    return bj_groupAddGroupDest
endfunction

function UnitOfGroupMinLife takes group gr2 returns unit
    local unit u
    local real state
    local group gr = CopyGroup (gr2, CreateGroup())
    local real minstate = -1
    local unit minunit
    loop
        set u = FirstOfGroup()
        exitwhen u == null
        set state = GetUnitState(u, UNIT_STATE_LIFE)
        if state < minstate or minstate == -1 then
            set minstate = state
            set minunit = u
        endif
        call GroupRemoveUnit(gr, u)
    endloop
    call DestroyGroup(gr)
    set gr = null
    return minunit
endfunction


Void функция UnitOfGroupMinLife(gr) вернет самого коцаного юнита из группы gr

Отредактировано Jon, 22.09.2007 в 13:02.
Старый 21.09.2007, 22:15
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
изврат

Отредактировано Jon, 22.09.2007 в 13:03.
Старый 21.09.2007, 23:21
adic3x

offline
Опыт: 108,439
Активность:
отредактировал свой код...

ADOLF добавил:
Цитата:
изврат
+1

ну я сделал вариант, который находит юнита с мин хп вообще, фелл по проценту=)
Старый 22.09.2007, 10:12
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
Сообщение от ADOLF
Цитата:
изврат
+1
почему?

Jon добавил:
Короче тут все норм.
Береш группу суеж в функцию и получаеш юнита с самым меньшим количеством жизней.
Ксате, я сделал чтобы группа копировалась для того чтобы исходая группа которая была пораметром не притерпивала изменений, и при последующем ее испольовании вела себя корректно, т.к. может много че случится.. и важен тут общий случай.
Иногда сталкивался со случаем что человек (не я=)) удалял точку после функции в которой точка удалялась, просто в той функции был екзекут функц, он переносил точку туды сюды и не замечал как и где он ее удаляет, т.е. не держал код под контролем, - это не допустимо.

То что проверка идет на 2 условия это не имеет значения, я спецально поставил их в таком порядке, потомуто в джазе как и во многих языках програмирования существует режим ShortCurcuiting, потому все норм, доступно и наглядно.. че тут извратного не совсем понимаю...

Отредактировано Jon, 22.09.2007 в 16:49.
Старый 22.09.2007, 10:39
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
думаю, извратными сочли перестраховочные манипуляции с группами) по мне так все нормально. Хотя опять же, ты берешь численное значение, а если в группе овца с 15.00 хп? она чтоже, битая :) нет просто state_life меньше всего
Старый 22.09.2007, 10:41
J
expert
offline
Опыт: 48,447
Активность:
ну это уже кому как... т.е. всмысле зависит от ситуации... если нужно выбрать юнита покоцаного из группы чтобы полечить его, то вариант с процентами неподходит...
ну и с овцой тоже прицепи пример хороший... вообщем хз... можно делатьпроверку принцепи и на проценты... хз т.е. есть свои плюсы и минусы
если надо учитывать процентное сочетание.. то всеволиш в моем коде нужно поменять строку
set state = GetUnitState(u, UNIT_STATE_LIFE)
на
set state = GetUnitState(u, UNIT_STATE_LIFE)/GetUnitState(u, UNIT_STATE_MAX_LIFE)
FellGuard делаить на 100 необязательно

Отредактировано Jon, 22.09.2007 в 11:47.
Старый 22.09.2007, 10:44
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
мм пример
овца, 3 хп, макс 15 = 1/5 здоровья
пехотинец, 1 хп, 150 макс. = 1/150 здоровья
какой как ты думаешь результат будет посредством
set state = GetUnitState(u, UNIT_STATE_LIFE)*GetUnitState(u, UNIT_STATE_MAX_LIFE)
?
Старый 22.09.2007, 10:50
J
expert
offline
Опыт: 48,447
Активность:
FellGuard нуя уже скзаал.. свои плюси и минусы...
это не будет является процентами.. но результат будет тотже
посто деля на сто изменяются величины.. а не их пропорции.. и потому это не обязательно
Старый 22.09.2007, 10:52
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
плин тогда не GetUnitState(u, UNIT_STATE_LIFE)*GetUnitState(u, UNIT_STATE_MAX_LIFE) а GetUnitState(u, UNIT_STATE_LIFE)/GetUnitState(u, UNIT_STATE_MAX_LIFE)
Тем не менее проценты считаю более универсальными

FellGuard добавил:
а понял я свою ошибку, там у меня неверная формула =) я там вообще считаю 1 процент от макс. лайф и потом присваиваю стэйту значение 3-х процентов от этой величины, вот дятел.. все, щас сменю.
Старый 22.09.2007, 11:17
J
expert
offline
Опыт: 48,447
Активность:
ошибку у себя нашел) надо делить а не умножить.. это я опечатолся) ща исправлю)

Jon добавил:
а.. плин.. ты ее уже сказал.. а я сижу в оффе и думаю что чтото не то:)

ну проценты.. дроби.. это безразници.. важно ведь результат... функция возвратит только юнита, как она работает это уже не так важно для того кто ее будет использовать

хотя вот.. придумал пример) например есть юнит с 100/1000 жизнями, и другой юнит с 900/10000
если использовать функцию для определения цели лечения, то будет выбран второй, а благоразумнее было бы выбрать первого =) ну вообщем плюси и минусы =)

кстате.. маленькая идея.. можно вообще вычеслять не по минимальному количеству жизней, а по максимальному количеству жизней оставшемуся до максимума.. тогда некоторых проблем небудет
Старый 22.09.2007, 12:10
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
вообще это делается через одну глобалку типа unit
впринципе могу написать правильный вид поиска функции по процентам/количеству с булей +/-
Старый 22.09.2007, 12:13
J
expert
offline
Опыт: 48,447
Активность:
зачем вообще глобалки и фор груп? мы хотим сделать полностью оптимизированую версию? или хотим понятно ответить на вопрос?
и далеко не все люди юзают ген пак, и не собираются, и простой работы с глобалками им не бдует
небудем фигней страдать.. написали уже 3 варианта.. и хватит)

Отредактировано Jon, 22.09.2007 в 12:38.
Старый 22.09.2007, 12:15
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
если кто-то не юзают jass new gen pack
то для него сойдут и БЖ функции
Код:
function MinLifeGroup takes group g returns nothing
    local group g1 = CreateGroup()
    local unit u
    local real r = Pow(2,31) // :D
    local real r1 = 0
    local unit u1
    call GroupAddGroup(g1,g)
    loop
         set u = FirstOfGroup(g1)
         exitwhen u == null
         set r1 = GetUnitState(u, UNIT_STATE_LIFE)
         if r1<r then
            set r = r1
            set u1 = u
         endif
         call GroupRemoveUnit(g1, u)
    endloop
    call DestroyGroup(g1)
    set g1 = null
    return u1
endfunction

хотя бы вот так

Отредактировано df Hunter, 22.09.2007 в 13:06.
Старый 22.09.2007, 13:00
Закрытая тема

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

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

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

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



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