Короче, мучу такую тему, юнит может тпшить способностью пацанов на время в другое измерение, которое раз в 10 меньше игровой карты, но я хочу чтобы их ТПшило в соотв. коорды области измерения, тем, в которых они были на карте, и наоборот. Допустим челик стоит в углу области карты - его портанет в тот же угол в измерении. Из центра - в центр, ну и тп.
Я понимаю что это супер-изи формула, в башке даже школьник нарисует, но я не спал уже сутки и моя башка не рисует ничего, а закончить это дело хочу поскорее. Подскажите какой формулой там считать эти коорды куда тпшить, типа товоу x=(MaxX(b)-MinX(b))*(MinX(a)/MinX(b)), хз

Принятый ответ

Вам всеголишь нужно знать отношение между облатями.
Например:
игровая = 1000x500
измерение = 100х50
dx = ширина_измерения/ширина_игровой = 100/1000 = 0.1
dy = высота_измерения/высота_игровой = 50/500 = 0.1
Ну а дальше просто получаете x,y героя относительно левого верхнего угла игровой и телепортируете в
x1*dx
y1*dx
где x1,y1 левый верхний угол измерения.
Проще кодом объяснить
//! zinc
library Test {
    region R1, R2;
    real X1, Y1, X2, Y2, DX, DY, W1, W2, H1, H2;
    integer AbilityID = 'Aroa';

    function onInit(){
        trigger t = CreateTrigger();
        integer i;
        unit u = gg_unit_edoc_0000;
        
        FogEnable(false);
        FogMaskEnable(false);
        
        SelectUnit(u, true);
        PanCameraToTimed(GetUnitX(u), GetUnitY(u), 0);
        
        X1 = GetRectMinX(gg_rct_R1);
        Y1 = GetRectMinY(gg_rct_R1);
        X2 = GetRectMinX(gg_rct_R2);
        Y2 = GetRectMinY(gg_rct_R2);
        W1 = GetRectMaxX(gg_rct_R1) - X1;
        W2 = GetRectMaxX(gg_rct_R2) - X2;
        H1 = GetRectMaxY(gg_rct_R1) - Y1;
        H2 = GetRectMaxY(gg_rct_R2) - Y2;
        
        R1 = CreateRegion();
        R2 = CreateRegion();
        RegionAddRect(R1, gg_rct_R1);
        RegionAddRect(R2, gg_rct_R2);
        
        for (0 <= i < bj_MAX_PLAYER_SLOTS){
            TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        }
        TriggerAddCondition(t, Condition(function() -> boolean {
            unit u = GetTriggerUnit();
            real x, y, dx, dy;
            boolean isMove = false;
            
            if (GetSpellAbilityId() == AbilityID){
                
                if (IsUnitInRegion(R1, u)){
                    dx = GetUnitX(u) - X1;
                    dy = GetUnitY(u) - Y1;
                    x = X2 + dx*W2/W1;
                    y = Y2 + dy*H2/H1;
                    isMove = true;
                }
                if (IsUnitInRegion(R2, u)){
                    dx = GetUnitX(u) - X2;
                    dy = GetUnitY(u) - Y2;
                    x = X1 + dx*W1/W2;
                    y = Y1 + dy*H1/H2;
                    isMove = true;
                }
                
                if (isMove){
                    SetUnitX(u, x);
                    SetUnitY(u, y);
                    PanCameraToTimed(x, y, 0);
                }
                
            }
            u = null;
            return false;
        }));
        
        BJDebugMsg("Используйте Рев для телепортации");
        
        t = null; u = null;
    }
}
//! endzinc
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
29
5 лет назад
0
придётся прочитать ВЕСЬ код, а не тупо названия методов
А где я говорил, что анонимные функции это панацея? В этом случае это применимо и работает, почему не да.
7
30
5 лет назад
7
NazarPunk, потому что вопрос был не "сделайте за меня", а "напомните принцип", а принципы объясняют, а не реализуют
2
17
5 лет назад
2
Это может пригодиться:
    public real PPx
    public real PPy

    public function PolarProjection takes unit u, real dist, real angle returns nothing
        set PPx=GetUnitX(u)+dist*Cos(angle*bj_DEGTORAD)
        set PPy=GetUnitY(u)+dist*Sin(angle*bj_DEGTORAD)
    endfunction
    
    public function PolarProjectionXY takes real x, real y, real dist, real angle returns nothing
        set PPx=x+dist*Cos(angle*bj_DEGTORAD)
        set PPy=y+dist*Sin(angle*bj_DEGTORAD)
    endfunction
