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

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

Закрытая тема
 
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Как вернуть юнита из числа?
Мне нужно запоминать юнитов в кэше (юнитов много, хранить их нужно на протяжении всей игры). Кажется я разобрался более-менее в SCV, но все тки навыка не хватает и хочется узнать, как это сделать правильно.
А делаю я следующее - в начале игры создаю N количество юнитов и по мере их создания, заношу в кеш, присваивая каждому номер (1 созданный юнит имеет номер 1, 2 созданный имеет номер 2 и т.д.). Потом мне нужно заставлять каждого юнита с определенным номером делать что-то. И тут возникает вопрос - как мне вернуть юнита с определенным номером?

Отредактировано Vampirrr, 22.02.2009 в 03:10.
Старый 22.02.2009, 02:39
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Vampirrr, ну, во-первых система называется SCV, а не CSV =) Во-вторых, создавай массив юнитов. У тебя они создаются поочередности, пот и доставай из массива того юнита, который нужен. Например
Код:
call KillUnit(udg_VasyaPupkin[13])
Старый 22.02.2009, 02:57
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
вот мой корявый код:
Код:
unction H2I takes handle h returns integer
return h
return 0
endfunction

function I2U takes integer i returns unit
return i
return null
endfunction

function handle_integer takes handle h, integer val returns nothing
    call StoreInteger(Cache, I2S(H2I(h)), "order", val)
    call DisplayTimedTextToPlayer(Player(0), 0, 0, 15, I2S(H2I(h))+"="+I2S(val))
endfunction

function integer_handle takes handle h returns unit
   return I2U(GetStoredInteger(Cache, I2S(H2I(h)), "order"))
endfunction

function return_order takes handle h returns integer
    return GetStoredInteger(Cache, I2S(H2I(h)), "order")
endfunction

function Formation takes nothing returns nothing
local real x = GetUnitX(GetSpellAbilityUnit())
local real y = GetUnitY(GetSpellAbilityUnit())
local integer i = 0
local unit u = GetEnumUnit()
local unit f

        set i = return_order(u)
        call DisplayTimedTextToPlayer(Player(0), 0, 0, 30, I2S(i))
        set f = integer_handle(u)
        //call DisplayTimedTextToPlayer(Player(0), 0, 0, 30, GetUnitName(f))
        call IssuePointOrder(f, "move", x+100*i, y)

endfunction

методами тыка и выведением на экран значений я пришел к следующему выводу - не работает функция integer_handle (меня на данный момент не волнует красота написания кода и т.д., главное исправить - почему юниты не идут куда я их посылаю). Что бы не было лишних вопросов: Cache - переменная типа кэш, задана при инициализации, val - целочисленная переменная от 1 до 11, все остальное тоже задается.

Vampirrr добавил:
Кажется я нашел ошибку. Дело в том, что integer_handle возвращает значения от 1 до 11 и конечно I2U не срабатывает - ID юнита не может быть числом 1 или 2. Следовательно вопрос - как мне вернуть из val значение юнита?
Старый 22.02.2009, 04:28
APXEOLOG
Прощай XGM, удачи тебе.
offline
Опыт: 1,015
Активность:
Ну когда у меня встал похожий вопрос, я решил не лезть в дебри и реализовал по-простому. У меня конечно юзаются глобалки, но они мне понятнее чем кэш.

Описал структуру хранения юнитов:
Код:
struct UnitData
 unit uUnit
 integer iNumber
endstruct


Так же описал глобалки:
Код:
globals
 UnitData array UDA
 integer UDACounter  //счетчик
endglobals


При создании юнита я записывал значения:
Код:
set UDACounter = UDACounter + 1
 set UDA[UDACounter].uUnit = CreateUnit(...)
 set UDA[UDACounter].iNumber = UDACounter


И теперь в любой момент времени я могу найти юнита простым алгоритмом нахождения элемента в массиве.

Код:
local integer i = 0 
 loop
  exitwhen i > UDACounter
   if (UDA[i].iNumber == 23) then
    call KillUnit(UDA[i].uUnit)
   endif
 set i = i + 1
endloop


Ну конечно в идеале еще добавить механизм очистки массива от погибших юнитов, но у меня он используется только для воскрешаемых героев, так что в нем ничего, после создания, не меняется.
Старый 22.02.2009, 08:20
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
APXEOLOG, единственное, что мне непонятно, так это зачем для этого действия использовать структуры? Ведь можно просто создать массив из юнитов...
Старый 22.02.2009, 13:32
APXEOLOG
Прощай XGM, удачи тебе.
offline
Опыт: 1,015
Активность:
Hellfim ну вообще-то да =) я просто тогда думал о скорейшей реализации а не об оптимизации.
Старый 22.02.2009, 14:50
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
APXEOLOG, спасибо, структуры вещь тоже интересная (хотя мне кеш более понятен чем они), но в связи с тем, что я осваиваю его, хочется узнать, как выйти из моего положения соотсветсвенно используя тот же кеш)
Старый 22.02.2009, 15:47
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Vampirrr
Код:
call KillUnit(I2U(GetStoredInteger(<cache>,<string mission>,<string key>)))
Старый 22.02.2009, 15:54
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Hellfim, как я сказал, из числа 1, 2 или 3 мы не можем венуть юнита) я просто добавил к
Код:
function handle_integer takes handle h, integer val returns nothing
    call StoreInteger(Cache, I2S(H2I(h)), "order", val)
    call DisplayTimedTextToPlayer(Player(0), 0, 0, 15, I2S(H2I(h))+"="+I2S(val))
endfunction

еще 1 вещь:
Код:
call StoreInteger(Cache, I2S(H2I(h)), "uID", H2I(h))

и все заработало..
Старый 22.02.2009, 18:02
MF
Что-то вокруг не так
offline
Опыт: 26,594
Активность:
Vampirrr
Не используй кэш, глюков не оберешься! Hellfim прав, можно обойтись массивом (грамотно реализованым).
и смени подпись, нет в русском языке приставки З-, глаза режет.
Старый 22.02.2009, 18:15
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
MF_Andreich, по поводу глюков пожалуйста подробней. Мне не актуальна реализация, ибо я в кеше разбираюсь.
Старый 22.02.2009, 19:20
MF
Что-то вокруг не так
offline
Опыт: 26,594
Активность:
Vampirrr, ну насчет глюков, поюзай поиск, много писалось, ваабще, кэш не использую (имхо - бред какой-то), но говорят что нехилый процент потери данных + кэш забивает память (как минимум строками). Насчет неактуальности реализации... Учись писать нормально! Вот тебе мой совет.
Старый 22.02.2009, 19:23
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Всем спасибо, тему можно прикрыть.

MF_Andreich, я по-русски уже 3 года не общаюсь (ну только что в интернете) и все равно пишу лучше большинства. А по поводу актуально - пробей поиск в яндексе со строкой "правописание неактуально" и посмотри что выбьет. И однозначно, это слово не из тех, когда ты можешь утверждать что пишется только так и не иначе.
Старый 22.02.2009, 19:46
Закрытая тема

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

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

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

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



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