Elite Games - Свобода среди звезд!

Уроки для программистов - Общий интерфейс, основы и создание движения

GML: УРОК 1: ОБЩИЙ ИНТЕРФЕЙС, ОСНОВЫ И СОЗДАНИЕ ДВИЖЕНИЯ

Скачали GM, запустили и видим обычное диалоговое окно, которое спрашивает у нас «включать ли «Усовершенствованный режим»?». Включаем. Без него, максимум, что Вы сделаете, это Pac-Man. Поэтому, «ДА», включаем.

Следующее окно навязчиво просит нас зарегистрировать эту копию программы. Естественно, лучше сделать хороший поступок и зарегистрировать... Но мы же знаем слово «крэк». Где его искать, не скажу, ибо не знаю. Сами найдёте (для особо ленивых или неудачных – шлите мне Личное Сообщение, я дам Вам свой код). Но зарегить надо! Без этого Вы не сможете сделать всего, что я расскажу.


рис. 1


Идём дальше. Перед нами главное окно программы (рис. 1). За несколько дней, оно станет для вас родным.

Слева – список ресурсов, используемых вашей игрой: Sprites, Sounds, Backgrounds, Paths, Scripts, Fonts, Time Lines, Objects, Rooms, Game Information и Global Game Settings. Все являются папками, кроме последних двух, которые вызывают окошка «Инфы об игре» и «Глобальных настроек» соответственно.

Посередине (или справа внизу) – рабочий стол или рабочая область. Место для Ваших экспериментов.

Ну а сверху – меню. Что тут еще можно сказать.


рис. 2


Итак, нам нужно добавить в игру основной спрайт – наш корабль. Вот он, наш красавец :) (рис. 2) (с) Morphosis. Щёлкаем по нему (в браузере!) правой кнопкой мыши (далее – ПКМ) и выбираем «сохранить как». Сохраняем куда-то. Куда – запоминаем.


рис. 3


В GM`е щелкаем левой клавишей мыши (далее – ЛКМ) на значке с красным Pac-Man`ом (американский колобок :)). Этим самым мы создаем новый спрайт и автоматически вызываем его настройки (рис. 3). Это окно может показаться непонятным даже для тех, кто знает английский. Пока разберём только то, что нужно в данном уроке.

Name: Собственно – название спрайта
Load Sprite: Загрузить спрайт из файла. Поддерживаются такие форматы: png, psp, cut, gif, pcd, pic, cel, pbm, pgm, ppm, pdd, psd, bw, rgb, rgba, sgi, rla, rpf, scr, pcc, pcx, eps, fax, tif, tiff, icb, tga, vda, vst, win, dib, rle, jpeg, jpe, jpg, jfif, emf, wmf, ico, bmp. Не так уж и много, правда?
Width: Ширина спрайта (ось X)
Height: Высота спрайта (ось Y)
Number of subimages: Кол-во кадров, если спрайт анимирован
Show: (показывается когда спрайт анимирован) Номер кадра, видимого в пред. просмотре
Edit Sprite: Кнопка, которая переносит вас в интегрированный «Paint»
Transparent: Если вкл. – цвет пикселя в левом нижнем углу будет считаться фоном и будет вырезан во всём спрайте
OK: Что тут говорить. ОК, он и в Африке ОК

Переходим ко второму столбцу:

Precise collision checking: Если вкл. – столкновения будут просчитываться на пиксельном уровне (я практически не пользуюсь, да и тормозит нехило)
Smooth edges: Не дай вам бог включить эту функцию! Она сглаживает края изображения. По сути, это аналог Antialiasing`а, но сделано это просто ужасно! Позже, я расскажу о методах сглаживания краёв спрайта, которые сделать тяжелее, но выглядеть будет гораздо лучше
Preload texture: Погрузка спрайта во время загрузки игры. Удлиняет последнее. Если выкл. – спрайту загрузиться только тогда, когда потребуется. Я держу выкл.
Origin: Центр спрайта. По 3DSMax`овски – pivot point. Относительно него могут быть проведены перемещение или вращение
X: X координата origin`а
Y: Y координата origin`а
Center: Автоматически размещает Origin в центр спрайта
Bounding Box: Границы столкновений. Используются тогда, когда precise collision checking выключен
Automatic: При выборе, границы размещаются по спрайту так, чтобы в них (границы) попадали только НЕ фоновые части (цвет пикселя в левом нижнем углу считается фоном)
Full image: При выборе, границы охватывают весь спрайт
Manual: Самостоятельный выбор границ
Left: Левый край границ
Right: Правый край границ
Top: Верхний край границ
Bottom: Нижний край границ

Следующее окно является пред. просмотром одного кадра из нашего спрайта (какого – выбирается в Show)

Фуф. Разобрали всё, а не только то, что нужно. Ну и ладно. Работы дальше будет поменьше.

