Game Maker - создание игр | HellRoom Games
Апрель 19, 2025, 23:17:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Урок 9. Объекты  (Прочитано 22347 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Hummer
scio me nihil scire
GM Pro user
*

Репутация: 335
Offline Offline

Пол: Мужской
Награды:
2000 сообщений!За постоянность! [100 дней на форуме]За лояльность! [+300 репутации]Знаток Game Maker!За помощь новичкам!
API: Game Maker 8.0 Pro
Деятельность: GML, С++, OpenGL, Java. Бывший Директор бывшей школы GML
Сообщений: 2573


« : Июнь 07, 2011, 10:02:32 »

Привет, игроделы! Материал этого урока даст вам оооочень широкие возможности. Прочитав сегодняшний урок вы сможете сделать уже довольно развитую игрушку. Поэтому этим уроком мы с вами прервёмся на лето. Следующий урок будет только 28 августа. Читайте и запоминайте!
Думаю вы уже знаете что такое объекты. Они совмещают в себе все ресурсы, кроме комнат. В частности они являются хранителями событий и действий, а также носителями спрайтов. Насчёт событий и действий подробнее.
События мы очень подробно будем рассматривать аж в 4 сезоне
Каждый шаг ГМ проверяет возможность выполнения события. Если возможность появляется, то ГМ отдаёт сигнал на выполнение соответствующих действий. Поскольку вы обучаетесь в Школе ГМЛ, то действие у нас одно: Execute piece of code.
Событий в ГМ очень много - 353. Поэтому советую вам перед следующим прочтением полазить в событиях и узнать что к чему. Особенно советую уделить внимание вкладке Other.
А теперь...
... я вас познакомлю с несколькими функциями
instance_create(x, y, obj) - создаёт в точке (x, y) объект obj и возвращает его id
instance_destroy() - удаляет экземпляр объекта в котором прописан код
game_end() - завершает игру
game_restart() - перезапускает игру.

С этими функциями я могу вас завалить практическими заданиями, но нет лучшего практического задания, чем создавание игр. Поэтому я просто покажу несколько устоявшихся выражений в ГМЛ.

1) Создание объекта относительно краёв окна. Используются константы room_width, room_height. Например
Код:
instance_create(room_width-5, room_height/2, obj)

2) Создание объекта относительно положения мыши. Используются константы mouse_x, mouse_y. Например
Код:
instance_create(mouse_x+7, mouse_y-4, obj)

3) Создание n объектов через одинаковое расстояние t начиная с m по горизонтали
Код:
for(i=0; i<n; i+=1)
{
instance_create(m+i*t, y, obj)
}
3.1) -- по вертикали
Код:
for(i=0; i<n; i+=1)
{
instance_create(x, m+i*t, obj)
}
PS : если надо в обратном порядке, то минус заменяем на плюс

4) Создание объекта в случайном месте.
Код:
instance_create(random(room_width), random(room_height), obj)

5) Создание случайного объекта
Код:
instance_create(xx, yy, choose(obj1, obj2, obj3 ... obj16))
ИЛИ (на более 16 объектов)
Код: (Create)
object[0]=obj0
object[1]=obj1
object[n]=objn
...
Код: (Нужное событие)
instance_create(xx, yy, object[irandom(n)])

6) obj1 сталкивается с obj2, при этом obj1 должен исчезнуть
Код: (Collision WITH obj2 (то есть у obj1))
with(self)
{
instance_destroy()
}
ИЛИ
Код: (Collision WITH obj1 (то есть у obj2))
with(other)
{
instance_destroy()
}

7) Уничтожение объекта, если тот ниже нижней границы окна (например если игрок упал в пропасть в платформере)
Код: (Step)
if(y>room_height)
{
instance_destroy()
}

8) Завершить или перезапустить игру, если кончились жизни (или здоровье)
Код: (Step)
if(<переменная, отвечающая за здоровье или жизни><=0)
{
game_end()//или game_restart()
}

