НА КОЛЕНКЕ. Рисование спрайта в game maker


КсиТехнология-02 — послойное рисование спрайтов в заданной палитре / GameMaker / На коленке

Спойлер

показать

(анимация очень цветастая, большая и быстрая — осторожно! специально спрятал в спойлер)

Проблема: я хочу все эти перекраски, всех возможных анимаций персонажа, но не хочу красить и вручную грузить всё это как отдельные спрайты. Впрочем, проще показать вот этот спрайтлист, уже упомянутый в посте про КсиТехнологию-01, про систему анимаций:

В Shovel Knight для этого использовали пиксельные шейдеры. Но в ГМ8.1, который я использую сейчас для Castle of no Return 2, и тем более в ГМ6.0, который я использовал во время придумывания этой технологии в 2008 году, когда Дрейк делал уже третью часть своей фан-игры по Мегамену, шейдеров никаких нет. Думаете, я остался доволен? Думаете, они нужны? Нихрена подобного! Подробности — под катом.

Спрайт в GM8.1 можно красить, что называется blend — блендить в определённый цвет. Недостаток простой покраски в том, что цвет указывается только один. То есть, если мы уже указали синий, то мы этим уже забрали у спрайта половину красного и зелёного, и по частям он никак не красится. Поэтому просто выставление переменной image_blend тут не поможет (хотя полезно в более простых случаях, коих 90% в современном геймдеве, это мы тут из себя ретро строим).

Нам нужна функция draw_sprite_ext(спрайт, кадр, x, y, x_масштаб, y_масштаб, угол_поворота, цвет, альфа)

С её помощью мы всё ещё красим весь спрайт, но теперь задумаемся о том, что эта функция на самом деле делает. Эта функция берёт изображение и отрисовывает его из расчёта что белый цвет будет перекрашен чётко в указанный, а все остальные — в какую-то интерполяцию между чёрным и заданным, смотря насколько они яркие. Что, если разделить спрайты на слои, состоящие из одноцветных масок, и наносить их по порядку?

c0=make_color_rgb(0,0,0) c1=make_color_rgb(244,208,180) c2=make_color_rgb(0,136,252) c3=make_color_rgb(84,84,84)

draw_sprite_ext(0,0,x,y,1,1,0,c0,1) draw_sprite_ext(0,1,x,y,1,1,0,c1,1) draw_sprite_ext(0,2,x,y,1,1,0,c2,1) draw_sprite_ext(0,3,x,y,1,1,0,c3,1)

Бинго! Я опасался, что ГМ «зажуёт» цвета и полученный скомпонованный спрайт будет отличаться от исходного, но нет — соответствие один в один.

Радость радостью, а… ГМ умеет грузить только обычные спрайты. Итого я поделил сложность задачи на количество реколоров (что довольно много), но умножил на количество слоёв (что как минимум 4) для каждого кадра. Я получил численное преимущество, но лишился технического — ГМ знать не знает что такое послойный спрайт, и поэтому да здравствует новый модуль на коленке, свежеперемотанный изолентой.

Пришлось делать сразу три штуки:

  1. Сплиттер спрайтов на слои и отдельно палитру из этих слоёв. Выглядит он вот так:

  2. Загрузчик+менеджер послойных спрайтов и скрипт отрисовки этого в ГМ.
  3. Автоматический выгружатель спрайтов из нашего проекта, который нуждается в таком усовершенствовании.

Эта конкретная реализация послойного перекрашивания «приурочена» к опубликованному мной ранее стандарту на NES-палитру, основанному на оригинальном исследовании автора, доступного там по ссылке-источнику; хотя вообще она может использоваться для большего количества цветов, чем 4 на один спрайт.

Слава Мегамену!

Анимированные реколоры в начате поста взяты с блога it8bit, без разрешения, потому что там нет адреса для связи: http://www.it8bit.com/post/14177099314/mega Некий адрес brotherbrain.com, написанный в гифке, тоже не даёт никаких контактов.

Послойные «линографические» нарезки выполнены, сфотографированы и выложены в блог Allison Parrish, после чего, с её разрешения, взяты мной для этого поста. Ссылка на исходный пост доступна чуть ниже.

Примечательно, что и этот её пост, и моя технология, были созданы где-то в середине 2008 года. А хотя, я могу и ошибаться — возможно то был поздний 2007. Или ранний. Не важно, главное — держать связь своих времён в принципе.

 

kolenka.su

Игровая графика - Game Maker - Game Maker - Каталог статей

