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

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

Ответ
 
inhuman89

offline
Опыт: 3,019
Активность:
Не создается юнит
Добрый вечер.
Я новичок в жассе, поэтому прошу сильно не ругать.
Проблема такова:
function B_Actions takes nothing returns nothing
    local unit bc = GetSpellAbilityUnit()
    local unit bb
    local location bcp = GetUnitLoc(bc)
    local location bbp = GetSpellTargetLoc()
    local real ba = AngleBetweenPoints(bcp, bbp)
    local real bo = 50.00
    local integer bh = 3
    local real br = 800.00
    local integer bd = GetRandomInt(30,40)
    // -----------------------------------------------------------------------
    call TriggerSleepAction( 0.80 )
    call CreateNUnitsAtLoc( 1, 'e000', GetOwningPlayer(bc), bcp, ba )
    set bb = GetLastCreatedUnit()
    call GroupAddUnit( udg_B_group, bb)
    // -----------------------------------------------------------------------
    call SaveRealBJ( ba, (GetHandleIdBJ(bb)), StringHashBJ("angle"), udg_B_table )
    call SaveIntegerBJ( bh, (GetHandleIdBJ(bb)), StringHashBJ("hits"), udg_B_table )
    call SaveRealBJ( br, (GetHandleIdBJ(bb)), StringHashBJ("range"), udg_B_table )
    call SaveIntegerBJ( bd, (GetHandleIdBJ(bb)), StringHashBJ("dmg"), udg_B_table )
    call SaveUnitHandleBJ( bc, (GetHandleIdBJ(bb)), StringHashBJ("caster"), udg_B_table )
    call SaveUnitHandleBJ( bb, (GetHandleIdBJ(bb)), StringHashBJ("bullet"), udg_B_table )
    // -----------------------------------------------------------------------
    call RemoveLocation(bcp)
    call RemoveLocation(bbp)
    call EnableTrigger( gg_trg_move_b )
endfunction
Не хочет создаваться юнит, почему - не знаю. Я конвертнул этот триг в жасс, немного подправил и юнит перестал создаваться и добавляться в группу. Обьясните почему.
Заранее спасибо.
PS. То что нада заменить локи на ху я знаю, и то что я в локалки помещаю то, что не по "правилам" тоже
Старый 15.02.2010, 22:28
XOR

offline
Опыт: 38,159
Активность:
Это все изза слипа. Меняй на таймеры
Bj, утечки...
Старый 15.02.2010, 22:34
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
    // это НЕ bj функция:
    call CreateNUnitsAtLoc( 1, 'e000', GetOwningPlayer(bc), bcp, ba )
    // а здесь пытаемся вернуть результат работы bj функции:
    set bb = GetLastCreatedUnit()
Насчет утечек - добавлю еще и этот материал от ADOLF'a. И молодец, что знаешь, что в коде лишнее)

Отредактировано ShadoW DaemoN, 16.02.2010 в 08:10.
Старый 16.02.2010, 06:30
DioD

offline
Опыт: 45,134
Активность:
близы сломали паус триггер и он не работает с вейтами (иногда).
Старый 16.02.2010, 07:47
Mr_ILYAS
Kicked by XimikS
offline
Опыт: 492
Активность:
ну ты жесть . . . с оптимизацией не работал
и вообще тут всё можно сделать гораздо проще.
  1. смотри как находится угол между двумя объектами (точками или юнитами)
