Название: Урок 3. Работа с изображениями. Отправлено: Hummer от Апрель 17, 2011, 13:48:53 Всем привет! Мы пока прервёмся на перемещении, но это не значит, что мы его забрасываем. Сегодня я может подкину пару функций, которые я не успел рассмотреть на том уроке. А пока перейдём к не менее важному аспекту создания игр - изображеням. Этот урок будет непосредственно связан с предыдущим, так как мы будем потихоньку совершенствовать старый код.
Изображение - это визуальная часть игры. Изображение - это группа пикселей определённых цветов. Пиксель - это наименьшая единица изображения, имеющая свой цвет. Иногда, к характеристикам пикселей приписывают ещё и прозрачность. Пиксель - это важное понятие в разработке игр. Координаты измеряются тоже в пикселях. Например запись Код: x+=4 означает, что при выполнении этого действия каждый пиксель изображения будет сдвинут вправо на 4 единицы (пикселя). Повторяю, это не значит в миллиметрах или сантиметрах. Из понятия изображение складывается понятие "событие столкновения". Событие столкновения срабатывает в том случае, когда хотя бы один пиксель одного объекта "наезжает" на пиксель другого объекта. К изображениям в Game Maker относится специальный термин: спрайт Спрайт - это один или несколько кадров в одном изображении. Понятие кадр мы рассмотрим позднее. Спрайт - это по сути то, как выглядит объект. Вы можете сразу присвоить спрайт объекту (в настройках), а можете прямо во время игры при помощи переменной sprite_index sprite_index - содержит индекс текущего спрайта. Текущего, то есть присвоенного объекту в данный момент. Если это переменная, то мы можем производить с ней такие же операции, как и с обычной переменной. 1) Присвоение: Допустим, у нас в примере есть 2 спрайта s_red - красный квадрат - и s_green - зелёный (давайте ресурсам осмысленные имена). Один объект ими оперирует. Так как в начале он будет выглядеть как красный, то сразу присвоим ему спрайт s_red 1) ...проходит 3 секунды... Тут дело идёт в алармам (таймерам). 2) с начала игры... То есть событие Create. Код: (Create) alarm[0]=3*30//3 секунды на 30 шагов в секунду Так, теперь идём в событие alarm 0. И там при помощи нашей переменной меняем спрайт Код: (alarm0) sprite_index=s_green//s_green - индекс нового спрайта. После этой строки у объекта появится новое изображение. Запускаем и проверяем, что всё верно. 2) Проверка значений: Теперь усложним наш процесс. Пусть спрайт меняется каждые 3 секунды. С красного на зелёный и наоборот. Событие Create остаётся. Меняем только alarm 0. По русски будет так: если текущий спрайт это s_green, то меняем на s_red иначе (значит спрайт s_red), меняем на s_green. Теперь интерпретируем это в GML Код: if(sprite_index=s_green) { sprite_index=s_red } else { sprite_index=s_green } alarm[0]=3*30//зацикливаем, чтобы повторялось каждые 3 секунды. Вот ещё одно доказательство, что sprite_index - это переменная. А что делать если у нас много спрайтов? Перечислять каждый с помощью if? Но это же неудобно. К тому же плохо читаемо. В этом случае подключаем новый оператор switch. Вот его примерный состав. Код: switch(<выражение>) Как видите - оператор switch это просто множество зашифрованных if-ов. Он много раз проверяет <выражение> на значения. И когда нашёл соответствие - выполняет соответствующие действия. ВНИМАНИЕ! следите чтобы после каждой метки case стоял оператор прерывания break! Это нужно для того, что бы после выполнения действий сразу пошли другие действия, иначе выполнится всё в операторе. Также после case должно стоят двоеточие. В нашем примере код со множеством спрайтов будет выглядеть приблизительно так{ case <значение1>: {<действия1>} break;//это обязательно после каждой метки case!!! case <значение2>: {<действия2>} break; } Код: switch(sprite_index) { case s_green: {sprite_index=s_red} break; case s_red: {sprite_index=s_white} break; case s_white: {sprite_index=s_brown} break; case s_brown: {sprite_index=s_green} break; } В настройках спрайта можно установить очень полезную вещь - центр спрайта. Центр - это крепление спрайта. Это и центр вращения, и координаты x и y определяются то же из центра спрайта. Вот пример Второй - (200; 90) - тоже исходя из центра Как видите это играет немаловажную роль. Обычно центр спрайта ставят по середине (фактическому центру спрайта). И лишь в редких случаях в другом месте. Вернёмся к понятию кадр. Каждый спрайт может хранить несколько "подспрайты", которые называются кадрами. По сути наши спрайты тоже имели кадры (по одному), но "пустые" спрайты имеют 0 кадров. Конечно же здесь скрывается подвох. А именно в нумерации кадров. Она начинается с нуля. Обычно кадры используют для создания анимации. В первую очередь, анимация характеризуется скоростью, хранящейся в переменной image_speed. Обычно используют малые значения. От 0.3 до 1.5 - это оптимально. Эта скорость означает сколько кадров в шаг будет сменяться. image_speed=1 означает, что каждый новый шаг будет использоваться следующий кадр. image_speed=2 - каждый новый шаг - каждый второй кадр. image_speed=0.5 - кадр сменяется каждые 2 шага. То есть, частота смены смены кадров выражается формулой Код: f=1/image_speed //где f - частота; image_speed смотри выше. Чтобы анимация не проигрывалась на данный момент используйте конструкцию Код: image_speed=0 Вот ещё одна переменная: image_number - содержит общее количество кадров в спрайте. ВНИМАНИЕ! Переменная не может быть изменена! О таком специальном типе данных мы поговорим позже. image_alpha - переменная (от 0 до 1), содержащая коэффициент прозрачности изображения. 0 - полностью прозрачный; 1 - полностью непрозрачный Масштабирование. У большинства людей при слове масштаб возникает ассоциация очень большого или очень маленького предмета. Отчасти это верно. Но в ГМ есть потрясающая способность, позволяющая сэкономить вес игры, время и вообще будет выглядеть по-мастерски. Итак, практическая нужда. Игра-платформер. Есть анимация игрока, идущего вправо. А теперь надо, что шёл влево. Как это сделать? Вроде выход один - перерисовать спрайт и анимацию для ходьбы влево. Но есть оптимальный метод. Допустим при нажатии клавиши вправо Код: (Вправо) sprite_index=s_go_right//устанавливаем спрайт ходьбы вправо Тогда в клавишу влево можно поместить кодimage_speed=0.8//скорость ходьбы /*остальное передвижение*/ Код: sprite_index=s_go_right//устанавливаем спрайт ходьбы вправо(!) Мы встретили новую переменную. Те, кто знает английский могут догадаться, что она отвечает за масштаб, а префикс x означает "по оси х"image_speed=0.8//скорость ходьбы image_xscale=-1//отличный метод Можно себе представить, если функция несёт положительное значение (2 - увеличиваем в два раза; 3 - в три и т д), но что даёт отрицательное значение? Оказывается, знак - переворачивает картинку относительно её центра. Вот ещё почему важно правильно установить центр спрайта Аналогично работает переменная image_yscale, только по оси y. Вращение. Мы подходим к концу относительно изображений. Тут тоже просто. image_angle устанавливает угол поворота спрайта в градусах, например image_angle=20. Помните о том, что отсчёт градусов (0) начинается справа, поэтому, если вы хотите достичь адекватного вращения делайте так, чтобы спрайт "смотрел" вправо, т. е. был туда направлен. А теперь, под заключение урока представлю вам очень хорошую функцию: point_direction(x1, y1, x2, y2) - возвращает направление от точки (x1, y1) до точки (x2, y2) в градусах. Схематично это можно представить так На практике эту функцию обычно применяют для установки направления. Код: direction=point_direction(x, y, 0, 0) И зачастую используют такое устоявшееся выражениеКод: (Step) image_angle=direction Сразу после установки направления. Это позволяет объект "смотреть" куда он идёт.Кстати, теперь мы можем понять действие функции move_towards_point(xto, yto, sp). Она аналогична следующим выражениям Код: direction=point_direction(x, y, xto, yto) Раз она устанавливает направление, то не будет ошибкой после её вызова оперировать с направлением (новым). Также, он устанавливает скорость (следственно для остановки нужно прописать speed=0)speed=sp Функция point_direction поможет нам познакомиться с новым оператором - точкой и новым хранилищем данных - global. Точка - это оператор принадлежности. Слева от неё должен стоять имя объекта, одно из специальных слов (self, other, all) или хранилище global (об этом чуточку позже). А справа - имя переменной, которая уже содержится в объекте, если её нет, то считается, что это инициализация. Универсальные переменные, которые можно вызвать - это x, y и все те, о которых мы сегодня говорили. Пример Код: a=self.x b=other.y c=block.sprite_index//подразумевается, что в комнате есть объект block и т. д. Хранилище global - даёт новый вид данных. Обычные переменные(определённые пользователем) видны только внутри объекта. А если же их объявить при помощи хранилища global, то эту переменную будут видеть все объекты, находящиеся в комнате. Например Код: global.s=7//можно ВНИМАНИЕ! после слова global должен стоять оператор принадлежности (точка).global.c='ff'//можно global.image_speed=4//нельзя: нельзя объявлять встроенную переменную (x, y, и все те, что сегодня узнали) как пользовательскую. Задания: Новички 1) Вопросы: A) Имеет ли смысл запись? (каждая новая строка - новая запись) - подразумевается, что существуют объекты o_wall, o_gamer. Если нет - объяснить почему Код: a)self.speed=2 б)o_block.kq=0.54 в)other.self=2 г)o_gamer.x+=1 д)o_wall.image_alpha=1.5 Среднечки 1) Вопросы: А) Имеет ли смысл запись? (каждая новая строка - новая запись) - подразумевается, что существуют пустые (без единой строчки кода) объекты o_wall, o_gamer. Если нет - объяснить почему Код: а)global.y/=2 б)o_gamer..u=1 в)w.o_wall-=2 г)global.ind=index д)with(o_gamer){i=0} Название: Re: Урок 3. Работа с изображениями. Отправлено: OverBoy от Апрель 17, 2011, 14:08:19 Очень хороший урок! ;)
Название: Re: Урок 3. Работа с изображениями. Отправлено: illidan от Апрель 17, 2011, 14:18:46 Спасибо большое за уроки!!! ;) sm_respekt ;)
Название: Re: Урок 3. Работа с изображениями. Отправлено: Hummer от Апрель 19, 2011, 08:50:34 Задания вывешены, можно приступать к выполнению ;)
Название: Re: Урок 3. Работа с изображениями. Отправлено: S_Kleer от Апрель 19, 2011, 16:01:49 Как я полагаю, архив new для новичков?
Мне нужно скачать только для про? Название: Re: Урок 3. Работа с изображениями. Отправлено: Hummer от Апрель 19, 2011, 16:13:04 Конечно sm_epik
Название: Re: Урок 3. Работа с изображениями. Отправлено: Nikstorm от Апрель 19, 2011, 18:23:24 f=1/image_speed //где а - частота; image_speed смотри выше.
Где взялась а? Название: Re: Урок 3. Работа с изображениями. Отправлено: Hummer от Апрель 19, 2011, 19:20:15 а - это f на русской раскладке ;D
PS исправил Название: Re: Урок 3. Работа с изображениями. Отправлено: S_Kleer от Апрель 19, 2011, 19:55:28 Что-то в оптимизации у меня полный бред получился... :-\
Название: Re: Урок 3. Работа с изображениями. Отправлено: G_CCompany от Апрель 19, 2011, 22:19:16 Вопрос насчёт теории: а в задании подразумевается, что переменная y, к примеру, уже объявлена, здесь проверяется только правильность записи?
Название: Re: Урок 3. Работа с изображениями. Отправлено: Nikstorm от Апрель 20, 2011, 00:00:16 А то я что-то посмотрел,и слегка смутился.
Добавлено: Апрель 20, 2011, 00:21:36 Слева от неё должен стоять имя объекта, одно из специальных слов (self, other, all) или хранилище global (об этом чуточку позже). А слева - имя переменной, которая уже содержится в объекте, если её нет, то считается, что это инициализация. Универсальные переменные, которые можно вызвать - это x, y и все те, о которых мы сегодня говорили. Пример а тут что всё таки должно слева,а что не слева Название: Re: Урок 3. Работа с изображениями. Отправлено: Hummer от Апрель 20, 2011, 05:16:16 ну блин, а примеры на что :facepalm:
Название: Re: Урок 3. Работа с изображениями. Отправлено: Dankov от Апрель 20, 2011, 07:53:20 Неплохо, но по идее там разбираться надо(Ну в уроке), обычно чтобы запомнить и понять надо несколько раз прочитать всё sm:)
Название: Re: Урок 3. Работа с изображениями. Отправлено: _KO_ от Апрель 20, 2011, 10:11:26 в оптимизации для новичков написано:"исправить баг с вращением", в смысле, когда он движется, он не должен вращаться?
Название: Re: Урок 3. Работа с изображениями. Отправлено: Hummer от Апрель 20, 2011, 11:54:08 ну когда он вращается, то он вращается не правильно.
Название: Re: Урок 3. Работа с изображениями. Отправлено: Nikstorm от Апрель 20, 2011, 17:06:30 ну блин, а примеры на что :facepalm: Ну так то примеры примерами,а вот ошибки- это нехорошо.Тем более не в маловажном моменте. Название: Re: Урок 3. Работа с изображениями. Отправлено: G_CCompany от Апрель 20, 2011, 17:17:32 И всё-таки я хочу услышать ответ на свой вопрос. Ведь "а тут то что слева а что не слева" ну было бы слишком просто для среднячков.
Пробовал протестировать пустые объекты с данными переменными в GM - повсюду вылезали ошибки. Помогите! sm:sh Название: Re: Урок 3. Работа с изображениями. Отправлено: Hummer от Апрель 27, 2011, 16:10:18 имя_объекта.переменная=значение
Так их можно объявлять и изменять Название: Re: Урок 3. Работа с изображениями. Отправлено: G_CCompany от Апрель 27, 2011, 16:31:17 Да нет же, я это знаю, у меня вопрос насчёт другого: считается ли, что данные переменные (в задании для среднячков) уже где-то объявлены, или это у них сразу прописывается в событии Create?
Название: Re: Урок 3. Работа с изображениями. Отправлено: Hummer от Апрель 27, 2011, 16:33:46 Цитировать Пустые (без единой строчки кода) Название: Re: Урок 3. Работа с изображениями. Отправлено: G_CCompany от Апрель 27, 2011, 16:41:03 Аааа... Задание с большим подвохом.
И что означает "Имеет ли смысл запись"? Что при вставке её в объект она не выдаст ошибки при запуске, или что она грамматически верна? Название: Re: Урок 3. Работа с изображениями. Отправлено: Hummer от Апрель 27, 2011, 17:26:44 и то и другое, только ты должен это решить теоретически, а не юзать ГМ
Название: Re: Урок 3. Работа с изображениями. Отправлено: G_CCompany от Апрель 27, 2011, 19:53:48 и то и другое, только ты должен это решить теоретически, а не юзать ГМ Вот в том и дело, что я сначала подумал, а потом проверил. Тогда я обосную свою точку зрения.Название: Re: Урок 3. Работа с изображениями. Отправлено: SotGE от Июль 07, 2011, 16:02:36 Великолепный урок) Все понятно ;)
Название: Re: Урок 3. Работа с изображениями. Отправлено: aleckei от Сентябрь 03, 2011, 19:47:32 оппечатка!!!которые Я не успели рассмотреть на том уроке.
в самом начале материала! Название: Re: Урок 3. Работа с изображениями. Отправлено: Hummer от Сентябрь 04, 2011, 10:25:26 спасибо, но зачем так кричать). Я не робот и не бот, поэтому тоже допускаю ошибки).
Название: Re: Урок 3. Работа с изображениями. Отправлено: KoCT9 от Ноябрь 13, 2011, 00:59:15 Помогите( напишите код как использовать функцию alarm[0..11]
Название: Re: Урок 3. Работа с изображениями. Отправлено: Dmi7ry от Ноябрь 13, 2011, 08:12:35 Помогите( напишите код как использовать функцию alarm[0..11] просто присваиваете нужному alarm'у значение, через сколько шагов он должен сработать.Код: alarm[0]=60 // при скорости комнаты 30 сработает через 2 секунды Ну и нужно создать событие для выбранного alarm'а.По сути, alarm[0]...alarm[11] - это переменные, значение которых каждый шаг уменьшается на 1. Из справки: Цитата: Справка Вы уже должны знать, что каждый экземпляр объекта имеет 12 таймеров, которые Вы можете установить. Чтобы изменить значения (или получить значения) другого таймера, используйте следующие переменные: alarm[0..11] Значение для указанного таймера. (Не забудьте, что таймер будет вести отсчёт только в том случае, если событие таймера для объекта содержит действия!) Название: Re: Урок 3. Работа с изображениями. Отправлено: Nonyx от Апрель 12, 2016, 08:32:04 А вот если в объекте спрайт с анимацией в 129 картинок. Как сделать, чтобы при создании проигрываились картинки с 7ой по 9ую?
Название: Re: Урок 3. Работа с изображениями. Отправлено: depict от Апрель 12, 2016, 09:02:41 А вот если в объекте спрайт с анимацией в 129 картинок. Как сделать, чтобы при создании проигрываились картинки с 7ой по 9ую? :gm123: Create: Код: image_index = 7; image_speed = 0.1; // пожеланию :gm126: Step: Код: if (image_index == 10) image_index = 7; // на экране увидим 7,8,9 кадр Название: Re: Урок 3. Работа с изображениями. Отправлено: Fur от Апрель 12, 2016, 09:06:06 Не увидим, ибо при скорости в 0.3, например, кадр проскочится.
Это пара ифов, Гора, если включить моск и подумать больше пяти минут, всё решится. Название: Re: Урок 3. Работа с изображениями. Отправлено: Nonyx от Апрель 12, 2016, 09:21:10 А вот если в объекте спрайт с анимацией в 129 картинок. Как сделать, чтобы при создании проигрываились картинки с 7ой по 9ую? :gm123: Create: Код: image_index = 7; image_speed = 0.1; // пожеланию :gm126: Step: Код: if (image_index == 10) image_index = 7; // на экране увидим 7,8,9 кадр О, спасибо, работает, sm_respekt Добавлено: Апрель 12, 2016, 09:30:26 А вот если в объекте спрайт с анимацией в 129 картинок. Как сделать, чтобы при создании проигрываились картинки с 7ой по 9ую? :gm123: Create: Код: image_index = 7; image_speed = 0.1; // пожеланию :gm126: Step: Код: if (image_index == 10) image_index = 7; // на экране увидим 7,8,9 кадр работает, только не могу понять по какому принципу :angel: :whistling: Добавлено: Апрель 12, 2016, 09:39:25 Странно. При image_xscale-=1 изображение "растет" А вот при image_xscale=-1 движется как надо О.о Название: Re: Урок 3. Работа с изображениями. Отправлено: DmitryDS от Апрель 12, 2016, 09:50:47 работает, только не могу понять по какому принципу :angel: :whistling: Если посмотреть в справке в разделе Objects and Instances (Объекты и Экземпляры), то можно узнать, что image_index - это номер текущего кадра спрайта, а image_speed - величина, на которую этот номер возрастает каждый шаг. Так что этот код говорит: при создании ставим 7 кадр и увеличиваем его номер на 0,1 каждый шаг; при шаге, если номер кадра - 10, то ставим опять 7. Цитировать Добавлено: Апрель 12, 2016, 09:39:25 Странно. При image_xscale-=1 изображение "растет" А вот при image_xscale=-1 движется как надо О.о Может, потому что оператор "-=" отнимает значение ("+=" прибавляет, "*=" умножает, "/=" делит), а "=" - присваивает? (Раздел справки GML Overview, пункт assignment) Название: Re: Урок 3. Работа с изображениями. Отправлено: Nonyx от Апрель 13, 2016, 21:43:30 А вот если в объекте спрайт с анимацией в 129 картинок. Как сделать, чтобы при создании проигрываились картинки с 7ой по 9ую? :gm123: Create: Код: image_index = 7; image_speed = 0.1; // пожеланию :gm126: Step: Код: if (image_index == 10) image_index = 7; // на экране увидим 7,8,9 кадр Слушай, а ты не знаешь как вот это вот привязать к клавише? а то у меня все 129 картинок воспроизводятся, вместо того, чтобы воспроизводились с 40ой по 50ую (отчет с нуля) Название: Re: Урок 3. Работа с изображениями. Отправлено: DmitryDS от Апрель 13, 2016, 21:49:24 Думаю, хорошим решением будет завести переменную с состоянием героя. При смене состояния ставить первый кадр из необходимой анимации, а в Step проверять, не наступил ли конец анимации текущего состояния.
Название: Re: Урок 3. Работа с изображениями. Отправлено: Nonyx от Апрель 13, 2016, 21:57:03 Думаю, хорошим решением будет завести переменную с состоянием героя. При смене состояния ставить первый кадр из необходимой анимации, а в Step проверять, не наступил ли конец анимации текущего состояния. типа разделить все движения не на картинки, а на спрайты? Название: Re: Урок 3. Работа с изображениями. Отправлено: DmitryDS от Апрель 13, 2016, 22:00:24 Типа завести отдельную переменную, от которой будет зависеть, какой кадр стартовый, а какой конечный, а дальше по примеру depict'а.
Название: Re: Урок 3. Работа с изображениями. Отправлено: Nonyx от Апрель 13, 2016, 22:05:45 Типа завести отдельную переменную, от которой будет зависеть, какой кадр стартовый, а какой конечный, а дальше по примеру depict'а. Всё, понял. Должно сработать. Название: Re: Урок 3. Работа с изображениями. Отправлено: Dmi7ry от Апрель 13, 2016, 22:10:44 Код: if (image_index == 10) image_index = 7; // на экране увидим 7,8,9 кадр Правильно будет: Код: if (image_index >= 10) image_index = 7; Название: Re: Урок 3. Работа с изображениями. Отправлено: Nonyx от Апрель 13, 2016, 22:26:55 Код: if (image_index == 10) image_index = 7; // на экране увидим 7,8,9 кадр Правильно будет: Код: if (image_index >= 10) image_index = 7; сработало, плюс поставил за помощь, только вот чем это будет отличаться от "if (image_index>10) {image_index=7} ? Название: Re: Урок 3. Работа с изображениями. Отправлено: DmitryDS от Апрель 13, 2016, 22:31:23 Тем, что 10 кадр не влезет, если будет точно 10
Как вы, вероятно, помните, ">" - строго больше, ">=" - больше либо равно Название: Re: Урок 3. Работа с изображениями. Отправлено: Dmi7ry от Апрель 13, 2016, 22:34:25 чем это будет отличаться от "if (image_index>10) {image_index=7} ? Это зависит от места, где и как прописан код.В одном из случаев, «>=10» будет пропускать 10 кадр, а «>10» будет показывать 10 кадр. А в каких-то случаях разницы не будет. Название: Re: Урок 3. Работа с изображениями. Отправлено: Nonyx от Апрель 13, 2016, 22:38:20 чем это будет отличаться от "if (image_index>10) {image_index=7} ? Это зависит от места, где и как прописан код.В одном из случаев, «>=10» будет пропускать 10 кадр, а «>10» будет показывать 10 кадр. А в каких-то случаях разницы не будет. понятно. спасибо Добавлено: Апрель 13, 2016, 22:46:02 чем это будет отличаться от "if (image_index>10) {image_index=7} ? Это зависит от места, где и как прописан код.В одном из случаев, «>=10» будет пропускать 10 кадр, а «>10» будет показывать 10 кадр. А в каких-то случаях разницы не будет. Ого, даже к прыжку привязать получилось О.о Название: Re: Урок 3. Работа с изображениями. Отправлено: Dmi7ry от Апрель 13, 2016, 22:54:33 Но вообще, куча разных анимаций в одном спрайте - не лучшее решение.
Например, если захочется добавить несколько новых кадров в анимации, то придётся менять значения в коде (и, возможно, что во многих местах). Кроме того, очень легко можно ошибиться. Лучше сделать отдельные спрайты под каждую анимацию. Кроме того, с разными спрайтами будет легче реализовывать проверки текущего состояния (if sprite_index == spr_walk { ... } и т.п.). Название: Re: Урок 3. Работа с изображениями. Отправлено: Christopher от Апрель 13, 2016, 23:35:19 Но вообще, куча разных анимаций в одном спрайте - не лучшее решение. А еще лучше будет создавать переменную my_state=0, и задавать ее, когда меняется состояние\свойство\действие обьекта и вызывать конкретно это состояние при нажатии клавиш(удобно но тем, что можно комбинировать прыжок и еще что-нибудь, к примеру, но и подводные камни есть)Например, если захочется добавить несколько новых кадров в анимации, то придётся менять значения в коде (и, возможно, что во многих местах). Кроме того, очень легко можно ошибиться. Лучше сделать отдельные спрайты под каждую анимацию. Кроме того, с разными спрайтами будет легче реализовывать проверки текущего состояния (if sprite_index == spr_walk { ... } и т.п.). Название: Re: Урок 3. Работа с изображениями. Отправлено: Nonyx от Апрель 14, 2016, 00:26:19 Но вообще, куча разных анимаций в одном спрайте - не лучшее решение. ну ведь новые картинки можно в конец пихать...Например, если захочется добавить несколько новых кадров в анимации, то придётся менять значения в коде (и, возможно, что во многих местах). Кроме того, очень легко можно ошибиться. Лучше сделать отдельные спрайты под каждую анимацию. Кроме того, с разными спрайтами будет легче реализовывать проверки текущего состояния (if sprite_index == spr_walk { ... } и т.п.). Название: Re: Урок 3. Работа с изображениями. Отправлено: Christopher от Апрель 14, 2016, 00:34:52 Да, но чуть какая ошибка в коде - анимация будет воспроизводиться вся
Поэтому лучше разделять анимации по действиям и менять с помощью sprite_index Название: Re: Урок 3. Работа с изображениями. Отправлено: depict от Апрель 14, 2016, 07:35:33 Код: if (image_index == 10) image_index = 7; // на экране увидим 7,8,9 кадр Правильно будет: Код: if (image_index >= 10) image_index = 7; Название: Re: Урок 3. Работа с изображениями. Отправлено: Dmi7ry от Апрель 14, 2016, 07:46:08 Хм.. получается это все зависит от image_speed? Да.Название: Re: Урок 3. Работа с изображениями. Отправлено: Nonyx от Апрель 14, 2016, 22:34:02 и еще... к примеру, у нас картинки 1,2,3,4.
Мы ставим картинки 2,3,4 со скоростью 0.2. Они у нас воспроизводятся. Но когда ставим 0.3. Они у нас воспроизводятся все. Я это исправил так: скопировал картинки 1,2,3,4 и теперь у меня картинки 1, 1, 2, 2, 3, 3, 4,4. и теперь со скорстью 0.3 они воспроизводятся. можно либо так, либо изменить скорость в комнате :whistling: Название: Re: Урок 3. Работа с изображениями. Отправлено: Christopher от Апрель 15, 2016, 02:03:14 и еще... к примеру, у нас картинки 1,2,3,4. а можно исключить некоторые из показа, не заморачиваясьМы ставим картинки 2,3,4 со скоростью 0.2. Они у нас воспроизводятся. Но когда ставим 0.3. Они у нас воспроизводятся все. Я это исправил так: скопировал картинки 1,2,3,4 и теперь у меня картинки 1, 1, 2, 2, 3, 3, 4,4. и теперь со скорстью 0.3 они воспроизводятся. можно либо так, либо изменить скорость в комнате :whistling: Название: Re: Урок 3. Работа с изображениями. Отправлено: Dmi7ry от Апрель 15, 2016, 07:58:01 и еще... к примеру, у нас картинки 1,2,3,4. Я не понял, о чём вы говорите, но то, что вы предлагаете - и дублирование изображений, и смена скорости комнаты для изменения показываемой последовательности - это глупость.Мы ставим картинки 2,3,4 со скоростью 0.2. Они у нас воспроизводятся. Но когда ставим 0.3. Они у нас воспроизводятся все. Я это исправил так: скопировал картинки 1,2,3,4 и теперь у меня картинки 1, 1, 2, 2, 3, 3, 4,4. и теперь со скорстью 0.3 они воспроизводятся. можно либо так, либо изменить скорость в комнате :whistling: Название: Re: Урок 3. Работа с изображениями. Отправлено: Nonyx от Апрель 15, 2016, 08:47:57 и еще... к примеру, у нас картинки 1,2,3,4. Я не понял, о чём вы говорите, но то, что вы предлагаете - и дублирование изображений, и смена скорости комнаты для изменения показываемой последовательности - это глупость.Мы ставим картинки 2,3,4 со скоростью 0.2. Они у нас воспроизводятся. Но когда ставим 0.3. Они у нас воспроизводятся все. Я это исправил так: скопировал картинки 1,2,3,4 и теперь у меня картинки 1, 1, 2, 2, 3, 3, 4,4. и теперь со скорстью 0.3 они воспроизводятся. можно либо так, либо изменить скорость в комнате :whistling: Насколько я успел понять, пока работал с этими картинками, image_speed-скорость воспроизведения картинок(всегда ваш кэп). Вот и получается, что чем она выше, тем скорость проигрывания картинок, соответственно, выше. И эта скорость зависит от скорости комнаты. Просто попробуйте привязать к клавише определенное количество картинок со скоростью (mage speed) 0.2 и 50 (скорость в комнате). Нажмите клавишу. Картинки воспроизводятся, как надо. А теперь Поставьте скорость (image) 0.3, а в комнате скорость не меняйте. Нажмите клавишу. Вот, видите, картинки воспроизводятся все. А теперь опставьте скорость в комнате 70. Нажмите клавишу. И вуа-ля! Картинки опять воспроизводятся, как нам нужно, только слегка быстрее... Хотя я не гарантирую, что и в GMS так. Она покруче моего GM8 будет. Название: Re: Урок 3. Работа с изображениями. Отправлено: Christopher от Апрель 15, 2016, 10:25:42 sm_sarcastic sm_sarcastic
1. Желательно задвать скорость более кратную двум, обычно используются 15, 30, 60,90,120(последние в два раза реже) 2. Конечно оно будет быстрее, скорость комнаты(в идеальных условиях) - скорость кол-ва шагов, обрабатываемых в секунду. ПОэтому, условно, можно сказать, что при скорости в 60 у тебя будет 60 фпс(хотя это может быть и не так) 3.сколько я понимаю, image_speed лучше использовать без дробных значений, хотя у меня получалось даже так: кол-во кадров\секунду делать, чтобы анимация синхронизировалась почти 100% по времени 4. Все же лучше, как тебе уже говорили, разбивать анимации на составные(идти, бежать, прыгать, рыгать) и назначать их с помощью sprite_speed, соответственно,желательно кратное двум(хотя некоторую анимацию можно сделать и с помощью кода) Название: Re: Урок 3. Работа с изображениями. Отправлено: Dmi7ry от Апрель 15, 2016, 11:02:14 Насколько я успел понять, пока работал с этими картинками, image_speed-скорость воспроизведения картинок(всегда ваш кэп). Переменная image_index указывает на то, какой кадр спрайта отображается в данный момент. Реальный же номер кадра берётся с отбрасыванием дробной части: то есть, для image_index равной 2.98 будет показан кадр 2, для 3.5 будет показан кадр 3 и т.п.Вот и получается, что чем она выше, тем скорость проигрывания картинок, соответственно, выше. И эта скорость зависит от скорости комнаты. Просто попробуйте привязать к клавише определенное количество картинок со скоростью (mage speed) 0.2 и 50 (скорость в комнате). Нажмите клавишу. Картинки воспроизводятся, как надо. А теперь Поставьте скорость (image) 0.3, а в комнате скорость не меняйте. Нажмите клавишу. Вот, видите, картинки воспроизводятся все. А теперь опставьте скорость в комнате 70. Нажмите клавишу. И вуа-ля! Картинки опять воспроизводятся, как нам нужно, только слегка быстрее... А переменная image_speed указывает, на сколько будет изменяться переменная image_index каждый шаг. То есть image_speed прибавляется каждый шаг к image_index. Соответственно, что при шаге 0.2, что при шаге 0.3, будут показаны все изображения и ни одно не будет пропущено, и это не зависит от скорости комнаты. Пропуск изображений возможен только если image_speed превышает единицу. Что касается скорости комнаты 70. Абсолютное большинство мониторов имеет частоту обновления экрана, равную 60 Гц, из-за чего некоторые кадры будут просто не видны (либо будет разрыв изображения, известный как tearing). Поэтому, в абсолютном большинстве случаев, ставить скорость комнаты более 60 смысла не имеет - ни к чему, кроме повышенной нагрузки процессора и видеокарты, это приводить не будет (без ожидаемого видимого результата). Название: Re: Урок 3. Работа с изображениями. Отправлено: Dmi7ry от Апрель 15, 2016, 11:03:40 3.сколько я понимаю, image_speed лучше использовать без дробных значений Совершенно не важно.Название: Re: Урок 3. Работа с изображениями. Отправлено: DmitryDS от Апрель 15, 2016, 11:08:31 скорость комнаты(в идеальных условиях) - скорость кол-ва шагов, обрабатываемых в секунду. Ну только все же просто "кол-во шагов, обрабатываемых в секунду" :_wink_: Цитировать сколько я понимаю, image_speed лучше использовать без дробных значений Можно, в принципе, и дробные, но чтобы можно было выразить обыкновенной дробью с числителем 1 (0,2 = 1/5 и т.д.). Тогда гарантированно равномерная смена кадров без пропусков будет. Цитировать Все же лучше, как тебе уже говорили, разбивать анимации на составные(идти, бежать, прыгать, рыгать) и назначать их с помощью sprite_speed *sprite_index :xD: Название: Re: Урок 3. Работа с изображениями. Отправлено: Christopher от Апрель 15, 2016, 11:09:50 Цитировать большинство мониторов имеет частоту обновления экрана, равную 60 Гц сейчас все больше и больше замечаю мониторы(при том и не на самых передовых ПК, далеко не самых передовых)частоту в 75Гц, на это, полагаю, тоже можно отталкиваться(но смысла особого нет, так ведь?) Добавлено: Апрель 15, 2016, 11:11:04 *sprite_index :xD: упс, оговорочка sm_sarcasticНазвание: Re: Урок 3. Работа с изображениями. Отправлено: Dmi7ry от Апрель 15, 2016, 11:42:34 Цитировать большинство мониторов имеет частоту обновления экрана, равную 60 Гц сейчас все больше и больше замечаю мониторы(при том и не на самых передовых ПК, далеко не самых передовых)частоту в 75Гц, на это, полагаю, тоже можно отталкиваться(но смысла особого нет, так ведь?) |