Четверг, 09.02.2012, 14:26


Приветствую Вас Гость

Меню сайта
Категории каталога
Создание игр [150]
Статьи об общих понятиях связанных с созданием игр
Движки и Гейммейкеры [84]
Статьи о программах для создания игр
Игры [39]
Статьи об играх, в том числе и сделанных на гейммейкерах
Софт [25]
Различные программы, в том числе в помощь игроделам
Разное [61]
Статьи, которые не вошли в определённые разделы
Наш опрос
Типа какой из этих игр вы предпочитаете делать игры?
Всего ответов: 9054
Главная » Статьи » Создание игр

Game maker. Основы. Создание игры. Часть 3
Как это будет.

Изучив элементарные основы, невольно задаешься вопросом «а что дальше?». А дальше, уже пора сделать нечто полезное, что-то, что можно будет использовать как основу для своей игры. Но для начала давайте определимся с подходом. Итак, вот несколько вещей, которые будем учитывать:

  • Все переменные будут объявляться в событии Create отдельно взятого объекта.

  • Чтобы обратится к какой-либо переменной, будем использовать имя объекта (obj_name.obj_var). То есть обойдемся без глобальных переменных.

  • События Create, Draw, Step (все три), Alarm – единственные в нашем арсенале. Все действия будут описываться в них.

  • В действиях «Execute Code» или «Execute Script» мы будем вызывать написанные нами скрипты.

    Для столкновений нам потребуется всего один объект – объект-родитель. В игре может быть много объектов, а проверять столкновение с каждым в отдельности - слишком долго. С увеличением количества обеъктов-родителей они будут разделены на разные категории (например, предметы, которые можно подобрать, и которые можно разрушить).

    Вот далеко неполный список скриптов. Нам нужно будет их создать. Сделаем это чуть позже.

    Перемещение и проверка столкновений.

    Если перемещение объекта по комнате делается достаточно просто, то одним из сложнейших моментов в создании игры может стать - проверка столкновений. Благо, что в GML есть несколько встроенных функций для их проверки. Давайте рассмотрим эти вопросы более подробно, начиная с перемещения.

    Есть несколько способов задать скорость и направление движения объекту, но нам хватит перечисленных ниже.

  • Способ первый: использовать свойства объекта HSpeed и VSpeed – вертикальная и горизонтальная скорость соответственно. Этот вариант мы и будем использовать, поскольку понятно и просто.

  • Способ второй: использовать свойство Speed – скорость перемещения как таковая, независимо от направления, которое, в свою очередь, задается свойством Direction (может принимать значения от 0 до 360).

  • Способ третий: менять 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 (ссылка). Там Вы обнаружите несколько дополнительных объектов: лифт, пистолет (точнее, просто стрельба пульками), лесенка.
    На этом всё. Спасибо за внимание.

  • Категория: Создание игр | Добавил: Spihex (28.06.2010)
    Просмотров: 2471 | Рейтинг: 5.0/4
    Теги: Game Maker, столкновения, Платформер, Основы
    » Дополнительные опции «
    Всего комментариев: 4
    -2  
    4 ChupMobil   (15.01.2011 10:49)
    biggrin

    +1  
    2 Deuce   (05.08.2010 13:32)
    На этом всё. Спасибо за внимание.
    Всё-уроков больше не будет? surprised

    +1  
    3 Spihex   (05.08.2010 14:57)
    В ближайшее время не планируется. Все вопросы, пожелания и заявки на рассмотрение следующих вопросов по созданию игры принимаются здесь

    +2  
    1 gamerX   (05.07.2010 14:25)
    smile

    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]
    Ссылки по теме
    Поиск
    10 случайных движков
    CAST II
    LawMaker Game Engine
    Grit
    PlayCrafter
    vbGORE
    DarkBASIC
    Castle Game Engine
    Unigine
    Alice
    Vicious Engine
    Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр Игорный бизнес в России Loadka.ru – загрузка файлов
    Все права сохранены. GcUp.ru © 2008-2012