Короче, мучу такую тему, юнит может тпшить способностью пацанов на время в другое измерение, которое раз в 10 меньше игровой карты, но я хочу чтобы их ТПшило в соотв. коорды области измерения, тем, в которых они были на карте, и наоборот. Допустим челик стоит в углу области карты - его портанет в тот же угол в измерении. Из центра - в центр, ну и тп.
Я понимаю что это супер-изи формула, в башке даже школьник нарисует, но я не спал уже сутки и моя башка не рисует ничего, а закончить это дело хочу поскорее. Подскажите какой формулой там считать эти коорды куда тпшить, типа товоу x=(MaxX(b)-MinX(b))*(MinX(a)/MinX(b)), хз
Я понимаю что это супер-изи формула, в башке даже школьник нарисует, но я не спал уже сутки и моя башка не рисует ничего, а закончить это дело хочу поскорее. Подскажите какой формулой там считать эти коорды куда тпшить, типа товоу x=(MaxX(b)-MinX(b))*(MinX(a)/MinX(b)), хз
Принятый ответ
Вам всеголишь нужно знать отношение между облатями.
Например:
игровая = 1000x500
измерение = 100х50
Например:
игровая = 1000x500
измерение = 100х50
dx = ширина_измерения/ширина_игровой = 100/1000 = 0.1
dy = высота_измерения/высота_игровой = 50/500 = 0.1
dy = высота_измерения/высота_игровой = 50/500 = 0.1
Ну а дальше просто получаете x,y героя относительно левого верхнего угла игровой и телепортируете в
x1*dx
y1*dx
где x1,y1 левый верхний угол измерения.
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
используйте Рев
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
куча рефлексии о том, что коддеры покинули XGM(((
Отредактирован Darknessay
Вторая часть - это махХ(измерение)/махХ(карта) - получится процент, на который нужно умножить первую часть(то есть координаты юнита в области карты).
Мне не нужны целые функции и структуры, я не нубас, я знаю куда мне это нужно будет вписать, я просто прошу посчитать за меня, потому что я тупой.
gg_rct_KamuiD - область измерения
gg_rct_KamuiW - область карты
Мне тут вообще челик порекомендовал умножать расстояние переносимого юнита от ХУ центра карты, но я знаю что это балбесский путь
Все что мне нужно - это одна строчка с формулой типа
SetUnitX(u,(_*_)*(_*_))
Отредактирован Феникс
Берётся группа юнитов на игровой карте и переносится в другую область на карте, уменьшенную в 10 раз, нужно сохранить порядок юнитов на карте в указанной области, уменьшив пропорции в 10 раз, верно?
Отредактирован PT153
На всякий случай напишу в 1 строчку.
Отредактирован Darknessay
И ворлдбоундс здесь не в тему, потому что.
И в смысле, подожди, а если у меня центр карты не в нулевых координатах, или если мне понадобится тепать юнита обратно из области по той же схеме?
PrincePhoenix:
Да, только область не уменьшена в 10 раз. Она просто меньше.
Точная формулировка действия:
Берется группа юнитов вокруг ХУ и переносятся в область, в другое ХУ, вычисленное с пропорциональным сохранением расстояния до краев области.
Нужно чтобы этот код можно было перевернуть в другую сторону и я мог тепать юнитов из области измерения в область мира, также, пропорционально расстоянию до краев(НУ КАК ПОРТАЛ В НЕЗЕР В МАЙНКРАВТЕ ПОЗВОЛЯЕТ ПРОХОДИТЬ БОЛЬШИЕ РАССТОЯНИЯ, ПОТОМУ ЧТО НЕЗЕР МЕНЬШЕ ВЕРХНЕГО МИРА)