Четверг, 21 Ноября 2024, 17:22

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

Меню сайта
Категории каталога
Создание игр [358]
Статьи об общих понятиях связанных с созданием игр.
Программирование [83]
Гайды по программированию на разных ЯП.
Движки и Гейммейкеры [147]
Статьи о программах для создания игр, уроки и описания.
Софт [43]
Различные программы, в том числе в помощь игроделам.
2D-графика [14]
Уроки по рисованию, растр, пиксель-арт, создание спрайтов и пр.
3D-графика [17]
Уроки по моделированию, ландшафт, модели, текстурирование и пр.
Моддинг игр [5]
Модификация компьютерных игр, создание дополнений, перевод, хакинг.
Игры [167]
Статьи об играх, в том числе и сделанных на гейммейкерах.
Разное [132]
Статьи, которые не вошли в определённые разделы.
Наш опрос
Кто вы?
Всего ответов: 24700
Главная » Статьи » Создание игр

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 Июня 2010)
    Просмотров: 14150 | Комментарии: 4 | Рейтинг: 4.2/5 |
    Теги: Game Maker, столкновения, платформер, основы
    Дополнительные опции:
    Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

    Игровые объявления и предложения:
    Если вас заинтересовал материал «Game maker. Основы. Создание игры. Часть 3», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела. Предлагаются такие схожие материалы: Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.

    Всего комментариев: 4
    +-2-
    4 ChupMobil   (15 Января 2011 10:49) [Материал]
    ChupMobilbiggrin

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

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

    +2-
    1 gamerX   (05 Июля 2010 14:25) [Материал]
    smile

    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]
    Поиск по сайту
    10 случ. движков
  • Xamarin
  • iFAction
  • Yami RPG Editor
  • Arcade Game Studio
  • FIFE
  • Luxinia
  • WindMill
  • Diligent
  • Realm Crafter
  • Ray Game Designer
  • Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр
    Все права сохранены. GcUp.ru © 2008-2024 Рейтинг