0
29
5 лет назад
0
PyCCKuu_4eJl, да вы просто заинлайнили формулы((
куча рефлексии о том, что коддеры покинули XGM(((
0
28
5 лет назад
0
Это может пригодиться:
Имхо, но мой способ или способ Clamp очевиднее.
Этот комментарий удален
0
19
5 лет назад
Отредактирован Darknessay
0
Да ну ля, ну народ, зачем тут срач, я просто тупой и не могу додуматься в первую часть формулы((
Вторая часть - это махХ(измерение)/махХ(карта) - получится процент, на который нужно умножить первую часть(то есть координаты юнита в области карты).
Мне не нужны целые функции и структуры, я не нубас, я знаю куда мне это нужно будет вписать, я просто прошу посчитать за меня, потому что я тупой.
gg_rct_KamuiD - область измерения
gg_rct_KamuiW - область карты
Мне тут вообще челик порекомендовал умножать расстояние переносимого юнита от ХУ центра карты, но я знаю что это балбесский путь
Все что мне нужно - это одна строчка с формулой типа
SetUnitX(u,(_*_)*(_*_))
4
30
5 лет назад
4
Тебе разжевали принцип три человека разными способами, попробуй их прочитать и применить.
0
27
5 лет назад
Отредактирован Феникс
0
Darknessay, Давай для начала определимся, дай точную формулировку действия способности, я тебя понял так:
Берётся группа юнитов на игровой карте и переносится в другую область на карте, уменьшенную в 10 раз, нужно сохранить порядок юнитов на карте в указанной области, уменьшив пропорции в 10 раз, верно?
0
28
5 лет назад
Отредактирован PT153
0
SetUnitX(u,(_*_)*(_*_))
Я так и сделал в этом комментарии.
На всякий случай напишу в 1 строчку.
function TeleportToSmallUniverse tales unit u returns nothing
    call SetUnitX(u, (GetUnitX(u) - GetRectCenterX(GetWorldBounds())) * 0.1 + GetRectCenterX(SmallUniverse_Rect))
    call SetUnitY(u, (GetUnitY(u) - GetRectCenterY(GetWorldBounds())) * 0.1 + GetRectCenterY(SmallUniverse_Rect))
endfunction
0
29
5 лет назад
0
я не нубас
я тупой
Противоречие вижу я.

Clamp:
Тебе разжевали принцип три человека разными способами, попробуй их прочитать и применить.
Присоединяюсь.
0
19
5 лет назад
Отредактирован Darknessay
0
PT153:
SetUnitX(u,(_*_)*(_*_))
Я так и сделал в этом комментарии.
На всякий случай напишу в 1 строчку.
function TeleportToSmallUniverse tales unit u returns nothing
    call SetUnitX(u, (GetUnitX(u) - GetRectCenterX(GetWorldBounds())) * 0.1 + GetRectCenterX(SmallUniverse_Rect))
    call SetUnitY(u, (GetUnitY(u) - GetRectCenterY(GetWorldBounds())) * 0.1 + GetRectCenterY(SmallUniverse_Rect))
endfunction
Почти, только у тебя оно умножается на 0.1 (делится на 10), а вместо этого нужно воткнуть вычисление, потому что вторая область не буквально меньше в 10 раз, она просто меньше, и это должно быть высчитано.
И ворлдбоундс здесь не в тему, потому что.
И в смысле, подожди, а если у меня центр карты не в нулевых координатах, или если мне понадобится тепать юнита обратно из области по той же схеме?
PrincePhoenix:
Да, только область не уменьшена в 10 раз. Она просто меньше.
Точная формулировка действия:
Берется группа юнитов вокруг ХУ и переносятся в область, в другое ХУ, вычисленное с пропорциональным сохранением расстояния до краев области.
Нужно чтобы этот код можно было перевернуть в другую сторону и я мог тепать юнитов из области измерения в область мира, также, пропорционально расстоянию до краев(НУ КАК ПОРТАЛ В НЕЗЕР В МАЙНКРАВТЕ ПОЗВОЛЯЕТ ПРОХОДИТЬ БОЛЬШИЕ РАССТОЯНИЯ, ПОТОМУ ЧТО НЕЗЕР МЕНЬШЕ ВЕРХНЕГО МИРА)
Clamp:
Тебе разжевали принцип три человека разными способами, попробуй их прочитать и применить.
Каждый пишет что то свое, применяет какие то свои топовые функции и методики, где все расчеты разбиты на составляющие, которые я боюсь запороть при обьединении всего этого в одну единственную строчку, которую я изначально попросил.
Загруженные файлы
0
29
5 лет назад
0
Darknessay, дык у меня же в первом комментарии реализовано для любых пропорций.
2
30
5 лет назад
2
я боюсь запороть при обьединении всего этого в одну единственную строчку
Читаю: "я боюсь подумать".
0
29
5 лет назад
0
при обьединении всего этого в одну единственную строчку
А зачем плодить зубодробильно нечитаемые строки?
0
28
5 лет назад
Отредактирован PT153
0
И ворлдбоундс здесь не в тему, потому что.
GetWorldBound() возвращает рект в границах всей карты, независимо от того, какой центр. Вместо всей карты можно поставить ту область, что надо.
если мне понадобится тепать юнита обратно из области по той же схеме?
Ну камон, я дал ссылку на комментарий, там есть обратная функция.

Формулы из области А в область Б и наоборот. Вместо C можно подставить любое измерение. Вместо "какой-то точки" можно взять центр или левую нижнюю точку, тогда соответствующие им точки также центр и также левая нижняя точка другой области.
// Из А в Б
call SetUnitC(u, (GetUnitC(u) - <Координата C какой-то точки A>) * (отношение области А к области Б по координате C) + <Координата C соответствующей точки в области Б>)

// Из Б в А
call SetUnitC(u, (GetUnitC(u) - <Координата C какой-то точки Б>) * (отношение области Б к области А по координате C) + <Координата C соответствующей точки в области А>)
Принцип таков: находим разницу в координатах между позицией и "особой" точкой области А, умножаем на коэффициент, прибавляем координату точки области Б, что соответствует "особой" точке области А.
какие то свои топовые функции и методики
Да тут все об одном и том же, просто то точки разные, то ещё что-то.
0
26
5 лет назад
0
Clamp:
я боюсь запороть при обьединении всего этого в одну единственную строчку
Читаю: "я боюсь подумать".
Сначала значит удалил мои комментарии здесь об этом, а теперь повторил эту мысль спустя десятки комментариев.
Эти комментарии были сразу направлены на решение основной проблемы пользователя, а не одно из её следствий. Он же с 2015-го года здесь, неужели за это время не стало очевидно, что он за фрукт?
0
30
5 лет назад
0
Сначала значит удалил мои комментарии здесь об этом
Не говори того, о чём не знаешь.
0
28
5 лет назад
Отредактирован PT153
0
Если Darknessay не устраивает узконаправленный вариант, который я дал в комментарии выше, то ниже выкладываю общий.
раскрыть
scope RelationalTeleporter initializer init
globals
    constant group EmptyGroup = CreateGroup()
    
    real RatioX
    real RatioY
    real MinX_A
    real MinX_B
    real MinY_A
    real MinY_B
    
    private boolexpr filter
endglobals

function TeleportAllUnitsFromRectAToRectB takes rect a, rect b returns nothing
    // X
    set MinX_A = GetRectMinX(a)
    set MinX_B = GetRectMinX(b)
    set RatioX = (GetRectMaxX(b) - MinX_B) / (GetRectMaxX(a) - MinX_A)
    // Y
    set MinY_A = GetRectMinY(a)
    set MinY_B = GetRectMinY(b)
    set RatioY = (GetRectMaxY(b) - MinY_B) / (GetRectMaxY(a) - MinY_A)
    
    call GroupEnumUnitsInRect(EmptyGroup, a, filter)
endfunction

function TeleportFromAToB_Filter takes nothing returns boolean
    local unit u = GetFilterUnit()
    call SetUnitX(u, (GetUnitX(u) - MinX_A) * RatioX + MinX_B)
    call SetUnitY(u, (GetUnitY(u) - MinY_A) * RatioY + MinY_B)
    set u = null
    return false
endfunction

function init takes nothing returns nothing
    set filter = Filter(function TeleportFromAToB_Filter)
endfunction

endscope
Загруженные файлы
Чтобы оставить комментарий, пожалуйста, войдите на сайт.