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

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

Закрытая тема
 
ScorpioT1000
Работаем
online
Опыт: отключен
Patrol или ремонт кода
Короче недавно начал вламываться, вламываться в JASS.
Создал простой кодиг, делает брожение юнитов, типа "Бродячий(нейтральный)", тока он особенным образом не теряет свою позицию и не убегает..
Вот собсна неработает...
________________
Цитата:
function Act takes unit PatrolUnit, group PatrolRndUnitGroup returns nothing
local location PatrolStandPoint
local location PatrolPoint
set PatrolStandPoint = GetUnitLoc(PatrolUnit)
set PatrolPoint = PolarProjectionBJ(GetUnitLoc(PatrolUnit), GetRandomReal(150.00, 300.00), GetRandomDirectionDeg())
call IssuePointOrderLocBJ( PatrolUnit, "attack", PatrolPoint )
call TriggerSleepAction( ( DistanceBetweenPoints(PatrolStandPoint, PatrolPoint) / GetUnitMoveSpeed(PatrolUnit) ) )
call GroupAddUnitSimple( PatrolUnit, udg_NotPatrolingUnits )
call TriggerSleepAction( GetRandomReal(3.00, 6.00) )
call GroupRemoveUnitSimple( PatrolUnit, udg_NotPatrolingUnits )
call IssuePointOrderLocBJ( PatrolUnit, "attack", PatrolStandPoint )
call DestroyGroup(PatrolRndUnitGroup)
endfunction

function Trig_Patroling_FuncCnd takes nothing returns boolean
if ( not ( GetOwningPlayer(GetFilterUnit()) == Player(2) ) ) then
if ( not ( GetOwningPlayer(GetFilterUnit()) == Player(9) ) ) then
return false
endif
endif

if ( not ( GetUnitCurrentOrder(GetFilterUnit()) == String2OrderIdBJ("stop") ) ) then
return false
endif

if ( not ( IsUnitInGroup(GetFilterUnit(), udg_NotPatrolingUnits) == false ) ) then
return false
endif
return true
endfunction

function Trig_Patroling_Actions takes nothing returns nothing
local group PatrolRndUnitGroup
local unit PatrolUnit
set PatrolRndUnitGroup = GetUnitsInRectMatching(GetPlayableMapRect(), Condition(function Trig_Patroling_FuncCnd))
set PatrolUnit = GroupPickRandomUnit(PatrolRndUnitGroup)
if ( PatrolUnit != null ) then
call Act(PatrolUnit,PatrolRndUnitGroup)
endif
endfunction

//===============
function InitTrig_Patroling takes nothing returns nothing
set gg_trg_Patroling = CreateTrigger( )
call TriggerRegisterTimerEventPeriodic( gg_trg_Patroling, 0.25 )
call TriggerAddAction( gg_trg_Patroling, function Trig_Patroling_Actions )
endfunction


Вот собсна трахаюсь тут, но наверно уже моск устал, но гулять выходить нехачу, хачу доделать..

Отредактировано ScorpioT1000, 03.11.2009 в 01:59.
Старый 15.09.2007, 20:44
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
ну все if (not) == then заменяется на if()!= then
Старый 15.09.2007, 20:49
ScorpioT1000
Работаем
online
Опыт: отключен
Ну и что с того? одно и то же
Старый 15.09.2007, 20:49
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
так понял что весь косяк в том что он возвращается на исходную позицию? Ignore AI guard position for all units (player) решит проблему
ps не одно и то же. Лишнюю операцию выполняешь)
Старый 15.09.2007, 20:51
ScorpioT1000
Работаем
online
Опыт: отключен
Не, если я сделаю с периодом чтобы бегал просто там бродил как в вовке.
Если буду просто давать пройти туды, пройти сюды, то со временем он может ваще из одного угла карты прибродить в другой... а тут он не с ходит с места, хотя при этом вроде и не стоит тупо на месте..
Старый 15.09.2007, 20:53
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
» code
Код:
function Act takes unit PatrolUnit, group PatrolRndUnitGroup returns nothing
local location PatrolStandPoint = GetUnitLoc(PatrolUnit)
local location PatrolPoint = PolarProjectionBJ(GetUnitLoc(PatrolUnit), GetRandomReal(150.00, 300.00), GetRandomDirectionDeg())

call IssuePointOrderLocBJ( PatrolUnit, "attack", PatrolPoint )

call TriggerSleepAction(DistanceBetweenPoints(PatrolStandPoint, PatrolPoint) / GetUnitMoveSpeed(PatrolUnit))
call GroupAddUnitSimple( PatrolUnit, udg_NotPatrolingUnits )
call TriggerSleepAction( GetRandomReal(3.00, 6.00) )

call GroupRemoveUnitSimple( PatrolUnit, udg_NotPatrolingUnits )
call IssuePointOrderLocBJ( PatrolUnit, "attack", PatrolStandPoint )
call DestroyGroup(PatrolRndUnitGroup)
endfunction

function Trig_Patroling_FuncCnd takes nothing returns boolean
if (GetOwningPlayer(GetFilterUnit()) != Player(2) ) then
if (GetOwningPlayer(GetFilterUnit()) != Player(9) ) then
return false
endif
endif

if (GetUnitCurrentOrder(GetFilterUnit()) != String2OrderIdBJ("stop") ) then
return false
endif