Важной частью игры является графика. Game Maker заботится о графике, но даже для простых игр, Вам нужно о ней позаботиться самостоятельно. Но иногда, Вы захотите получить более полное управление. Для некоторых аспектов существуют действия, но, используя код, Вы можете управлять большим количеством аспектов. Эта глава описывает все переменные и функции доступные для игровой графики, а также предоставит Вам больше информации о том, что действительно происходит в игре.

Информация об игровой графике может быть обнаружена на следующих страницах:

Спрайты и ИзображенияЗадние ФоныРисование Спрайтов и ФоновРисование ФормШрифты и ТекстРасширенные Функции РисованияРисование ПоверхностейТайлыЭкранОкноВидыПерекрашивание Экрана

 

Спрайты и изображения

 

Каждый объект связан с ассоциированным к себе спрайтом. Это или одиночное изображение, или изображение, состоящее из многих частей изображений (кадров). Для каждого образца объекта, программа рисует соответствующее изображение на экране со своим началом (как определено в свойствах спрайта) в позиции (x,y) образца объекта. Когда имеются кадры, то они последовательно повторяются, чтобы получить эффект анимации. Существует множество переменных, которые влияют на способ рисования изображения. Они могут использоваться для изменения эффектов. Каждый образец объекта имеет следующие переменные:

visible Отражает, рисовать ли спрайт для объекта (истина) или нет (ложь). Невидимые образцы объекта всё еще активны и создают события столкновения; Вы только не видите их. Установка видимости в ложь полезно, например, когда нужно скрыть диспетчер объектов (сделайте его нетвёрдым телом, чтобы избегать событий столкновения) или переключения.sprite_index Содержит имя спрайта для текущего образца объекта. Вы можете изменить его, чтобы задать образцу объекта другой спрайт. Как значение, Вы можете использовать имена других спрайтов, которых Вы определили. Смена спрайта не изменяет индекс к настоящему времени видимого кадра.sprite_width* Указывает ширину спрайта. Эта величина не может быть изменена, но Вы можете захотеть использовать её.sprite_height* Указывает высоту спрайта. Эта величина не может быть изменена, но Вы можете захотеть использовать её.sprite_xoffset* Указывает горизонтальное смещение спрайта, как определено в свойствах спрайта. Эта величина не может быть изменена, но Вы можете захотеть использовать её.sprite_yoffset* Указывает вертикальное смещение спрайта, как определено в свойствах спрайта. Эта величина не может быть изменена, но Вы можете захотеть использовать её.image_number* Содержит количество кадров у спрайта текущего образца объекта (не может быть изменено).image_index Содержит номер кадра спрайта текущего образца объекта, с которого следует начать проигрывание анимации. Эта переменная указывает к настоящему времени нарисованный кадр (нумерацию начинайте с 0). Вы можете изменить текущее изображение изменением этой переменной. Программа продолжит повторение, начиная с новым индексом. (Значение может иметь дробную часть. В этом случае, оно всегда будет округлено в меньшую сторону, чтобы получить кадр, который рисуется.)image_speed Cкорость с которой повторяется цикл кадров. Значение 1 указывает, что каждый шаг будет получать следующее изображение. Меньшие значения переключают кадры медленнее, так как требуют для этого больше времени. Большие значения пропускают некоторые кадры, делая тем самым движение быстрее. Иногда Вы захотите, чтобы конкретный кадр был видимым, и, при этом, не захотите, чтобы программа их всех не повторяла. Это может быть достигнуто установкой скорости на 0 и выбором "правильного" кадра. Например, допустим, что у Вас есть объект, который может вращаться, и Вы создаёте спрайт, который имеет кадры для множества направлений (против часовой стрелки). Затем, в событии шага объекта, Вы можете установить

{  image_index = direction * image_number/360;  image_speed = 0;}

