Всем здравствуйте. Сегодня я хотел бы рассказать вам, как можно простым способом сымитировать поведение веревки-поводка.
Что мы получим в конце: объект "привязанный" псевдо-веревкой к курсору и следующий за ним.
Итак, для начала нам понадобятся два спрайта:
spr_block - квадратный объект 32х32
spr_curs - спрайт курсора, я сделал его размером 16х16
Теперь создадим два объекта
obj_block и
obj_curs, и назначим этим объектам соответствующие спрайты.
Первым делом заставим наш курсор следовать за мышкой с определенной скоростью, для этого в объекте
obj_curs в событии
step пропишем:
Code
mp_potential_step(mouse_x,mouse_y,10,0)
mp_potential_step заставляет объект двигаться к точке
mouse_x,
mouse_y со скоростью 10. В дальнейшем скорость можно будет перенастроить, а при желании вообще не использовать объект курсора, а взять за основу саму мышь.
На этом
obj_curs можно отложить в сторонку и заняться
obj_block, в котором и будет прописан весь основной код.
Заходим в объект блока и в событии
create создаем две переменные:
Переменная
p у нас будет отвечать за само построение нашей псевдо-веревке, подробнее об этом вы узнаете ниже.
Переменная
l отвечает за длину веревки.
Переменные
n и
m будут формировать смещение веревки, о котором так же будет рассказано ниже.
С переменными разобрались. Теперь создаем событие
Draw в котором и будет творить всё самое интересное.
Первое, что нужно, это отрисовать сам спрайт нашего obj_block, для этого напишем следующее:
Code
draw_sprite(sprite_index,0,x,y)
Теперь перейдем к формированию веревки. Пора раскрыть все карты и рассказать принцип её создания, а создана она будет на основе всем известный путей (
path).
Итак, чтобы создать псевдо-веревку на основе путей, нам понадобится следующий код:
Code
p=path_add()
path_set_kind(p,1)
path_set_closed(p,0)
path_insert_point(p,0,x,y,100)
if distance_to_object(obj_curs)<l-50
{
if x>object2.x
n=distance_to_point(obj_curs.x,y)/2
if x<object2.x
n=-distance_to_point(obj_curs.x,y)/2
}
else
n=0
path_insert_point(p,1,obj_curs.x+m,obj_curs.y+(l-distance_to_object(obj_curs))/1.5,100)
path_insert_point(p,2,obj_curs.x,obj_curs.y,100)
draw_path(p,x,y,0)
path_delete(p)
Давайте разберем его подробнее:
p=path_add() - создает новый путь и присваивает его идентификатор переменной
p. Теперь чтобы работать с новым путем, нам нужно обратиться к этой самой переменной.
path_set_kind(p,1) и
path_set_closed(p,0) указывают, что наш путь должен быть закругленным и не замкнутым, соответственно.
Рассмотрим в совокупности следующие строки, который непосредственно и формируют саму веревку:
path_insert_point(p,0,x,y,100) - задает начало веревки, которое находится в точке x,y, т.е. непосредственно на нашем obj_block
path_insert_point(p,1,obj_curs.x+m,obj_curs.y+(l-distance_to_object(obj_curs))/1.5,100) - чтобы веревка изгибалась, мы создаем одну промежуточную точку, координата
x у этой точки равна соответствующей координате
x у объекта
obj_curs со смещением на
m, координата
y так же равна соответствующей координате
у курсора, но смещается на
(l-distance_to_object(obj_curs))/1.5, т.е. на разность общей длины веревки и расстояния от
obj_block до курсора разделенной на 1.5 (этот параметр можно изменить, или же вообще поменять формулу на более реалистичную).
path_insert_point(p,2,obj_curs.x,obj_curs.y,100) - задает конец веревки, которое находится в точке x,y объекта obj_curs, т.е. непосредственно на нашем курсоре.
Наконец мы рисует нашу веревку через
draw_path(p,x,y,0), а затем удаляем путь
path_delete(p), чтобы в последствии создать вместо него новый, с новыми координатами.
Если оставить всё как есть, то изгиб будет не очень реалистичным, чтобы хоть как-то это исправить, был введен следующий блок кода:
Code
if distance_to_object(obj_curs)<l-50
{
if x>object2.x
n=distance_to_point(obj_curs.x,y)/2
if x<object2.x
n=-distance_to_point(obj_curs.x,y)/2
}
else
n=0
Что же делает этот код?! Он формирует отклонение по
x для центральной части веревки (та самая переменная
m, которая далее будет определяться через
n). Пока расстояние от
obj_block до
obj_curs меньше
l-50, центральная точка веревки отклоняется по
x на
distance_to_point(obj_curs.x,y)/2, в зависимости от того, в какую сторону направлена веревка. Если же расстояние от
obj_block до
obj_curs становится больше
l-50, отклонение становится равным
0.
Для отклонения уже сейчас можно использовать переменную
n вместо
m, но тогда переход к нулевому отклонению будет слишком резким, чтобы это исправить, напишем следующее:
Code
if m<n
m+=4
if m>n
m-=4
Тут вопросов быть не должно, если есть разница между
n и
m, то эта разница постепенно уменьшается, делая переход плавным. Ну вот и всё, с формированием псевдо-веревки мы закончили. При желании, можно добавить большей реалистичности дописав пару формул.
Но ведь у нас не просто веревка, а веревка-поводок, а это значит, что нужно научиться таскать предмет за эту веревку. Делается это очень просто:
Code
if distance_to_object(obj_curs)>=l
{
direction=point_direction(x,y,obj_curs.x,obj_curs.y)
speed=10
}
else
speed=0
Если расстояние от
obj_block до
obj_curs достигает предела, то направление движения
obj_block меняется, в зависимости от позиции obj_curs, и
obj_block начинает двигаться в сторону курсора со скоростью 10.
Ну вот и всё. Счастливо.
Исходник: СКАЧАТЬ