(click to interact)
(mouseover/click to play GIF)
(космический корабль из набора графики Kenney)
Но, увы — возможность задания и опроса произвольных точек на изображениях — к примеру, для выстрела снарядов из дула (показано), или крепления изображений на правильные точки, остается относительно редкой.
Это — небольшое руководство по теме.
Если вы знакомы с основами тригонометрии, вы уже и сами знаете, что вычислить смещение от точки в направлении можно с помощью синуса/косинуса:
new_x = x + cos(angle) * offset new_y = y + sin(angle) * offset(предполагая, что угол в радианах, как и аргументы функций)
Или, если вы используете GameMaker и любите измерение углов в градусах,
new_x = x + lengthdir_x(offset, angle) new_y = y + lengthdir_y(offset, angle)и это уже половина логики:
(click to interact)
(желтым: смещение по X)
new_x = x + cos(angle + pi / 2) * offset_y new_y = y + sin(angle + pi / 2) * offset_y(будет ли это +pi/2 или -pi/2 зависит от того, направления оси Y в системе координат)
или с помощью lengthdir функций и градусов в GM:
new_x = x + lengthdir_x(offset_y, angle - 90) new_y = y + lengthdir_y(offset_y, angle - 90)теперь вы уже проделали большую часть работы:
(click to interact)
(зеленым: смещение по Y)
new_x = x + cos(angle) * offset_x + cos(angle + pi / 2) * offset_y new_y = y + sin(angle) * offset_x + sin(angle + pi / 2) * offset_y
или, в GM
new_x = x + lengthdir_x(offset_x, angle) + lengthdir_x(offset_y, angle - 90) new_y = y + lengthdir_y(offset_x, angle) + lengthdir_y(offset_y, angle - 90)
и это всё
(click to interact)
(бирюзовым: совмещенное смещение)
(click to interact)
(белым: гипотенуза)
_cos = cos(angle) _sin = sin(angle) new_x = x + _cos * offset_x - _sin * offset_y new_y = y + _sin * offset_x + _cos * offset_yи, если вам нужно учитывать локальный масштаб, вы можете домножить каждое из смещений,
new_x = x + cos(angle) * offset_x * scale_x + cos(angle + pi / 2) * offset_y * scale_y new_y = y + sin(angle) * offset_x * scale_x + sin(angle + pi / 2) * offset_y * scale_yили, в GM,
new_x = x + lengthdir_x(offset_x * scale_x, angle) + lengthdir_x(offset_y * scale_y, angle - 90) new_y = y + lengthdir_y(offset_x * scale_x, angle) + lengthdir_y(offset_y * scale_y, angle - 90)
(click to interact)
(белым: совмещенные смещения)