depth Отражает текущую глубину "отрисовки" спрайта текущего образца объекта. Вы можете изменить это значение, устанавливая глубину изображения. Значение по умолчанию - 0, если Вы не установили это в другом значении в свойствах объекта. Более высокое значение продвигает образец объекта прочь. (Вы можете также использовать отрицательные значения.) Образцы объекта с более высокой глубиной пролегают позади образцов объекта с более низкой глубиной. Установка глубины гарантирует, что образцы объекта находятся в порядке. Вы можете захотеть (например, плоскость перед облаком) что бы фоновые образцы объекта иметь высокую глубину (положительную), а образцы объекта переднего плана, должны иметь глубину низкого уровня (отрицательную).image_xscale Коэффициент масштабирования спрайта по оси X для создания больших или малых изображений. Значение 1 указывает обычный размер. Вы должны отдельно установить горизонтальный xscale и вертикальный yscale размер. Изменение масштабирования также изменяет значения для ширины и высоты изображения и влияет на события столкновения. Поймите, что масштабированные изображения (в основном, когда Вы делаете их меньше), занимают для "отрисовки" больше времени. Изменение масштабирования может быть использовано для получения 3-D эффекта. Вы можете использовать величину -1, чтобы отражать спрайт по горизонтали.image_yscale Содержит коэффициент масштабирования спрайта по оси Y. 1 - нет масштабирования. Вы можете использовать значение -1, чтобы отразить спрайт по вертикали .image_angle Угол, с которым спрайт будет вращаться. Вы определяете градусы против часовой стрелки. Значение 0 не указывает вращения. Эта переменная может быть установлена только в Pro издании Game Maker!image_alpha Содержит коэффициент прозрачности спрайта (от 0 до 1). Используйте осторожно. Частично прозрачные изображения при "отрисовке" занимают много времени и замедляют игру.image_blend Смешивает цвет, используемый при рисовании спрайта. Величина c_white по умолчанию. Когда Вы определяете другую величину, то изображение смешивается с этим цветом. Это может быть использовано для перекрашивания спрайта "на лету". Эта переменная может быть установлена только в Pro издании Game Maker!bbox_left* Содержит координату левого края прямоугольника спрайта, который используется для просчёта столкновений (в счёт также берётся масштабирование).bbox_right* Содержит координату правого края прямоугольника спрайта, который используется для просчёта столкновений.bbox_top* Содержит координату верхнего края прямоугольника спрайта, который используется для просчёта столкновений.bbox_bottom* Содержит координату нижнего края прямоугольника спрайта, который используется для просчёта столкновений.

 

 

Задние фоны

Каждая комната может иметь аж до 8 фонов. Также у неё имеется фоновый цвет. Все аспекты этих фонов Вы можете изменить в части кода, используя следующие переменные (отметьте, что некоторые из них подготавливает этот диапазон от 0 до 7, указывая другие фоны):

background_color Отражает цвет заднего фона для текущей комнаты.background_showcolor Отражает, заполнять ли задний фон указанным цветом или нет.background_visible[0..7] Отражает, какой задний фон в текущий момент отображается.background_foreground[0..7] Показывает, использовать ли задний фон в качестве переднего или нет.background_index[0..7] Отражает имя используемого заднего фона.background_x[0..7] Отражает позицию изображения, используемого в качестве заднего фона по оси X.background_y[0...7] Отражает позицию изображения, используемого в качестве заднего фона по оси Y.background_width[0...7]* Содержит ширину изображения, использующуюся в качестве заднего фона.background_height[0...7]* Содержит высоту изображения, использующуюся в качестве заднего фона.background_htiled[0..7] Заполняет задний фон по горизонтали используемым изображением.background_vtiled[0..7] Заполняет задний фон по вертикали используемым изображением.background_xscale[0..7] Горизонтальный коэффициент масштабирования для фона. (Должно быть положительным; Вы не можете использовать отрицательное значение при отражении фона.)background_yscale[0..7] Вертикальный коэффициент масштабирования для фона. (Должно быть положительным; Вы не можете использовать отрицательное значение при отражении фона.)background_hspeed[0..7] Содержит скорость горизонтальной прокрутки заднего фона (в пикселях за шаг).background_vspeed[0..7] Содержит скорость вертикальной прокрутки заднего фона (в пикселях за шаг).background_blend[0..7] Смешивает цвет используемый при рисовании фона. Значение c_white по умолчанию. Эта переменная доступна только в Pro издании Game Maker!background_alpha[0..7] Содержит коэффициент прозрачности, используемый для текущего заднего фона. Величина 1 является обычным цветом; величина 0 - полностью прозрачным.

 

 

Рисование спрайтов и фонов

Есть возможность позволить объектам выглядеть отличающимися от своих изображений. Для этого имеется целый набор доступных функций. Прежде всего, имеются функции для рисования спрайтов и фонов другими средствами. Эти предоставит Вам более полное управление над внешним видом спрайта. Также Вы можете нарисовать (плитки) фоны.

