(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) (белым: гипотенуза)
но обычно оно того не стоит - проще воспользоваться взаимоотношением между sin/cos,_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) (белым: совмещенные смещения)
И это всё!