А теперь посмотрите на Список Ресурсов. Мы полностью разобрали Sprites. Осталось, всего-навсего 8 видов ресурсов. :)

Ладно, загружайте в GM наш корабль. Загрузили? Видите слева пиктограмму нашего спрайта (уменьшенную, кстати, до размера 16х16 пкс.), а возле нее «sprite1»? Отлично. Поменяем название с «sprite1» на, например, «spr_ship01». Потом отключаем precise collision checking (далее – pcc), smooth edges (далее – se) и preload texture (далее – pt). ЛКМ по center (x и y автоматически выставляться на 62 и 71). В разделе bounding box врубаем full image (зачем мелочиться :)) и жмём ОК. После всего, наше окно будет выглядеть так – (рис. 4)


рис. 4


Наконец-то, первый спрайт создан. Теперь создадим «объект» с этим спрайтом. Щёлкаем по кнопке в меню с изображением синего круга и приступим к программированию.

Перед нами открывается окно с меньшим кол-вом данных, чем в спрайте (рис. 5).


рис. 5


Разбираем:

Name: Название объекта
Sprite: Выбор спрайта для объекта.
New: Создает новый спрайт и автоматом ассоциирует его с объектом
Edit: Редактирует выбранный спрайт (если есть)
Visible: Будет ли объект видимый в игре
Solid: Будет ли объект твёрдым (позже объясню)
Depth: Дальность объекта (Примечание: чем ниже число, тем ближе объект)
Persistent: Сохраняет позицию и данные об объекте при переходе не другую локацию
Parent: «Родительский объект». Объясню позже
Mask: Маска для объекта. Только при использовании ppc. Если точки столкновения и сам спрайт не одинаковы
Show Information: Показывает информацию об объекте в текстовом виде
OK: :)

Едем дальше: Большое белое окно в центре это список событий. События бывают разные: При создании объекта, при уничтожении, при нажатии клавиши мыши, при вводе текста... В общем, много их очень. О них поговорим уже через несколько строк. Под полоской находятся клавиши «Add Event», «Delete Event» и «Change Event». Они значат «Добавить Событие», «Удалить Событие» и «Изменить Событие» соответственно.

Еще большее окно справа – окно действий. При любом событии могут выполняться действия. Они размещены в «Палитре Действий», справа от пред. окна. Их есть еще больше чем событий и расписывать их все я не буду. Тем более, что пользоваться мы в основном будем «кодами» (но не «чит» :))

Похоже всё. Ну так создадим объект!


рис. 6


Меняем название на более подходящее чем «object0». На «pl» (что есть сокращение от Player. Сокращаем потому, что будем часто использовать этот объект. Быстрее ведь написать pl чем obj_player01) например. Ставим на «Sprite» наш спрайт. Больше ничего не трогаем, а ЛКМ на «Добавить Событие». В новом окне (рис. 6) выбираем «create» («создать»). Теперь действия, которые вы будете добавлять в правое окно, будут работать, когда объект будет создаваться. Нам нужно только их добавить. На палитре выбираем вкладку «control». На этой вкладке размещены действия по работе с «кодом», переменными, событиями и другими неотъемлемыми частями программирования. Щёлкая ПКМ по любому действию, мы добавляем его в самый низ списка действий. Если использовать ЛКМ, то вы сможете сами перетянуть действие в нужное вам место. Делайте, как вам удобно, но добавьте действие «execute a piece of code» (выглядит как листок, на фоне серой кнопки). Добавили? Отлично.


рис. 7


Видим это (рис. 7). Знакомое окно? Это обычный, но подогнанный под программинг блокнот (или WordPad (но уж никак не Microsoft Office Word (тем более 2007 :))). Пишем в него следующее:

-CODE-
life = 100 //Всё, что находится за 2-ма слэшами — комментарий


life_max = 100
shield = 100
shield_max = 100



/* Комментарии можно вставлять между слэшем и звёздочкой.
Так они могут быть многострочными*/


-CODE-

Слова «-CODE-» писать не надо. Они будут использованы для того, чтобы вы отличали обычный текст от кода. Всё, что между ними – код, остальное текст этого урока.