draw_sprite(sprite,subimg,x,y) Рисует кадр с номером subimg (-1 = текущий) спрайта в точке с координатами (x,y). (Без смешивания цвета и без альфа прозрачности.)draw_sprite_stretched(sprite,subimg,x,y,w,h) Рисует кадр с номером subimg (-1 = текущий) спрайта в точке с координатами (x,y) и растягивает его до ширины w и высоты h.draw_sprite_tiled(sprite,subimg,x,y) Рисует кадр с номером subimg (-1 = текущий) спрайта в точке с координатами (x,y), а затем заполняет оставшееся место такими же спрайтами.draw_sprite_part(sprite,subimg,left,top,right,bottom,x,y) Рисует указанную часть кадра subimg (-1 = текущий) спрайт с левым верхним углом части в позиции (x,y).

draw_background(back,x,y) Рисует задний фон в точке с координатами (x,y). (Без смешивания цвета и без альфа прозрачности.)draw_background_stretched(back,x,y,w,h) Рисует задний фон в точке с координатами (x,y), растянутый до указанной ширины w и высоты h.draw_background_tiled(back,x,y) Рисует задний фон, начиная в точке с координатами (x,y), а затем замащивает оставшееся свободное пространство этим же фоном.draw_background_part(back,left,top,right,bottom,x,y) Рисует указанную часть фона с левым верхним углом части в позиции (x,y).

Следующие функции являются расширением вышеуказанных функций. Эти расширения могут быть использованы только в Pro издании Game Maker!

draw_sprite_ext(sprite,subimg,x,y,xscale,yscale,rot,color,alpha) Рисует спрайт, который масштабируется с показателями xscale и yscale и вращается против часовой стрелки в градусах. color - цвет смешивания (используйте c_white, чтобы смешивания не было) и alpha - указывает показатель прозрачности с которым изображения объединяются со своим фоном. Значение 0 делает спрайт полностью прозрачным. Значение 1 делает его полностью твёрдым. Эта функция может создать большой эффект (например, частично прозрачные взрывы).draw_sprite_stretched_ext(sprite,subimg,x,y,w,h,color,alpha) Рисует спрайт, который растягивается по области левого верхнего угла (x,y) и ширины w и высоты h. color - является цветом смешивания и alpha - указывает установку прозрачности.draw_sprite_tiled_ext(sprite,subimg,x,y,xscale,yscale,color,alpha) Рисует изразцовый спрайт, который заполнит всю комнату, но теперь с коэффициентами масштабирования и с установками цвета и прозрачности.draw_sprite_part_ext(sprite,subimg,left,top,right,bottom,x,y,xscale,yscale,color,alpha) Рисует указанную частью кадра subimg (-1 = текущий) спрайта с левым верхним углом части в позиции (x,y), но теперь с коэффициентами масштабирования и с установками цвета и прозрачности.draw_sprite_general(sprite,subimg,left,top,right,bottom,x,y,xscale,yscale,rot,c1,c2,c3,c4,alpha) Общая основная функция рисования. Рисует указанную часть кадра subimg (-1 = текущий) спрайта с левым верхним углом части в позиции (x,y), но теперь с коэффициентами масштабирования, углом вращения, цветом для каждых четырёх граней (левый верхний, правый верхний, нижний правый и нижний левый), и величиной alpha прозрачности.

draw_background_ext(back,x,y,xscale,yscale,rot,color,alpha) Рисует фон, который масштабируется и вращается с цветом смешивания (используйте c_white, чтобы смешивания не было) и альфа прозрачности (0-1).draw_background_stretched_ext(back,x,y,w,h,color,alpha) Рисует фон, который растягивается по указанной области. color - цвет смешивания и alpha - указывает значение прозрачности.draw_background_tiled_ext(back,x,y,xscale,yscale,color,alpha) Рисует изразцовый фон, который должен заполнять всю комнату, но теперь с коэффициентами масштабирования и с установками цвета и прозрачности.draw_background_part_ext(back,left,top,right,bottom,x,y,xscale,yscale,color,alpha) Рисует указанную часть фона с левым верхним углом части в позиции (x,y), но теперь с коэффициентами масштабирования и с установками цвета и прозрачности.draw_background_general(back,left,top,right,bottom,x,y,xscale,yscale,rot,c1,c2,c3,c4,alpha) Общая основная функция рисования. Рисует указанную часть фонового изображения с левым верхним углом части в позиции (x,y), но теперь с коэффициентами масштабирования, углом вращения, цветом для каждых четырёх граней (левый верхний, правый верхний, нижний правый, и нижний левый) и величиной alpha прозрачности.

 

Рисование Форм

