Короче, мучу такую тему, юнит может тпшить способностью пацанов на время в другое измерение, которое раз в 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
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
2 комментария удалено
0
27
5 лет назад
Отредактирован Феникс
0
8gabriel8, Steal nerves, Я имел в виду, что в их возрасте мы дроби проходили, а они уже функции изучают.
Автор просто не учил геометрию)

Я конечно могу быть тупым, но например:
SetUnitPos(u, GetUnitX()/10, GetUnitY()/10) 
Разве не проще?)
Подробнее
X = 1000 по глобальным координатам
X/10 = 100
Позиция каждого юнита сместится относительно всей карты в 10 раз

Координаты всегда статичны относительно центра глоабльных координат.
Если конечно автор не подразумевает телепорт по наведению в определённое место, там тоже изи
Этот комментарий удален
0
30
5 лет назад
Отредактирован Clamp
0
А можно просто создавать вектор к юниту от любой точки исходной области, делить его на отношение сторон, откладывать от соответствующей точки целевой области и спавнить юнита там.
0
27
5 лет назад
Отредактирован Феникс
0
Я по-прежнему не понимаю всех этих извращений с геометрией:
X = GetUnitX()
Y = GetUnitY()
SetUnitPos (GetSpellX()+X/10), GetSpellY()+Y/10)

Кастует например маг спелл в точку (350, 350)
Юнит стоит в (1250, 500)
После каста юнит встанет (475, 400)
Позиция юнита сместится от центра применения способности пропорционально его позиции относительно центра мировых координат, зачем тут лишний гемор?)
1
30
5 лет назад
1
Открываю страшную тайну: 0.0 0.0 не обязательно находится в центре карты.

PrincePhoenix, рифт в этом вопросе это другая часть карты.
0
27
5 лет назад
0
Открываю страшную тайну: 0.0 0.0 не обязательно находится в центре карты.
Полагаю из-за изменения границ после создания карты? Вот этого не знал. Спасибо
0
19
5 лет назад
0
NazarPunk:
Нет, кодом таки не проще. Можешь из всего этого выделить конкретно Х и У, в которые должен быть перемещен юнит? Желательно в одну строчку, через скобки, а не дробным кодом.
Я то как раз понял, что ХУ измерения/ХУ игровой - это получается %, за счет которого мы и находим нужные коорды в области, но я как раз не раздуплился с тем, что для тебя "просто" - что нужно там делить/множить на этот процент)
(да, у меня ваще не математический склад ума, трудно формулы воображать в голове)
1
28
5 лет назад
Отредактирован PT153
1
Так всё очень просто же. Нужны только функции TeleportToSmallUniverse и TeleportBack. Всё остальное просто вспомогательное.
раскрыть
scope UniverseShrinker initilizer init
globals
    rect WorldBounds
    real MAX_X
    real MIN_X
    real MAX_Y
    real MIN_Y
    real CENTER_X
    real CENTER_Y
    
    rect SmallUniverse_Rect
    real SmallUniverse_CenterX
    real SmallUniverse_CenterY
    constant real SmallUniverse_Ratio = 10.
endglobals

function TeleportToSmallUniverse tales unit u returns nothing
    call SetUnitX(u, (GetUnitX(u) - CENTER_X) / SmallUniverse_Ratio + SmallUniverse_CenterX)
    call SetUnitY(u, (GetUnitY(u) - CENTER_Y) / SmallUniverse_Ratio + SmallUniverse_CenterY)
endfunction

function TeleportBack tales unit u returns nothing
    call SetUnitX(u, (GetUnitX(u) - SmallUniverse_CenterX) * SmallUniverse_Ratio + CENTER_X)
    call SetUnitY(u, (GetUnitY(u) - SmallUniverse_CenterY) * SmallUniverse_Ratio + CENTER_Y)
endfunction

private function init takes nothing returns nothing
    set WorldBounds = GetWorldBounds()
    set MAX_X = GetRectMaxX(WorldBounds)
    set MIN_X = GetRectMinX(WorldBounds)
    set MAX_Y = GetRectMaxY(WorldBounds)
    set MIN_Y = GetRectMinY(WorldBounds)
    set CENTER_X = GetRectCenterX(WorldBounds)
    set CENTER_Y = GetRectCenterY(WorldBounds)
    
    set SmallUniverse_Rect = Rect(...)
    set SmallUniverse_CenterX = GetRectCenterX(SmallUniverse_Rect)
    set SmallUniverse_CenterY = GetRectCenterY(SmallUniverse_Rect)
endfunction

endscope
1
30
5 лет назад
Отредактирован Clamp
1
NazarPunk, просто омерзительный стиль всё что можно в анонимные функции пихать.
Если очень по-тупому:

float gameAreaOriginX;
float gameAreaOriginY;

float riftAreaOriginX;
float riftAreaOriginY;

float riftScale;

void onAbility() {
    unit target = GetTriggerUnit();

    int targetX = GetUnitX(target) - gameAreaOriginX;
    int targetY = GetUnitY(target) - gameAreaOriginY;

    targetX = targetX*riftScale;
    targetY = targetY*riftScale;

    SetUnitX(u, riftAreaOriginX + targetX);
    SetUnitY(u, riftAreaOriginY + targetY);

    target = null;
}
Это безо всех проверок и прочей шелухи, тупо принцип.

Хотя для красоты можно векторы использовать в явном виде, но ради только этого спела я бы париться не стал
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.