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

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

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

offline
Опыт: 159
Активность:
не могу разобраться с деревьями
Суть в том, что я не могу добавить условие (дабы деревья не ловили зазевавшихся) в код восстанавливающий деревья.
Исходный код от Nekit1234007.
Моя попытка (наверно лучшая):
Код:
function IsUnitGroupEmpty takes nothing returns nothing
    set Result = false
endfunction

function ResT takes nothing returns nothing
    local timer t=GetExpiredTimer()
    local integer i=GetHandleId(t)-0x100000
    local destructable d=LoadDestructableHandle(udg_HT,i,0)
    local group g
    call GroupEnumUnitsInRange (g,GetDestructableX(d),GetDestructableY(d),200,null)
    set Result = true
    call ForGroup(g, function IsUnitGroupEmpty)
    if Result
    then
        call DestructableRestoreLife(d,GetDestructableMaxLife(d),true)
        call SetDestructableAnimation(d,"birth")
        call DestroyTimer(t)
        call FlushChildHashtable(udg_HT,i)
        set d=null
        set t=null
    else
        call TimerStart(t,3.,false,function ResT)
        set d=null
        set t=null
    endif
endfunction

function Trig_Trees_Actions takes nothing returns nothing
    local destructable d=GetTriggerDestructable()
    local timer t=CreateTimer()
    local integer i=GetHandleId(t)-0x100000
    call SaveDestructableHandle(udg_HT,i,0,d)
    call TimerStart(t,3.,false,function ResT)
    set d=null
    set t=null
endfunction


function RegD takes nothing returns nothing
    call TriggerRegisterDeathEvent(gg_trg_Trees,GetEnumDestructable())
endfunction

function InitTrig_Trees takes nothing returns nothing
    if udg_HT==null then
        set udg_HT=InitHashtable()
    endif
    set gg_trg_Trees = CreateTrigger()
    call TriggerAddAction(gg_trg_Trees,function Trig_Trees_Actions)
    call EnumDestructablesInRect(GetWorldBounds(),null,function RegD)
endfunction
Старый 26.02.2012, 17:11
alpha

offline
Опыт: 7,387
Активность:
Попробуй этот код:
» code
globals
  group Tree_pickgroup = CreateGroup()
endglobals

define

  tee_res_interval = 3.
  tree_res_U_pick_area = 200.
  
  tree_res_animation = "birth"
  With_Animation = true
  
enddefine

function IsUnitGroupEmpty takes nothing returns nothing
  set Result = false
endfunction

function ResTee takes nothing returns nothing
  
  local timer t = GetExpiredTimer()
  local integer i = (GetHandleId(t) - 0x100000)
  local destructable d = LoadDestructableHandle( udg_HT, i, 0)
    
  call GroupEnumUnitsInRange( Tree_pickgroup, GetDestructableX(d), GetDestructableY(d), tree_res_U_pick_area, null)
    
  set Result = true
  call ForGroup(Tree_pickgroup, function IsUnitGroupEmpty)
  call GroupClear(Tree_pickgroup)
    
  if (Result) then
      call DestructableRestoreLife( d, GetDestructableMaxLife(d), true)
      
      #if With_Animation
        call SetDestructableAnimation( d, tree_res_animation)
      #endif
      
      call DestroyTimer(t)
      call FlushChildHashtable( udg_HT, i)
  else
      call TimerStart(t, tree_res_interval, false, function ResT)
  endif
    
  set d = null
  set t = null

endfunction

function Trig_Trees_Actions takes nothing returns nothing

  local timer t = CreateTimer()
  local integer i = (GetHandleId(t) - 0x100000)
  
  call SaveDestructableHandle( udg_HT, i, 0, GetTriggerDestructable())

  call TimerStart( t, tree_res_interval, false, function ResTree)
  
  set t = null

endfunction

function RegDestructable takes nothing returns nothing
  call TriggerRegisterDeathEvent(gg_trg_Trees, GetEnumDestructable())
endfunction

function InitTrig_Trees takes nothing returns nothing
  
  set gg_trg_Trees = CreateTrigger()
  call TriggerAddAction( gg_trg_Trees, function Trig_Trees_Actions)
  
  //init trees
    call EnumDestructablesInRect( GetWorldBounds(), null, function RegDestructable)
  
  if (udg_HT == null) then
    set udg_HT = InitHashtable()
  endif
  