Имеется целый набор функций доступных для рисования разнообразных форм. Также имеются функции для рисования текста (смотрите следующую страничку). Вы можете использовать их только в событии рисования объекта; эти функции, в общих чертах, не генерируют никаких значений в коде. Поймите, что столкновения между образцами объектов определяются своими спрайтами (или масками), а не тем, что Вы дорисовали. Существуют следующие функции рисования, которые могут использоваться для рисования основных форм.

draw_clear(col) Очищает целую комнату в заданный цвет col (не alpha смешивание).draw_clear_alpha(col,alpha) Очищает целую комнату в заданном цвете и альфа величине (в основном полезно для поверхностей).draw_point(x,y) Рисует точку в координатах (x,y) в текущем цвете.draw_line(x1,y1,x2,y2) Рисует отрезок с началом в точке (x1,y1) и окончанием в точке (x2,y2).draw_line_width(x1,y1,x2,y2,w) Рисует отрезок с началом в точке (x1,y1) и окончанием в точке (x2,y2) и длиной w.draw_rectangle(x1,y1,x2,y2,outline) Рисует прямоугольник с координатами верхнего левого (x1,y1) и правого нижнего (x2,y2) угла. outline - указывает только схему, которая должна быть нарисована (истина) или должна быть заполнена (ложь).draw_roundrect(x1,y1,x2,y2,outline) Рисует прямоугольник с координатами верхнего левого (x1,y1) и правого нижнего (x2,y2) угла с округлёнными углами. outline - указывает только схему, которая должна быть нарисована (истина) или должна быть заполнена (ложь).draw_triangle(x1,y1,x2,y2,x3,y3,outline) Рисует треугольник с вершинами в точках с координатами (x1,y1), (x2,y2), (x3,y3). outline - указывает только схему, которая должна быть нарисована (истина) или должна быть заполнена (ложь).draw_circle(x,y,r,outline) Рисует окружность в точке (x,y) заданного радиуса r. outline - указывает только схему, которая должна быть нарисована (истина) или должна быть заполнена (ложь).draw_ellipse(x1,y1,x2,y2,outline) Рисует эллипс, вписанный в прямоугольник с координатами верхнего левого угла (x1,y1) и правого нижнего (x2,y2). outline - указывает только схему, которая должна быть нарисована (истина) или должна быть заполнена (ложь).draw_set_circle_precision(precision) Устанавливает точность, с которой рисуются круги, то есть число долей, из которых они состоят. Точность должна быть между 4 и 64 и должна быть делящейся 4. Можно использовать также для того, чтобы рисовать эллипсы и округленные прямоугольники.draw_arrow(x1,y1,x2,y2,size) Рисует стрелку с началом в точке (x1,y1) и окончанием в точке (x2,y2). Аргумент size показывает размер "шапки" в пикселях.draw_button(x1,y1,x2,y2,up) Рисует кнопку. Аргумент up отражает состояние кнопки (0 - нажата, 1 - отпущена).draw_path(path,x,y,absolute) Используя эту функцию, Вы можете сделать указанный путь в комнате со своим началом в позиции (x,y). Если absolute - истина, то путь будет нарисован в позиции, где он был определён, и величины x и y будут проигнорированы.draw_healthbar(x1,y1,x2,y2,amount,backcol,mincol,maxcol,direction,showback,showborder) Используя эту функцию, Вы можете создать healthbar (индикатор здоровья) (или любую другую область, которая указывает некоторую величину, например - ущерб). Аргументы x1, y1, x2 и y2 указывают общую область для области. amount - указывает процент области, которая должна быть размещена (должно быть между 0 и 100). backcol - цвет фона для области. mincol и maxcol - указывает цвет, когда сумма - 0 и 100 соответственно. Итак, Вы можете легко нарисовать область, которая будет, например: от зелёного до красного состояния. direction - является направлением, в котором рисуется область. 0 - указывает, что область фиксируется слева, 1 - справа, 2 - вверху и 3 - внизу. Наконец showback - указывает, должен ли блок фона быть отображён, и showborder - указывает блок и область, и должны ли они иметь чёрную граничную линию.

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

draw_set_color(col) Устанавливает цвет, используемый для мгновенного рисования примитивов.draw_set_alpha(alpha) Устанавливает величину alpha прозрачности для мгновенного использования рисования примитивов. Должно пролегать в диапазоне 0-1. 0 - полностью прозрачный, 1 - непрозрачный.draw_get_color() Возвращает цвет, используемый для рисования примитивов.draw_get_alpha() Возвращает значение alpha, используемое для рисования примитивов.

