Короче, мучу такую тему, юнит может тпшить способностью пацанов на время в другое измерение, которое раз в 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
используйте Рев
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Феникс
Автор просто не учил геометрию)
X/10 = 100
Позиция каждого юнита сместится относительно всей карты в 10 раз
Если конечно автор не подразумевает телепорт по наведению в определённое место, там тоже изи
Отредактирован Clamp
Отредактирован Феникс
Юнит стоит в (1250, 500)
После каста юнит встанет (475, 400)
Позиция юнита сместится от центра применения способности пропорционально его позиции относительно центра мировых координат, зачем тут лишний гемор?)
Нет, кодом таки не проще. Можешь из всего этого выделить конкретно Х и У, в которые должен быть перемещен юнит? Желательно в одну строчку, через скобки, а не дробным кодом.
Я то как раз понял, что ХУ измерения/ХУ игровой - это получается %, за счет которого мы и находим нужные коорды в области, но я как раз не раздуплился с тем, что для тебя "просто" - что нужно там делить/множить на этот процент)
(да, у меня ваще не математический склад ума, трудно формулы воображать в голове)
Отредактирован PT153