эта функция работает числами типа real, а значит быстрее чем AngleBetweenPoints, где используются объекты (точки или юниты)
2)Я не знаю зачем blizzard'ы придумали так много ненужных bj функций, ибо каждая из них ссылается на другую, лучше сразу писать конечную функцию (native), если это возможно . . .
По поводу TriggerSleepAction — забудь навсегда!
Изредка можно использовать call PolledWait(секунды)
3)В хеш-таблице ты не правильно сохранял данные
В BJ функция часто бывает, что все параметры считываются наоборот в отличии от native функций.
Но ошибка в том, что ты ячейку называл как категорию, а категорию как ячейку называл.
я убрал BJ и теперь всё стоит как надо (ну и еще udg_B_table поменял местами с переменными, потому что native)
4)Если ты ни для чего особого (для сложных операций) не используешь типы real или integer, то не нужно их создавать, пиши сразу туда где тебе нужны числа.
5)Заодно посмотри, как можно работать с таймерами.
Как видишь, для них создается отдельная функция, в которой будет делаться всё, что ты захочешь.
Если поставить там false, то таймер сработает как однократный, если true, то действия будут поворяться с тем периодом который там стоит.
Если ты будешь сохранять данные в хеш-таблице, чтобы перенести их в функцию для таймера
то для категории лучше использовать GetHandleId(этого таймера)
6)Скачай JassCraft и почитай в нём blizard.j, думаю будет тебе полезно
К тому же любую функции можно набрать в поиске JassCraft'a и посматреть что за функция и как лучше её написать.
7)когда создаешь переменную, то можно сразу ей присваивать значение
local unit bb=CreateUnit(Player(pl),'e000',X,Y,ba)
То есть, как видишь, я не только создал переменную, но и создал юнита и обозначил его этой переменной.
Тоже самое и с set bb=
Ну а вот и мой вариант того что ты хотел:
function Duration takes nothing returns nothing
local timer t=GetExpiredTimer() //истёкший таймер
local integer pl=LoadInteger(udg_B_table,GetHandleId(t),1)
local real ba=LoadReal(udg_B_table,GetHandleId(t),2)
local real X=LoadReal(udg_B_table,GetHandleId(t),3)
local real Y=LoadReal(udg_B_table,GetHandleId(t),4)
local unit bb=CreateUnit(Player(pl),'e000',X,Y,ba)
call GroupAddUnit(udg_B_group,bb)
call EnableTrigger(gg_trg_move_b)
call FlushChildHashtable(udg_B_table,GetHandleId(t)) //чистим категорию
//call PauseTimer(t) так как он однократно должен сработать, то можно пропустить это действие
call DestroyTimer(t) //очистка памяти игры — не забываем про оптимизацию
set t=null
endfunction

function B_Actions takes nothing returns nothing
local timer t=CreateTimer() //создаём таймер
local unit bc=GetSpellAbilityUnit()
local location bbp=GetSpellTargetLoc()
local real ba=bj_RADTODEG*Atan2(GetLocationY(bbp)-GetUnitY(bc),GetLocationX(bbp)-GetUnitX(bc))
//Кстати я буду нумеровать ячейке по порядку, а потому что мне так нравится))
call SaveInteger(udg_B_table,GetHandleId(t),1,GetPlayerId(GetOwningPlayer(bc))) //сохраняем ID игрока (Владельца bc)
call Savereal(udg_B_table,GetHandleId(t),2,ba)
call Savereal(udg_B_table,GetHandleId(t),3,GetUnitX(bc))
call Savereal(udg_B_table,GetHandleId(t),4,GetUnitY(bc))
//А дальше я не знаю, нужны ли тебе эти действия, но я их оставлю — сам разбирайся
call SaveReal(udg_B_table,GetHandleId(bb),StringHash("angle"),ba)
call SaveInteger(udg_B_table,GetHandleId(bb),StringHash("hits"),3)
call SaveReal(udg_B_table,GetHandleId(bb), StringHash("range"),800.)
call SaveInteger(udg_B_table,GetHandleId(bb),StringHash("dmg"),GetRandomInt(30,40))
call SaveUnitHandle(udg_B_table,GetHandleId(bb),StringHash("caster"),bc)
call SaveUnitHandle(bb,GetHandleId(bb),StringHash("bullet"),bb)
call TimerStart(t,0.8,true,function Duration) 
//ну вот, теперь переносим все действия, которые нужно задержать на 0.8 сек в функцию Duration
//Не забываем обнулить "объектные" переменные (не относится к: integer, real, boolean, player и возможно еще что-нибудь)
call RemoveLocation(bbp)
set bbp=null
set t=null 
set bb=null
set bc=null
endfunction
Да, этот вариант более громоздкий но он более легкий для соображения компьютера.
Кстати я пробелы не ставлю вокруг символов: + = - ( ) , * / ' < > "
Я понимаю, что они нужны для удобочитаемости кода, но я так пишу скрипты.

Отредактировано ShadoW DaemoN, 17.02.2010 в 07:23.
Старый 16.02.2010, 22:11
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Цитата:
По поводу TriggerSleepAction — забудь навсегда!
Изредка можно использовать call PolledWait(секунды)
Хех лол. Переведу - Не используй TriggerSleepAction, используй функцию, которая криво использует TriggerSleepAction. (Истина - использовать таймеры)

FellGuard добавил:
Учитывая число сохраняемых данных в хеш-таблице, лучше было бы всё затолкать в структуру, хотя дело вкуса. Хеш-таблицы не намного медленнее.
Старый 17.02.2010, 07:07
DioD

offline
Опыт: 45,134
Активность:
хеш таблицы это для гуи на джаз структура + минимум хеш таблиц
Старый 17.02.2010, 09:59
Mr_ILYAS
Kicked by XimikS
offline
Опыт: 492
Активность:
Кстати я структурами не умею, может кто научить или статью дать
Старый 17.02.2010, 13:41
Ответ

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

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

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

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



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