endfunction
  • Расставил отступы на свое усмотрение;
  • Убрал лишнее;
  • Вынес важные значения в дефайн-блок;
  • Оптимизировал код;
  • Исправил ошибки.
Ты не создавал группу в функции, что надо делать, рассмотри мой код и поймешь детали
Старый 26.02.2012, 17:33
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
function ResT takes nothing returns nothing
    local timer t=GetExpiredTimer()
    local integer i=GetHandleId(t)-0x100000
    local destructable d=LoadDestructableHandle(udg_HT,i,0)
    local group g=CreateGroup()
    call GroupEnumUnitsInRange (g,GetDestructableX(d),GetDestructableY(d),200,null)
    set Result = true
    call ForGroup(g, function IsUnitGroupEmpty)
if Result then
	call DestructableRestoreLife(d,GetDestructableMaxLife(d),true)
	call SetDestructableAnimation(d,"birth")
	call DestroyTimer(t)
	call FlushChildHashtable(udg_HT,i)
	call GroupClear(g)
else
	call TimerStart(t,3.,false,function ResT)
endif
call DestroyGroup(g)
set g=null
set d=null
set t=null
endfunction
Проверь так
Старый 26.02.2012, 17:35
alpha

offline
Опыт: 7,387
Активность:
Nerevar, группа не инициализирована
Старый 26.02.2012, 17:36
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Да сначала думал сразу показать с инитом группы ошибку,потом решил исправить кое-чего и про группу забыл
Старый 26.02.2012, 17:37
alpha

offline
Опыт: 7,387
Активность:
А да, чтобы использовать все фичи, которые я встроил в код, нужен JNGP редактор
Старый 26.02.2012, 17:38
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
осваивай
точку можно заменить на координаты, но это мало что даст

Отредактировано Clamp, 26.02.2012 в 18:38.
Старый 26.02.2012, 18:13
H_J_K

offline
Опыт: 159
Активность:
Цитата:
А да, чтобы использовать все фичи, которые я встроил в код, нужен JNGP редактор

есть.
Цитата:
осваивай
точку можно заменить на координаты, но это мало что даст

Это немного не то, ибо деревья восстанавливаются все сразу. И да, cJass пока слишком круто для меня.

Всем пасибо, но этот кусок кода (тот что отличается от оригинала) лишь 2ой из написанных мной и я хотел бы в этом всём разобраться. Поэтому, собственно, просьба не закрывать и не улюлюкать при странных вопросах.
Старый 26.02.2012, 20:37
alpha

offline
Опыт: 7,387
Активность:
H_J_K:
cJass пока слишком круто для меня.
Тут мало cJass'а, я задействовал только часть того, что действительно дает явное преимущество кодеру использующему cJass, как видишь старался не уходить в деталях далеко от Jass2.
Всем пасибо, но этот кусок кода (тот что отличается от оригинала) лишь 2ой из написанных мной и я хотел бы в этом всём разобраться. Поэтому, собственно, просьба не закрывать и не улюлюкать при странных вопросах.
Надеюсь вопросы будут по теме
Старый 26.02.2012, 21:01
H_J_K

offline
Опыт: 159
Активность:
Это я Clamp'у.
я так понял:
не
Код:
local group g

а
Код:
local group g=CreateGroup()

это всё?
P.S.кроме того что можно лучше
Старый 26.02.2012, 21:30
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
H_J_K:
Это немного не то, ибо деревья восстанавливаются все сразу.
а как тебе надо?
Старый 26.02.2012, 21:32
H_J_K

offline
Опыт: 159
Активность:
Чтобы каждое восстанавливалось через n секунд.
Ранее срубленное дерево воскрешается раньше. Мб так понятней.
сравни два примера если не лень.
» раскрыть
10 минут=(


H_J_K добавил:
В принципе, благодаря поправкам Nerevar'а, теперь всё работает.Я думаю, что я понял корень всех бед и я разобрался. Если кто-то другой обратит внимание на эту тему, то ему лучше воспользоваться предложением
alpha.
думаю можно клоуз.
Прикрепленные файлы
Тип файла: w3x Test map - Trees Birth.w3x (22.3 Кбайт, 4 просмотров )
Тип файла: w3x Destructable.w3x (13.5 Кбайт, 4 просмотров )
Старый 26.02.2012, 23:08
Закрытая тема

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

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

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

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



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