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

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

Ответ
 
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
CustomValue
Я тут в своей ТД-карте сделал способность "Продать Башню", которая дается зданию при его постройке, а также запускается функция:
Код:
function CustomValue takes unit u(построенная башня) returns nothing
    if ( IsUnitInGroup(u, GetUnitsOfTypeIdAll('h01C')) == true ) then
          call SetUnitUserData( u, 40 )
    endif
    if ( IsUnitInGroup(u, GetUnitsOfTypeIdAll('h018')) == true ) then
          call SetUnitUserData( u, 50 )
    endif
    if ( IsUnitInGroup(u, GetUnitsOfTypeIdAll('h010')) == true ) then
          call SetUnitUserData( u, 500 )
    endif

    \\...всего таких проверок 83! на каждый тип башни.

   set u = null
endfunction

А когда юнит-башня использует способность "Продать", игроку дается 3/4 от CustomValue этого здания(75%) и башня рушится...

Вопрос в том, что у меня к середине игры начинаюся лаги и может от-того, что много башен, а соответственно много CustomValue к середине игры хранится в памяти?

или не так?
тогда почему лагает, я все триггеры и функции оптимизирую?!
Старый 07.07.2007, 12:48
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
GetUnitsOfTypeIdAll('h01C') вызывает утечку в виде сформированной и не уничтоженной, необнуленной группы. Учитывая что проверок за раз 83 и запусков таких проверок немало, наверняка это и является причиной лага. Сделай проще:
Код:
function CustomValue takes unit u(построенная башня) returns nothing
    if (GetUnitTypeId(u) == 'h01C') then
          call SetUnitUserData( u, 40 )
    endif
   set u = null
endfunction

FellGuard добавил:
Alex_Hell, дальнейшие вопросы по джасс-коду в соответствующий раздел, пожалуйста
Старый 07.07.2007, 12:55
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
СПС, FellGuard!
сейчас пойду код исправлять...
please, close it
Старый 07.07.2007, 13:02
p01nTT

offline
Опыт: 11,160
Активность:
set u = null не нужно, юнит не удаляется, кстати в АИ скриптах вроде была нативка определения стоимости юнита:
Код:
native GetUnitGoldCost takes integer unitid returns integer
Старый 07.07.2007, 14:08
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
p01nTT
А стоимость апгрейдов тут учитывается?
Старый 07.07.2007, 14:15
Toadcop

offline
Опыт: 54,313
Активность:
DFlyer какие апгрейды ? =) да вроде нет просто чтения параметра (поля) с типа юнита то что ты напр в Обджек едиторе пишеш.
эту наитивку на в common.j запихать что бы работала т.к. просто так будет синтакс еррор (функция типо не найдена) а потом вроде пашет ну я этим не занималса возможно есть иные трукю я не знаю.
Старый 07.07.2007, 14:47
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
я проверял, все пашет если воткнуть в common.j. Правда это необязательно, можно из ии скрипта по запросам писать значение в кэш.
А можно просто всем башням дать по абилам, и в полях абилы с графикой писать/считывать все данные, хоть это и медленно и гемор
Старый 07.07.2007, 15:38
Markiz

offline
Опыт: 11,432
Активность:
Для таких целей используют POINT VALUE.
Старый 07.07.2007, 16:39
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Цитата:
Сообщение от p01nTT
set u = null не нужно, юнит не удаляется


А что еще не удаляется?...я знаю только, что integer,real сами очищаются.
Старый 08.07.2007, 11:43
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Alex_Hell, не было инициализации локальной переменной, а значит обнулять u не надо. В данном случае u был получен как параметр функции. takes unit u.
Старый 08.07.2007, 11:47
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Теперь все понятно...значит все, что функция получает обнулять не надо!?
Старый 08.07.2007, 12:09
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
если не уничтожаешь - нет. А если юзаеш, а потом стираеш - вероятно да. Не уверен
Код:
function takes location loc, unit u returns nothing
    call SetUnitPositionLoc(u,loc)
    call RemoveLocation(loc)
    set loc = null  // вероятно можно не обнулять, хотя ниче страшного в этом действии нет
endfunction
Старый 08.07.2007, 12:20
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Раз уж по этой теме вопрос исчерпан, можно я тогда в ней и задам еще один не очень сложный вопрос?
В общем для загрузочного кода моей будущей карты(онлайн-РПГ) мне нужно узнать, как переводить число из десятичной Системы Счисления в 16-ричную и в 32-ричную и обратно?
на информатике нам про это не говорили, только про 2>10,10>2,2>8,и чего-то еще
Старый 08.07.2007, 12:25
p01nTT

offline
Опыт: 11,160
Активность:
Цитата:
Сообщение от FellGuard
если не уничтожаешь - нет. А если юзаеш, а потом стираеш - вероятно да. Не уверен
Код:
function takes location loc, unit u returns nothing
    call SetUnitPositionLoc(u,loc)
    call RemoveLocation(loc)
    set loc = null  // вероятно можно не обнулять, хотя ниче страшного в этом действии нет
endfunction

вот здесь как раз нужно :)
Старый 09.07.2007, 01:00
dk

offline
Опыт: 60,293
Активность:
Alex_Hell загляни в библиотеку функций, там есть перевод из 10->16 и обратно... С 32 прийдется поработать самому и получить аналоговую функцию
Старый 09.07.2007, 04:28
Ответ

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

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

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

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



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