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

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

Ответ
 
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,245
Активность:
Выходит из цикла
Иногда выходит из цикла не создав юнита
udg_Hero - это переменная в которую заносится герой каждого игрока
udg_RH - эта переменная хранит в себе типы юнитов
id - целочисленная
i - целочисленная
        loop
            exitwhen i == 11
            if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING and udg_Hero[i+1] == null then
                loop
                    set id = GetRandomInt(1,100)
                    if udg_RH[id] != 0 then
                        set udg_Hero[i+1] = CreateUnit(Player(i),udg_RH[id],x,y,0)
                        set udg_RH[id] = 0
                        call DisplayTextToForce(GetPlayersAll(),"Игроку "+udg_Color[i+1]+GetPlayerName(Player(i))+"|r выпал "+GetUnitName(udg_Hero[i+1]))
                        call AdjustPlayerStateBJ(500, Player(i), PLAYER_STATE_RESOURCE_GOLD )
                        if Player(i) == Player(0) or Player(i) == Player(1)  or Player(i) == Player(2) or Player(i) == Player(3) then
                            call GroupAddUnit(udg_CG[1],udg_Hero[i+1])
                        elseif Player(i) == Player(4) or Player(i) == Player(5)  or Player(i) == Player(6) or Player(i) == Player(7) then
                            call GroupAddUnit(udg_CG[2],udg_Hero[i+1])
                        elseif Player(i) == Player(8) or Player(i) == Player(9)  or Player(i) == Player(10) or Player(i) == Player(11) then
                            call GroupAddUnit(udg_CG[3],udg_Hero[i+1])
                        endif
                    endif
                    exitwhen udg_Hero[i+1] != null
                endloop
            endif
            set i = i+1
            call TriggerSleepAction(0.1)
        endloop

Отредактировано Vadik29, 02.07.2012 в 09:50.
Старый 02.07.2012, 09:44
Hate
конь вакуумный
offline
Опыт: 43,117
Активность:
call TriggerSleepAction(0.1)
убрать из цикла
Hatsume_Hate добавил:
exitwhen udg_Hero[i+1] != null
это разве не означает бесконечный цикл?
Старый 02.07.2012, 10:03
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,245
Активность:
Hatsume_Hate, Дак не всегда же выкидывает
Vadik29 добавил:
Hatsume_Hate,
Внутри цикла есть действие
set udg_Hero[i+1] = CreateUnit(Player(i),udg_RH[id],x,y,0)
Старый 02.07.2012, 10:06
Hate
конь вакуумный
offline
Опыт: 43,117
Активность:
тригер слип экшн вообще не должен быть в циклах имхо
это всегда разное время, мб поэтому и рвется поток. Отладочные сообщения тыкал?
Старый 02.07.2012, 10:07
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,245
Активность:
Hatsume_Hate,
Отладочные сообщения тыкал?
да, в начале и в конце, всегда оба появляются
Да я вэйт добавил потому что идет небольшой прелоад после создания юнита...
Старый 02.07.2012, 10:09
Hate
конь вакуумный
offline
Опыт: 43,117
Активность:
пфф. В начале и конце мало! В данном случае надо добавлять отладки после практически каждого подозрительного действия. Если непомогло - еще больше отладок, включая вывод состояния переменных.
Старый 02.07.2012, 10:14
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,245
Активность:
Hatsume_Hate, В общем нужно попробовать без вэйта
Старый 02.07.2012, 10:19
DioD

offline
Опыт: 45,184
Активность:
set i = i+1
должно быть внутри цикла, у вас тут бесконечный цикл + обрыв потока.
Старый 02.07.2012, 11:28
ScorpioT1000
Работаем
offline
Опыт: отключен
Старый 02.07.2012, 13:03
DioD

offline
Опыт: 45,184
Активность:
есть творение британского сумрачного гения magic humbers included www.wc3c.net/showthread.php?t=110551
Старый 02.07.2012, 13:32
JassMan
свободен
offline
Опыт: 4,193
Активность:
Кстати Van Damm уже давно писал, как использовать вэит в циклах:
function Enum2 takes nothing returns nothing
    local unit e = GetEnumUnit() // Сохранить юнита, над которым проводится операция, в локальной переменной
    call TriggerSleepAction(5) // Подождать 5 секунд
    call KillUnit(e) // Убить юнита
    set e = null // Установит локальную переменную в null чтобы избежать утечек памяти
endfunction

function Enum takes nothing returns nothing
    call ExecuteFunc("Enum2") // Давайте вызовем функцию Enum2 чтобы разрешить ожидания.
endfunction

...
    call ForGroup(somegroup, function Enum) // убьёт всех юнитов группы ‘somegroup’ через 5 секунд реального времени.
...
Старый 09.07.2012, 00:35
DioD

offline
Опыт: 45,184
Активность:
циклы внутри циклов (аля нестед) в варкрафте ведут себя "печально" делайте в множество заходов.
Старый 09.07.2012, 07:40
adic3x

offline
Опыт: 107,539
Активность:
циклы внутри циклов (аля нестед) в варкрафте ведут себя "печально"
Никогда не сталкивался ни с чем подобным, на псевдокоде, в который транслируется Jass тоже нет никакой принципиальной разницы. Подробности, если можно.
Старый 09.07.2012, 12:09
Ответ

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

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

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

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



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