Итак, надеюсь, с комментариями всё ясно? Комменты в GM`е выделяются зелёным курсивом.

Что мы сделали в первых двух строках? Мы инициализировали (или создали) 4 переменные: life, life_max, shield и shield_max. Если перед названиями переменных не стоит слово «global.», они будут созданы только для текущего объекта. В ином случае – они будут глобальными, т.е. их могут использовать все объекты. Вот пример глобального использования переменных: дописываем в этот код:

-CODE-
global.gameover = 0
-CODE-

Вот эту переменную («gameover») может использовать любой объект.

В этом уроке, эти переменные мы использовать не будем.

А теперь сделаем движение и вращение нашего корабля.

Добавляем событие «keyboard press» «<LEFT>». Обратите внимание, что клавиатур есть 3 штуки: с зелёной стрелкой вверх, с красной вниз, и простая. Объясняю: действия в событие с зелёной стрелкой вверх будут выполнятся 1 раз при отпускании клавиши. Действия в событие с красной стрелкой вниз будут выполнятся 1 раз при нажатии клавиши. Ну а действия в событии без стрелки будут выполнятся постоянно, пока вы не отпустите клавишу. Вот это событие нам и нужно. Добавляем его и создаем в нём этот код:

-CODE-
direction += 5
-CODE-

Объясняю, что мы сделали: при нажатии кл. влево, к направлению движения корабля добавиться 5о (градусов). Почему добавиться, а не отнимется? Сам не знаю почему, но в GM`е, градусные меры перевёрнуты. Там, где у нас 180о, в проге 0о. Соответственно, где 00, там 180о. 90о и 270о остаются на своих местах. (рис. 8)


рис. 8


Еще может быть непонятно, почему «+= 5», а не «= +5». При использовании знака «=», значение установится. А если «+=», «-=», «*=» или «/=», то значение добавиться, вычтется, помножиться или поделиться на уже существующее.

Теперь делаем то же самое, но с клавишей «<RIGHT>» и с кодом:

-CODE-
direction -= 5
-CODE-

Думаю, это понятно.


рис. 9


Теперь добавим локацию и посмотрим, как будет это всё действовать. Щёлкаем в меню по кнопке «room» (пиктограмма с пустым белым окошком). Открывается окно локаций или комнат (рис. 9). В правой панели ЛКМ по пустому пространству и выбираем наш объект. Щёлкаем в любом месте а комнате, чтобы создать его «инстанц» («instance»). Чтобы удалить инстанц – ПКМ по нём в комнате.

Инстанц – это копия объекта, его отображение. В инстанце можно сделать персональные минимальные изменения, не изменяя объект. Но это нам пока ни к чему. Мы будем использовать это при создании звёздных систем.

Теперь нажимаем в меню на кнопку с изображением зелёной стрелки или нажимаем <F5>. Игра загружается.

Теперь понажимаем на <LEFT>, <RIGHT>. Ничего не происходит! Почему? Нажимая на клавиши мы меняем направление его движения, но не его вращение. Исправляем.

Дважды ЛКМ по нашему объекту в Списке Ресурсов, чтобы вызвать его настройки. Добавляем событие «Step» «Step». Пишем туда такой код:

-CODE-
image_angle = direction-90 //ТОЛЬКО В ЗАРЕГИСТРИРОВАНОЙ ВЕРСИИ


-CODE-

image_angle — это вращение. Запускаем. Всё ОК? Надеюсь...

А сейчас возьмёмся за движение!

Создаем событие «<UP>». В нём пишем (добавляем код и пишем):

-CODE-
if (speed < 5)
{
speed += 0.1
}
-CODE-


Здесь, как видите, появились «if» («если»). С его помощью, ограничиваем скорость. Нам же не надо, чтоб корабль летал со скоростю света :). То есть, при нажатии клавиши «<UP>», скорость будет увеличиваться на 0.1 за кадр, при условии, что она меньше 5. Скорость измеряется в пикселях за кадр.

Теперь – замедление: Создаем событие «<DOWN>» и прописываем:

-CODE-
if
(speed > 0)
{
speed -= 0.1
}
-CODE-


Это, думаю, понятно.

Если вам не нравиться, как выглядит вращение (пиксели становятся очень видными и по спрайту как будто текут волны), то дважды ЛКМ по global game settings в Списке Ресурсов и включаем Interpolate colors between pixels. Помогает.

На этом первый урок по терзанию Game Maker`а можно считать законченным.


ДОПОЛНЕНИЕ К УРОКУ 1

Есть небольшое дополнение. В результате небольшого эксперимента не досуге был придуман следующий вариант. Попробуйте сделать так:
Внимание: Переписываем по новому! Старые коды удалить!

В <CREATE>

-CODE-
life = 100
life_max = 100
shield = 100
shield_max = 100
dir = 0
global.gameover = 0
-CODE-

В <STEP>

-CODE-
image_angle = dir-90
-CODE-

В <LEFT>

-CODE-
dir += 5
-CODE-

В <RIGHT>

-CODE-
dir -= 5
-CODE-

В <UP>

-CODE-
motion_add(dir,0.5)
-CODE-

В <DOWN>

-CODE-
motion_add(dir,-0.5)
-CODE-
ZEUStiger
К началу раздела | Наверх страницы Сообщить об ошибке
Уроки для программистов - Общий интерфейс, основы и создание движения
Все документы раздела: Для тех, кто хочет писать игры | Движок на OpenGL | Создание игр в Game Maker | Bump mapping | Использование Direct Input | XNA framework |


Дизайн Elite Games V5 beta.18
EGM Elite Games Manager v5.17 02.05.2010