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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
30
Открываю страшную тайну: 0.0 0.0 не обязательно находится в центре карты.

PrincePhoenix, рифт в этом вопросе это другая часть карты.
29
Открываю страшную тайну: 0.0 0.0 не обязательно находится в центре карты.
Полагаю из-за изменения границ после создания карты? Вот этого не знал. Спасибо
19
NazarPunk:
Нет, кодом таки не проще. Можешь из всего этого выделить конкретно Х и У, в которые должен быть перемещен юнит? Желательно в одну строчку, через скобки, а не дробным кодом.
Я то как раз понял, что ХУ измерения/ХУ игровой - это получается %, за счет которого мы и находим нужные коорды в области, но я как раз не раздуплился с тем, что для тебя "просто" - что нужно там делить/множить на этот процент)
(да, у меня ваще не математический склад ума, трудно формулы воображать в голове)
28
Так всё очень просто же. Нужны только функции 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
30
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;
}
Это безо всех проверок и прочей шелухи, тупо принцип.

Хотя для красоты можно векторы использовать в явном виде, но ради только этого спела я бы париться не стал
28
Это безо всех проверок и прочей шелухи, тупо принцип.
Ну а я что сделал?)
30
PT153, использовал кучу ненужных элементов, например
28
использовал кучу ненужных элементов, например
И какие же? Я сделал всё в точности тоже самое, что и ты, но без определения и назначения ненужных локалок.
30
в точности тоже самое, что и ты
>использует центральные координаты

На Ratio, кстати, умножают.

Типа, моя цель - объяснить как работает принцип, а ты тупо утилитарно упаковал формулы без каких-либо пояснений
30
просто омерзительный стиль всё что можно в анонимные функции пихать.
А чем при компиляции анонимная функция от обычной отличается? А так весь код читается сверху вниз и ненужно выдумывать названия функций.
30
NazarPunk, сама фраза "стиль написания" подразумевает чтение написанного.
Названия методов должны нести смысл, конфликты имён решаются областями видимости.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.