Доступен целый набор встроенных цветов:

c_aquac_blackc_bluec_dkgrayc_fuchsiac_grayc_greenc_limec_ltgrayc_maroonc_navyc_olivec_orangec_purplec_redc_silverc_tealc_whitec_yellow

Следующее функции могут помочь Вам при создании желаемых цветов.

make_color_rgb(red,green,blue) Возвращает цвет с указанными красными, зелёными и синими компонентами, где red, green и blue должны иметь значение от 0 до 255.make_color_hsv(hue,saturation,value) Возвращает цвет с указанными hue, saturation и компонентами value (каждый между 0 и 255).color_get_red(col) Возвращает красный компонент цвета col.color_get_green(col) Возвращает зелёный компонент цвета col.color_get_blue(col) Возвращает синий компонент цвета col.color_get_hue(col) Возвращает компонент hue цвета col.color_get_saturation(col) Возвращает компонент saturation цвета col.color_get_value(col) Возвращает компонент value цвета col.merge_color(col1,col2,amount) Возвращает объединённый цвет col1 и col2. Слияние определяется суммой amount. Значение 0 переписывается на col1, а значение 1 на col2, а значения между ними - в "объединяющиеся" значения.

Дополнительные функции.

draw_getpixel(x,y) Возвращает цвет пикселя, соответствующего для позиционирования в позициях (x,y) в комнате. Это не очень быстро обрабатывается, так что используйте осторожно.screen_save(fname) Сохраняет bmp изображение экрана в заданном fname (имя файла). Полезно для получения скриншотов.screen_save_part(fname,x,y,w,h) Сохраняет часть экрана в заданном fname.

 

 

Шрифты и текст

В играх Вам иногда понадобиться рисовать тексты. Чтобы нарисовать текст, Вы должны определить шрифт для использования. Шрифты могут быть определены созданием шрифтовых ресурсов (так же в программе Game Maker, используя функции для создания ресурсов). Имеются всё же некоторые функции для рисования текста другим путём. В каждой функции Вы определяете позицию текста на экране. Существует две функции для установки горизонтального и вертикального выравнивания текста, которые относятся к указанной позиции.

Для рисования текста существуют следующие функции:

draw_set_font(font) Устанавливает шрифт, который будет использоваться при рисовании текста. Используйте -1, чтобы установить встроенный по умолчанию шрифт Arial 12.draw_set_halign(halign) Устанавливает горизонтальное выравнивание, используемое при рисовании текста. Выберите одну из следующих констант как величину:

fa_leftfa_centerfa_right

draw_set_valign(valign) Устанавливает вертикальное выравнивание, используемое при рисовании текста. Выберите одну из следующих констант как величину:

fa_topfa_middlefa_bottom

draw_text(x,y,string) Рисует строку в позиции (x,y), используя рисование цвета и букв. Символ # или перевод строки chr(13) или перевод строки chr(10) интерпретируется как окончание строки символов. Таким образом Вы можете сделать "многостроковый" текст. (Используйте \#, чтобы получить сам # символ.)draw_text_ext(x,y,string,sep,w) Подобно предшествующей программе, но Вы теперь можете определить ещё две вещи. Прежде всего, sep - указывает расстояние разделения между строками текста в "многостроковом" тексте. Используйте -1, чтобы получить расстояние по умолчанию. Используйте w, чтобы указать ширину текста в пикселях. Строки, которые более длинные, разделяются шириной в пробелах или знаках. Используйте -1, чтобы не разбивать строки.string_width(string) Ширина строки в текущем шрифте при рисовании используя функцию draw_text(). Может использоваться для точного позиционирования графики.string_height(string) Высота строки в текущем шрифте при рисовании, используя функцию draw_text().string_width_ext(string,sep,w) Ширина строки в текущем шрифте при рисовании, используя функцию draw_text(). Может использоваться для точного позиционирования графики.string_height_ext(string,sep,w) Высота строки в текущем шрифте при рисовании, используя функцию draw_text_ext().

Следующие программы позволяют Вам рисовать масштабированный и вращающийся текст, а также использовать цветовой градиент цвета в текстах. Эти функции доступны только в Pro издании Game Maker!