Хочу отметить одно свойство:
допустим у нас есть такой код
Код:
a=0
a+=6
a*=get_integer('', 0)
game_restart()
a-=7
a/=2
a*=3
game_restart() не прерывает игру. Сначала выполнится весь код, а только потом уже игра перезапустится. Аналогично с game_end(). Поэтому после этих функций предпочтительно ставить exit;
Теперь давайте рассмотрим пример простейшей игры. ТДС. Заготовим спрайты игрока, врага, пули игрока и пули врага. Создадим им соответствующие объекты o_gamer, o_enemy, o_gamer_bullet, o_enemy_bullet. Давайте составим концепцию игры:

Игрок всё время следит за мышью. При нажатии левой кнопкой мыши, создаётся пуля, которая летит туда, куда смотрел игрок. Враг - ИИ. То есть ходит сам по себе, но если игрок близко, то идёт к нему и начинает стрелять. У обоих есть жизни.

Вот в принципе и всё. Давайте воплощать. Начнём с игрока.
Цитата: Описание
Игрок всё время следит за мышью.
Всё время - событие Step, следит за мышью - изменяем поворот картинки.
Код: (Step)
direction=point_direction(x, y, mouse_x, mouse_y)
image_angle=direction
Теперь сделаем движение по кнопке вверх.
Код: (Keyboard <Up>)
speed=5
И чтобы сделать реалистику добавим
Код: (Create)
friction=0.8
Ах да, чуть не забыли главную вещь
Код: (Outside room)
move_wrap(1, 1, 0)
Отлично. Ставим игрока в комнату и запускаем. Теперь нужно сделать ему стрельбу.
Пишем
Код: (Global Left Pressed)
instance_create(x, y, o_gamer_bullet)
А движение пропишем у пули.
Код: (o_gamer_bullet Create)
direction=point_direction(x, y, mouse_x, mouse_y)//направление к мыши
speed=6
И ещё:
Код: (o_gamer_bullet Outside Room)
instance_destroy()//уничтожаем, когда улетела
Отлично теперь займёмся врагом. У него движение основано на рандоме. НО! Есть оговорка, что если игрок подойдёт слишком близко, то идёт по направлению к игроку. Для этого создадим переменную, отвечающую за расстояние до игрока.
Код: (o_enemy Create)
dist=point_distance(x, y, o_gamer.x, o_gamer.y)
А в шаге будем вычислять это значение
Код: (o_enemy Step)
dist=point_distance(x, y, o_gamer.x, o_gamer.y)
if(dist<=100)//а если игрок близко
{
move_towards_point(o_gamer.x, o_gamer.y, 4)//движемся к нему
}
Теперь создадим перемещение
Код: (o_enemy Create)
alarm[0]=room_speed*random_range(2, 3)
direction=random(360)
Код: (o_enemy Alarm0)
if(dist>100)//если игрок далеко
{
alarm[0]=room_speed*random_range(2, 3)
direction=random(360)
}
А теперь осталось соорудить стрельбу.
Код: (o_enemy Create)
alarm[1]=random(4*room_speed)
Код: (o_enemy Alarm1)
if(dist<=100)
{
alarm[1]=room_speed/2
}
else
{
alarm[1]=random(4*room_speed)
}
instance_create(x, y, o_enemy_bullet)
И у o_enemy_bullet в Create пропишите
Код: (o_enemy_bullet Create)
direction=point_direction(x, y, o_gamer.x, o_gamer.y)//направление к игроку
speed=6
иии
Код: (O_enemy Outside Room)
instance_destroy()
Так. Основа готова. Теперь осталось пара мелких штрихов. А именно пропадание пуль и жизни. Тут всё просто
Код: (o_gamer Create)
hp=100
Код: (o_gamer Collision with o_enemy_bullet)
with(other){instance_destroy()}
hp-=20//убьёт с 5 раз
Код: (o_gamer Step)
if(hp<=0)
{
show_message('Вы проиграли!')
game_restart()
}
Аналогично проделайте у o_enemy.

