Короче, мучу такую тему, юнит может тпшить способностью пацанов на время в другое измерение, которое раз в 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
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
я боюсь запороть при обьединении всего этого в одну единственную строчку
Читаю: "я боюсь подумать".
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.