draw_text_transformed(x,y,string,xscale,yscale,angle) Рисует строку в позиции (x,y) так же как выше, но шкала теперь горизонтальная и вертикальная с указанными показателями и вращением против часовой стрелки сверх градусов угла.draw_text_ext_transformed(x,y,string,sep,w,xscale,yscale,angle) Объединяет функцию draw_text_ext и draw_text_transformed. Что делает возможным рисовать масштабируемый и вращающийся многостроковый текст.draw_text_color(x,y,string,c1,c2,c3,c4,alpha) Рисует строку в позиции (x,y) подобно вышеупомянутой функции. Четыре цвета определяют цвета левого верхнего, верхнего-правого, нижнего-правого, и нижнего-левого угла текста. alpha - является альфа прозрачностью, используйте (0-1).draw_text_ext_color(x,y,string,sep,w,c1,c2,c3,c4,alpha) Подобно функции draw_text_ext(), но с цветными гранями.draw_text_transformed_color(x,y,string,xscale,yscale,angle,c1,c2,c3,c4,alpha) Подобно функции draw_text_transformed(), но с цветными гранями.draw_text_ext_transformed_color(x,y,string,sep,w,xscale,yscale,angle,c1,c2,c3,c4,alpha) Подобно функции draw_text_ext_transformed(), но с цветными гранями.

 

 

 

Расширенные функции рисования

Это функциональное назначение доступно только в зарегистрированной версии Game Maker.

Выше, описаны основные функции рисования. Здесь Вы найдёте множество дополнительных функций, которые предлагают Вам больше возможностей. Прежде всего, существуют функции для рисования форм с цветами градиента. Во-вторых - имеются функции, чтобы рисовать более общие многоугольники (полигоны) и, наконец, имеется возможность рисовать отображаемую текстуру многоугольников.

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

draw_point_color(x,y,col1) Рисует точку в позиции (x,y) в заданном цвете.draw_line_color(x1,y1,x2,y2,col1,col2) Вырисовывает линию из (x1,y1) в (x2,y2), интерполируя цвет между col1 и col2.draw_line_width_color(x1,y1,x2,y2,w,col1,col2) Вырисовывает линию из (x1,y1) в (x2,y2) с длиной w, интерполируя цвет между col1 и col2 draw_rectangle_color(x1,y1,x2,y2,col1,col2,col3,col4,outline) Рисует прямоугольник. Четыре цвета указываются для левой верхней, верхней правой, нижней правой, и нижней левой вершины. outline - указывает только схему, которая должна быть нарисована (истина) или должна быть заполнена (ложь).draw_roundrect_color(x1,y1,x2,y2,col1,col2,outline) Рисует закруглённый прямоугольник. col1 - цвет в середине и col2 - цвет границы. outline - указывает только схему, которая должна быть нарисована (истина) или должна быть заполнена (ложь).draw_triangle_color(x1,y1,x2,y2,x3,y3,col1,col2,col3,outline) Рисует треугольник. Три цвета - цвета трёх граней, которые интерполируются над треугольником. outline - указывает только схему, которая должна быть нарисована (истина) или должна быть заполнена (ложь).draw_circle_color(x,y,r,col1,col2,outline) Рисует окружность в позиции (x,y) с радиусом r. col1 - цвет в середине и col2 - цвет границы. outline - указывает только схему, которая должна быть нарисована (истина) или должна быть заполнена (ложь).draw_ellipse_color(x1,y1,x2,y2,col1,col2,outline) Рисует эллипс. icol1 - цвет в середине и col2 - цвет границы. outline - указывает только схему, которая должна быть нарисована (истина) или должна быть заполнена (ложь).

Вы можете также нарисовать большие примитивы. Это работает немного по-другому. Вы начинаете определять примитив и хотите его нарисовать. Затем Вы определяете грани для него и, наконец, Вы завершаете примитив, который уже нарисован. Доступно шесть типов примитивов:

pr_pointlist Грани являются набором точек.pr_linelist Грани являются набором сегментов линии. Каждая пара граней формирует сегмент линии. Набор граней должен быть равным.pr_linestrip Грани формируют ломаную линию, сначала присоединяясь ко вторым, вторые к третьим и т.п. Последние не присоединяется к первым граням. Вы должны определить дополнительную копию первой вершины для этого.pr_trianglelist Грани являются набором треугольников. Каждое "утраивание" граней формирует треугольник. Так что количество граней должно быть кратно 3.pr_trianglestrip Грани снова формируют треугольники, но на этот раз, по другому. Первые три формируют первый треугольник. Последние две, из этих граней, вместе со следующей вершиной, формируют второй треугольник и т.п. Итак, каждая новая вершина определяет новый треугольник, присоединённый к предшествующему.pr_trianglefan Подобный списку треугольников, но на этот раз, первая вершина является частью всех треугольников. Кроме того, каждая новая вершина определяет новый треугольник, присоединённый к предшествующей и первой вершине.

