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

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

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

offline
Опыт: 49,907
Активность:
Как использовать правильно функцию EnumDestructablesInCircleBJ?
Код:
function GetRectFromCircleBJ takes location center, real radius returns rect
    local real centerX = GetLocationX(center)
    local real centerY = GetLocationY(center)
    return Rect(centerX - radius, centerY - radius, centerX + radius, centerY + radius)
endfunction

function EnumDestructablesInCircleBJ takes real radius, location loc, code actionFunc returns nothing
    local rect r

    if (radius >= 0) then
        set bj_enumDestructableCenter = loc
        set bj_enumDestructableRadius = radius
        set r = GetRectFromCircleBJ(loc, radius)
        call EnumDestructablesInRect(r, filterEnumDestructablesInCircleBJ, actionFunc)
        call RemoveRect(r)
    endif
endfunction


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

Steal nerves добавил:
сделал как задумал, но с filterEnumDestructablesInCircleBJ осталась проблема, из-за фильтра ничего не уничтожается, а если вместо него подставить null, то происходит во время движения дамика какая то ошибка, вар вылетает с ошибкой

Код:
set filterEnumDestructablesInCircleBJ = Filter(function EnumDestructablesInCircleBJFilter)

function EnumDestructablesInCircleBJFilter takes nothing returns boolean
    local location destLoc = GetDestructableLoc(GetFilterDestructable())
    local boolean result
    set result = DistanceBetweenPoints(destLoc, bj_enumDestructableCenter) <= bj_enumDestructableRadius
    call RemoveLocation(destLoc)
    return result
endfunction

Отредактировано Steal nerves, 19.11.2011 в 15:59.
Старый 19.11.2011, 15:54
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
ну вот примерно так можно
function KillDestr takes nothing returns nothing
call KillDestructable(GetEnumDestructable())
endfunction

function PoisonSpearMove takes nothing returns nothing
local timer t= GetExpiredTimer()
local integer id = GetHandleId(t)
local unit c = LoadUnitHandle(udg_H,id,0)
local unit d = LoadUnitHandle(udg_H,id,1)
local real a = LoadReal(udg_H,id,2)
local unit u
local boolean b = false
local rect r = LoadRectHandle(udg_H,id,StringHash("Rect"))
local real XE = LoadReal(udg_H,id,StringHash("XE"))
local real YE = LoadReal(udg_H,id,StringHash("YE"))
local real dist1 = LoadReal(udg_H,id,3)
local real x = GetUnitX(d)
local real y = GetUnitY(d)
local real dist = SQ(x,y,XE,YE)
call SetUnitX(d,SafeX(x+35.*Cos(a)))
call SetUnitY(d,SafeY(y+35.*Sin(a)))
call SetUnitFlyHeight(d,GetUnitFlyHeight(d)-2.,0)
if dist > 40. then
call MoveRectTo(r,x,y)
call EnumDestructablesInRect(r,null,function KillDestr)
else
call KillUnit(d)
call RemoveRect(r)
call DestroyTimer(t)
call FlushChildHashtable(udg_H,id)
endif
set t = null
set d = null
set c = null
set r = null
set u = null
endfunction

function PoisonSpear takes nothing returns nothing
local unit c = GetSpellAbilityUnit()
local real a = GetUnitX(c)
local real b = GetUnitY(c)
local real r = Atan2(GetSpellTargetY()-b,GetSpellTargetX()-a)
local real q = SafeX(a+800.*Cos(r))
local real w = SafeY(b+800.*Sin(r))
local unit d = CreateUnit(GetOwningPlayer(c),'h00D',a,b,r*bj_RADTODEG)
local timer t = CreateTimer()
local integer id = GetHandleId(t)
call UnitAddAbility(d,'Amrf')
call UnitRemoveAbility(d,'Amrf')
call SetUnitFlyHeight(d,90.,0)
call SaveUnitHandle(udg_H,id,0,c)
call SaveUnitHandle(udg_H,id,1,d)
call SaveReal(udg_H,id,2,r)
call SaveReal(udg_H,id,StringHash("XE"),q)
call SaveReal(udg_H,id,StringHash("YE"),w)
call SaveReal(udg_H,id,3,SQ(a,b,q,w))
call SaveRectHandle(udg_H,id,StringHash("Rect"),Rect(a-45.,b-45.,a+45.,b+45.))
call TimerStart(t,.03,true,function PoisonSpearMove)
set c = null
set t = null
set d = null
endfunction
Старый 19.11.2011, 16:25
Lipen

offline
Опыт: 1,550
Активность:
Выделяй всех в ректе, а убивай только тех, кто в круге (Дистанция <= радиус)
» Например как-то так
scope ENUM {
    private constant real radius = 500.
    private unit D //Dummy //set перед использованием функции Enum

    private void Enum() {
        real x = GetUnitX(D)
        real y = GetUnitY(D)
        rect r = Rect(x-radius, y-radius, x+radius, y+radius)

        EnumDestructablesInRect(r, null, lambda void EnumFilter(){
            real x = GetUnitX(D)
            real y = GetUnitY(D)
            destructable d = GetFilterDestructable()
            real x2 = GetWidgetX(d)
            real y2 = GetWidgetY(d)
            
            if SquareRoot((x-x2)*(x-x2) + (y-y2)*(y-y2)) <= radius {
                KillDestructable(d)
            }
            
            u = null
            d = null
        })
        RemoveRect(r)
        
        r = null
    }
}
Старый 19.11.2011, 16:29
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
.
Прикрепленные файлы
Тип файла: w3x Dests.w3x (17.2 Кбайт, 15 просмотров )
Старый 19.11.2011, 16:46
MpW

offline
Опыт: 49,907
Активность:
спасибо, все понял ))
Старый 19.11.2011, 16:51
Закрытая тема

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

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

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

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



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