Изучив элементарные основы, невольно задаешься вопросом «а что дальше?». А дальше, уже пора сделать нечто полезное, что-то, что можно будет использовать как основу для своей игры. Но для начала давайте определимся с подходом. Итак, вот несколько вещей, которые будем учитывать:
Способ третий: менять X и Y координаты объекта. Например x+=5 перемещает объект вправо. Перемещая объект мы должны проверить, а не происходит ли столкновение. Есть несколько функций для выполнения этой задачи, но использовать будем всего две.
1. collision_line(x1,y1,x2,y2,obj,prec,notme)
2. collision_rectangle(x1,y1,x2,y2,obj,prec,notme)
Обе функции возвращают ID (идентификатор) объекта с которым происходит столкновение. Это очень удобно, потому как мы будем знать, с каким объектом оно произошло и как нам нужно себя вести. Посмотрите на рисунок ниже.
Зеленый прямоугольник – игрок, серый – стена и ступенька, желтый – враг.
Обратите внимание на красный штрих-прямоугольник (всего два) возле объекта «игрок» - он «нарисован» функцией collision_rectangle*. Вся его область будет проверятся на возможное столкновение со стеной. Заметили две коротких штрих-линии, идущие в обе стороны? Они тоже «нарисованы», но уже функцией collision_line - с её помощью будет проверять столкновение со ступенькой. Линии, идущие от врагов, не проверяют столкновение как таковое, а точнее – мы его используем с другой целью – проверить, видит ли нас враг. Тот, который за стеной, как Вы поняли, не может нас видеть. А теперь ещё чуть подробней обо всём этом.
* - Понятно что на самом деле она ничего рисовать не может: прямоугольник нарисован функцией draw_rectangle. Это сделано для удобства, что бы видеть область столкновения.
У нас есть объекты «игрок» и «платформа». Первое с чего начнем – определим их взаимоотношения так, чтобы игрок не проваливался сквозь неё. Для этого нам потребуется несколько скриптов, которые и будут проверять столкновения. Выполним уже знакомые нам действия.
Код действия «Execute script» для события «Create» объекта «o_player»:
p_oncreate()
Код действия «Execute script» для события «Step» объекта «o_player»:
p_onstep()
Это, как Вы заметили, названия скриптов, которые ещё не написаны и не созданы. Создайте два скрипта нажав на SHIFT+CTRL+C и назовите их как было написано выше. А теперь напишем для них код.
Код скрипта «p_oncreate»:
dcoll=0
Код скрипта «p_onstep»:
if p_dcoll()
{
vspeed=0
y=dcoll.bbox_top-o_player.sprite_height
jump=false
jumpd=false
stand=true
}
else
{
if vspeed<30 vspeed+=1
}
Должно быть Вы увидели скрипт с именем «p_dcoll» - он ещё не создан, исправьте это. Напишите в нем следующее:
Код скрипта «p_dcoll()»:
dcoll=collision_rectangle(o_player.x,o_player.bbox_bottom, o_player.x+19,o_player.bbox_bottom+5+vspeed,o_pplatform,false,false)
if dcoll >0
{
return true
}
else
{
return false
}
Запустите пример. Падает? Не провалился? Замечательно! Идем дальше. В игре не только пол есть, но и стены, лифт, лестница, коробка с пистолетом. Сейчас я приведу коды всех сценариев, которые и определяют все отношения между объектами
Полный код скрипта «p_oncreate» (убедитесь в том, что он вызывается в событии «Create» объекта «o_player»):
jump=false
jumpd=false
stand=true
drcoll=0
dlcoll=0
ucoll=0
dcoll=0
rcoll=0
lcoll=0
Полный код скрипта «p_onstep» (убедитесь в том, что он вызывается в событии «Step» объекта «o_player»):
if vspeed<0
{
if p_ucoll()
{
if ucoll.object_index=o_platform vspeed=0
}
}
if p_dcoll()
{
vspeed=0
y=dcoll.bbox_top-o_player.sprite_height
jump=false
jumpd=false
stand=true
}
else
{
if vspeed<30 vspeed+=1
}
if keyboard_check(vk_right)
{
if p_rcoll()
{
if rcoll.object_index=o_platform or rcoll.object_index=o_wall
{
hspeed=0
exit
}
}
if hspeed<5 hspeed+=1
if p_drcoll()
{
if drcoll.object_index=o_platform
y=drcoll.bbox_top-sprite_height
}
}
if keyboard_check(vk_left)
{
if p_lcoll()
{
if lcoll.object_index=o_platform or lcoll.object_index=o_wall
{
hspeed=0; exit
}
}
if hspeed>-5 hspeed-=1
if p_dlcoll()
{
if dlcoll.object_index=o_platform
y=dlcoll.bbox_top-sprite_height
}
}
if keyboard_check_pressed(vk_up)
{
stand=false
if jump=false
{
if vspeed>0 break
jump=true
vspeed=-10
}
else
if jump=true
{
if jumpd=false
{
if vspeed>0 break
jumpd=true
vspeed=-10
}
}
}
if keyboard_check_released(vk_right) or keyboard_check_released(vk_left)
{
hspeed=0
}
Если Вы попытаетесь запустить игру сейчас, ничего не выйдет - GM выдаст множество ошибок о не найденных скриптах. Что бы всё работало, Вам нужно создать следующие скрипты с соответствующим кодом в них.
Код скрипта «p_ucoll»:
ucoll=collision_rectangle(o_player.x,o_player.bbox_top,o_player.x+19,o_player.bbox_top-5, o_pplatform,false,false)
if ucoll >0
return true
else
return false
Код скрипта «p_rcoll»:
rcoll=collision_rectangle(o_player.bbox_right,o_player.y,o_player.bbox_right+1+hspeed,o_player.y+53, o_pplatform,false,false)
if rcoll >0
return true
else
return false
Код скрипта «p_lcoll»:
lcoll=collision_rectangle(o_player.bbox_left,o_player.y,
o_player.bbox_left-1-abs(hspeed),o_player.y+53,o_pplatform,false,false)
if lcoll >0
return true
else
return false
Код скрипта «p_drcoll»:
drcoll=collision_line(o_player.bbox_right,o_player.bbox_bottom,
o_player.bbox_right+1,o_player.bbox_bottom,o_pplatform,false,false)
if drcoll >0
return true
else
return false
Код скрипта «p_dlcoll»:
dlcoll=collision_line(o_player.bbox_left,o_player.bbox_bottom,
o_player.bbox_left-1,o_player.bbox_bottom,o_pplatform,false,false)
if dlcoll >0
return true
else
return false
Код скрипта «p_dcoll»:
dcoll=collision_rectangle(o_player.x,o_player.bbox_bottom,o_player.x+19, o_player.bbox_bottom+5+vspeed,o_pplatform,false,false)
if dcoll >0
return true
else
return false
Cкачайте пример-исходник с сайта www.Gcup.ru (ссылка). Там Вы обнаружите несколько дополнительных объектов: лифт, пистолет (точнее, просто стрельба пульками), лесенка.
На этом всё. Спасибо за внимание.