Существуют следующие функции для рисования примитивов

draw_primitive_begin(kind) Запускает примитив указанного типа.draw_vertex(x,y) Добавляет вершину (x,y) в примитив, используя цветовую и alpha величину установленных прежде.draw_vertex_color(x,y,col,alpha) Добавляет вершину (x,y) в примитив, со своей собственной цветовой и альфа величиной. Это позволяет Вам создавать примитивы с "гладкоизменяющимися" цветовыми и аьлфа значениями.draw_primitive_end() Заканчивает описание примитива. Эта функция действительно его рисует.

Наконец, возможно рисование примитивов, используя спрайты или фоны в качестве текстур. При использование текстуры, изображение устанавливается в примитиве, восстанавливая свою форму, чтобы установить примитив. Текстуры используются для добавления детализации к примитивам, например - кирпичная стена. Чтобы использовать текстуры, Вы сначала должны получить id (идентификатор) текстуры, которую Вы хотите использовать. Для этого существуют следующие функции:

sprite_get_texture(spr,subimg) Возвращает id текстуры, соответствующему кадру изображения subimg указанного спрайта.background_get_texture(back) Возвращает id текстуры, соответствующему указанному фону.

Выбранная текстура может всё ещё не поместиться в видео

diamond89.ucoz.ru

Как сделать поворот спрайта или объекта в GameMaker

Для того чтобы повернуть ваш спрайт или объект в Гейм Мейкер Студио (GameMaker: Studio) воспользуйтесь функцией: image_angle

Работает данная функция поворота следующим образом. 

Обычно вам нужно повернуть спрайт в 2D играх с видом сверху, допустим что изначально у нас спрайт ориентирован наверх (угол 0 градусов).

Как сделать поворот спрайта или объекта в GameMaker: Studio

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

При этом, если мы в событии (event) создания (create) пишем:

image_angle += 90 То это повернёт спрайт (как следствие и объект) на 90 градусов и он будет уже смотреть направо. У некоторых людей проблемы с пониманием градусов поворота, для наглядности покрутите спрайт отдельно с помощью базовой функции графического редактора: Как сделать поворот спрайта или объекта в GameMaker: Studio

+90 градусов это поворот направо, если изначально смотрел смотрел наверх

Функция поворота вам пригодиться почти в любой игре, особенно в TDS.

Так-же можете уже в step написать например "image_angle += 1" и это заставить объект и спрайт крутиться, изменяя угол на 1 градус каждый тик.

С помощью кручения можно делать очень много всего, например часто заставляют постоянно крутиться бонусы на карте или какие-то другие объекты. Это просто визуальный эффект.

Параметр угла наклона спрайта полезен и например при стрельбе или самое банальное, вам нужно чтобы ваш герой крутился в направлении мышки или прицела.

Для этого мы задаём угол исходя из положения мышки (или чего угодно, например исходя из положения героя, чтобы на него "крутились" враги, направляя свой взор):

Как сделать поворот спрайта или объекта в GameMaker: Studio В данном случае (кстати, чуток перерисовываю спрайты и будет обновление) крутиться ствол в руках у героя (справа снизу) по направлению к прицелу (мышке).

Так-же может крутиться башня у танка или что-то еще.

Ствол у меня отдельный объект и записано это вот так (в step - постоянная проверка):

image_angle=point_direction(x,y,mouse_x,mouse_y)

Угол зависит от направления мышки по Х и У. Всё довольно просто. 

Любопытно делать игру где ваш спрайт и объект будет крутится в 4 стороны и в зависимости от этого будет задаваться направление стрельбы.

Про это можете посмотреть моё видео, оно длинное (50 минут), но там я даю один вариантов как можно всё это сделать, видео как раз про танки которые я делаю с нуля:

Да, там довольно кривой метод сделать всё это, но это лишь один из методов и он рабочий.

Просто самые новички могли-бы делать для такой игры 4 спрайта (картинки) танков, или даже 4 объекта, под каждый угол отдельно, не зная как сделать иначе и проще.

На этом всё. Какие-то вопросы - пишите в комментах или спрашивайте в паблике ВК.

Другие статьи про геймдев и создание игр вы можете найти вот тут:

Так-же хочу вам посоветовать на правах рекламы дружественный блог о разработке игр  (Android, java, Gamedev, Unity3d): http://suvitruf.ru/

www.econdude.pw


Смотрите также