Короче, мучу такую тему, юнит может тпшить способностью пацанов на время в другое измерение, которое раз в 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
используйте Рев
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован nazarpunk
Например:
игровая = 1000x500
измерение = 100х50
dy = высота_измерения/высота_игровой = 50/500 = 0.1
x1*dx
y1*dx
где x1,y1 левый верхний угол измерения.
Отредактирован Феникс
Автор просто не учил геометрию)
X/10 = 100
Позиция каждого юнита сместится относительно всей карты в 10 раз
Если конечно автор не подразумевает телепорт по наведению в определённое место, там тоже изи
Отредактирован Clamp
Отредактирован Феникс
Юнит стоит в (1250, 500)
После каста юнит встанет (475, 400)
Позиция юнита сместится от центра применения способности пропорционально его позиции относительно центра мировых координат, зачем тут лишний гемор?)