if (IsUnitInGroup(GetFilterUnit(), udg_NotPatrolingUnits) == true) then
return false
endif

return true

endfunction

function Trig_Patroling_Actions takes nothing returns nothing
local conditionfunc PatrolCondit = Condition(function Trig_Patroling_FuncCnd)
local group PatrolRndUnitGroup  = GetUnitsInRectMatching(GetPlayableMapRect(), PatrolCondit)
local unit PatrolUnit = GroupPickRandomUnit(PatrolRndUnitGroup)

call DestroyCondition(PatrolCondit)

if ( PatrolUnit != null ) then
  call Act(PatrolUnit,PatrolRndUnitGroup)
endif
set PatrolCondit = null
endfunction

//===============
function InitTrig_Patroling takes nothing returns nothing
set gg_trg_Patroling = CreateTrigger( )
call TriggerRegisterTimerEventPeriodic( gg_trg_Patroling, 0.25 )
call TriggerAddAction( gg_trg_Patroling, function Trig_Patroling_Actions )
endfunction
ошибок вроде нет в коде (компиллятор бы ругался), значит есть логические ошибки. Просто бери в таком случае и выводи отдельные ключевые части на дисплей,
» for ex.
Код:
...
if ( PatrolUnit != null ) then
  call Act(PatrolUnit,PatrolRndUnitGroup)
  call DisplayTimedTextToPlayer(Player(0),0,0,30,"unit exists")
endif
Старый 15.09.2007, 21:04
ScorpioT1000
Работаем
online
Опыт: отключен
И что значит этот "code", не знаю что там так ты сделал что он просит функцию инициализации InitTrig_Patroling, хотя он есть:
Цитата:
function InitTrig_Patroling takes nothing returns nothing
set gg_trg_Patroling = CreateTrigger( )
call TriggerRegisterTimerEventPeriodic( gg_trg_Patroling, 0.25 )
call TriggerAddAction( gg_trg_Patroling, function Trig_Patroling_Actions )
endfunction
Старый 15.09.2007, 21:27
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
вара под рукой нет, писал на память.
Основная суть в проверке выполнения отдельных узлов алгоритма за счет выведения текстовых меток. попробуй понатыкаь там, где, возможно, выполнение почему-то не идет.
Старый 15.09.2007, 21:46
ScorpioT1000
Работаем
online
Опыт: отключен
Не, второй ответ твой я понял. А вот первый =\ .. ладно попробую... событие с малым периодом блин.
Старый 15.09.2007, 21:50
J
expert
offline
Опыт: 48,447
Активность:
Код:
function DistanceBetweenCord takes real AX, real AY, real BX, real BY returns real
    local real dx = BX - AX
    local real dy = BY - AY
    return SquareRoot(dx * dx + dy * dy)
endfunction 

function Act takes unit PatrolUnit, group PatrolRndUnitGroup returns nothing
    local real PatrolStandX = GetUnitX(PatrolUnit)
    local real PatrolStandY = GetUnitY(PatrolUnit)
    local real RandomLen = GetRandomReal(150, 300)
    local real RandomAng = GetRandomReal(0  , 360)
    local real PatrolPointX = PatrolStandX+RandomLen*Cos(RandomAng*bj_DEGTORAD)     
    local real PatrolPointY = PatrolStandY+RandomLen*Sin(RandomAng*bj_DEGTORAD)    
    call IssuePointOrder(PatrolUnit, "attack", PatrolPointX, PatrolPointY)
    call TriggerSleepAction(DistanceBetweenCord(PatrolStandX, PatrolStandY, PatrolPointX, PatrolPointY)/GetUnitMoveSpeed(PatrolUnit))
    call GroupAddUnit(udg_NotPatrolingUnits, PatrolUnit)
    call TriggerSleepAction(GetRandomReal(3, 6))
    call IssuePointOrder(PatrolUnit, "attack", PatrolStandX, PatrolStandY)
    call GroupRemoveUnit(udg_NotPatrolingUnits, PatrolUnit)
endfunction

function Patroling_Filter takes nothing returns boolean
    local unit UnitFilter = GetFilterUnit()
    local integer PlayId = GetPlayerId(GetOwningPlayer(UnitFilter))
    return (PlayId == 2 or PlayId == 9) and not IsUnitInGroup(UnitFilter, udg_NotPatrolingUnits)// (GetUnitCurrentOrder(UnitFilter) == String2OrderIdBJ("stop")))
endfunction

function Patroling_Actions takes nothing returns nothing
    local group PatrolRndUnitGroup = GetUnitsInRectMatching(bj_mapInitialPlayableArea, Filter(function Patroling_Filter))
    local unit PatrolUnit = GroupPickRandomUnit(PatrolRndUnitGroup)
    if PatrolUnit != null then
        call Act(PatrolUnit, PatrolRndUnitGroup)
    endif
endfunction

function InitTrig_Patroling takes nothing returns nothing
    local timer Timer = CreateTimer()
    call TimerStart(Timer, 0.25, true, function Patroling_Actions)
    set Timer = null
endfunction

Отредактировано Jon, 15.09.2007 в 22:48.
Старый 15.09.2007, 22:37
ScorpioT1000
Работаем
online
Опыт: отключен
Ну все, вродь можно уже было закрывать. И код снести лучше от чужих глаз =)
Старый 18.09.2007, 04:12
Закрытая тема

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

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

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

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



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