Ну чтож, на этом я с вами прощаюсь на лето. Всем пока и удачного игростроя!
« Последнее редактирование: Май 13, 2012, 07:58:05 от Hummer » Записан

Есть вещи, которые нельзя объяснить. Для всего остального есть Справка
Рандом-рандом-рандомище (с)

C++ & OpenGL
Fantom
I am... All of me
Гл. Администратор
*

Репутация: 1325
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [500 дней на форуме]За лояльность! [+1000 репутации]За отличные статьи по Game Maker!Тру Админ :DЗнаток Game Maker...
API: GameMaker Studio Master
Сообщений: 5026



« Ответ #1 : Июнь 07, 2011, 10:07:21 »

Записан

Hummer
scio me nihil scire
GM Pro user
*

Репутация: 335
Offline Offline

Пол: Мужской
Награды:
2000 сообщений!За постоянность! [100 дней на форуме]За лояльность! [+300 репутации]Знаток Game Maker!За помощь новичкам!
API: Game Maker 8.0 Pro
Деятельность: GML, С++, OpenGL, Java. Бывший Директор бывшей школы GML
Сообщений: 2573


« Ответ #2 : Июнь 07, 2011, 10:09:33 »

Исправил ;)
Записан

Есть вещи, которые нельзя объяснить. Для всего остального есть Справка
Рандом-рандом-рандомище (с)

C++ & OpenGL
redeek789789789
«Старожил форума»
******

Репутация: 42
Offline Offline

Пол: Мужской
Награды:
500 сообщений!За постоянность! [10 дней на форуме]
API: Game Maker 8.0 Pro
Деятельность: 3d model, GM, GML,осваиваю C#, HTML, Paint.net
Сообщений: 530



« Ответ #3 : Июнь 08, 2011, 10:14:50 »

хороший урок  ;)
Записан

Alcatraz
Flight Dream Studio
«Старожил форума»
******

Репутация: 392
Offline Offline

Пол: Мужской
Награды:
3000 сообщений!За постоянность! [100 дней на форуме]За лояльность! [+300 репутации]Знаток Unity 3D3 место в конкурсе: Адекватные игры #2 [Стимпанк]2 место за игру: Dead Night (Конкурс Золотые Руки)...
API: Unity 3D
Деятельность: C#, C++, UNITY3D
Сообщений: 3392


http://vk.com/alcatraz_rus


WWW
« Ответ #4 : Июнь 08, 2011, 11:36:43 »

Хаммер, отличный урок, молодец!)  ;)
Записан

Igor OK
Новичок
*

Репутация: 0
Offline Offline

Пол: Мужской
API: 8.0 Pro
Деятельность: Дизайн
Сообщений: 6


Пока еще новичок...


« Ответ #5 : Июнь 08, 2011, 18:27:26 »

Урок гуд ;)
Метод создания ИИ (даже такого простенького) пригодится...
Записан

Не ошибается тот, кто ничего не делает...
Nick
Участник
****

Репутация: 11
Offline Offline

Пол: Мужской
API: Game Maker 8.0 Pro
Сообщений: 113


Самый яркий из безмолвных


« Ответ #6 : Июль 23, 2011, 20:56:33 »

а как сделать так чтобы еще один выстрел можно было сделать через время, а то при должном умении можно как из пулемета стрелять. просто я с алармами не дружу вот и спрашиваю
Записан
Fantom
I am... All of me
Гл. Администратор
*

Репутация: 1325
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [500 дней на форуме]За лояльность! [+1000 репутации]За отличные статьи по Game Maker!Тру Админ :DЗнаток Game Maker...
API: GameMaker Studio Master
Сообщений: 5026



« Ответ #7 : Июль 23, 2011, 21:02:06 »

просто я с алармами не дружу вот и спрашиваю
Подружись с поиском
FAQ для продвинутых, пункт 7.
FAQ для начинающих, пункт II.1.7.
Как сделать паузу между выстрелами
Записан

Nick
Участник
****

Репутация: 11
Offline Offline

Пол: Мужской
API: Game Maker 8.0 Pro
Сообщений: 113


Самый яркий из безмолвных


« Ответ #8 : Июль 24, 2011, 00:47:51 »

Комментарий модератора Флуд не по теме прекратить! Можно было спросить в ЛС, либо в теме созданной для этого.
« Последнее редактирование: Июль 24, 2011, 06:28:19 от sashok_one » Записан
UncleDec
Совсем не
«Старожил форума»
******

Репутация: 276
Offline Offline

Пол: Мужской
Награды:
3000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+150 репутации]
API: Love
Сообщений: 3154


WWW
« Ответ #9 : Июль 24, 2011, 01:17:13 »

Записан
Gamer25232
Новичок
*

Репутация: 0
Offline Offline

Пол: Мужской
API: 7.0 Pro
Сообщений: 4



« Ответ #10 : Август 05, 2011, 20:13:47 »

А можно создавать  3D игры в Game Maker? Если можно то будет ли урок?
Записан

hunter
DarGen
Участник
****

Репутация: 38
Offline Offline

Пол: Мужской
Награды:
За постоянность!
API: GameMaker Studio Standard
Деятельность: Pixel-Art, GML, PHP
Сообщений: 188



WWW
« Ответ #11 : Август 06, 2011, 10:27:30 »

Можно. Но советую сразу в 3д, первые 2D делать научись. Уроки есть немношко в разделе статьи  angel
Записан

Выход есть всегда(с) Dargen Мой сайтМой паблик
Найджел
Новичок
*

Репутация: 1
Offline Offline

Пол: Мужской
API: Game Maker 6.1
Деятельность: пока что учу GML, делаю несложные игры, чуть-чуть рисую, занимаюсь анимацией
Сообщений: 1

Это Найджел ^_^


WWW
« Ответ #12 : Май 08, 2012, 21:37:07 »

Цитата: Hummer
move_towards_point(o_gamer.x, o_gamer_y, 4)//движемся к нему

Мне кажется тут ошибочка)
вместо "o_gamer_y" наверное должно быть "o_gamer.y"
Записан


kvai_gon
Новичок
*

Репутация: 0
Offline Offline

API: Game Maker 7.0 Pro
Сообщений: 14


« Ответ #13 : Май 10, 2012, 17:22:07 »

я бы еще приписал к пуле
Код:
image_angel=direction
если пуля не в форме точки а прямоугольная
Записан
ETUN4
«Старожил форума»
******

Репутация: 50
Offline Offline

Пол: Мужской
Награды:
500 сообщений!За постоянность! [10 дней на форуме]
API: Game Maker 8.0 Pro
Деятельность: Game Maker, HTML, MobileBasic...
Сообщений: 855

Ну как-то так...


« Ответ #14 : Май 10, 2012, 17:44:51 »

а как сделать так чтобы еще один выстрел можно было сделать через время, а то при должном умении можно как из пулемета стрелять. просто я с алармами не дружу вот и спрашиваю
А лучьше подружись...

create event:
Код:
shooting_ready = 1; // Указываем, что игрок готов стрелять
step event:
Код:
if (shooting_ready) // Если игрок готов стрелять
{
  // ...
  // Стреляем
  alarm[0] = room_speed*<количество_секунд>; // Устанавливаем время, через которое игрок снова будет готов стрелять
  shooting_ready = 0; // Указываем, что игрок более не может стрелять
}
alarm 0 event:
Код:
shooting_ready = 1; // После истечения времени указываем, что игрок готов стрелять
[/quote]
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

HellRoom Games © 2006-2012 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
Страница сгенерирована за 0.089 секунд. Запросов: 38.