Game Maker - создание игр | HellRoom Games

Game Maker | GameMaker: Studio [Game-Maker.ru] => Школа GML (архив) => Тема начата: Hummer от Апрель 17, 2011, 13:48:53



Название: Урок 3. Работа с изображениями.
Отправлено: Hummer от Апрель 17, 2011, 13:48:53
Всем привет! Мы пока прервёмся на перемещении, но это не значит, что мы его забрасываем. Сегодня я может подкину пару функций, которые я не успел рассмотреть на том уроке. А пока перейдём к не менее важному аспекту создания игр - изображеням. Этот урок будет непосредственно связан с предыдущим, так как мы будем потихоньку совершенствовать старый код.
Изображение - это визуальная часть игры.
Изображение - это группа пикселей определённых цветов.
Пиксель - это наименьшая единица изображения, имеющая свой цвет. Иногда, к характеристикам пикселей приписывают ещё и прозрачность. Пиксель - это важное понятие в разработке игр. Координаты измеряются тоже в пикселях. Например запись
Код:
x+=4
означает, что при выполнении этого действия каждый пиксель изображения будет сдвинут вправо на 4 единицы (пикселя). Повторяю, это не значит в миллиметрах или сантиметрах.

Из понятия изображение складывается понятие "событие столкновения". Событие столкновения срабатывает в том случае, когда хотя бы один пиксель одного объекта "наезжает" на пиксель другого объекта.

К изображениям в Game Maker относится специальный термин: спрайт
Спрайт - это один или несколько кадров в одном изображении. Понятие кадр мы рассмотрим позднее. Спрайт - это по сути то, как выглядит объект. Вы можете сразу присвоить спрайт объекту (в настройках), а можете прямо во время игры при помощи переменной sprite_index

sprite_index - содержит индекс текущего спрайта.
Текущего, то есть присвоенного объекту в данный момент. Если это переменная, то мы можем производить с ней такие же операции, как и с обычной переменной.

1) Присвоение:
Допустим, у нас в примере есть 2 спрайта s_red  - красный квадрат - и s_green - зелёный (давайте ресурсам осмысленные имена). Один объект ими оперирует. Так как в начале он будет выглядеть как красный, то сразу присвоим ему спрайт s_red
Суть примера: с начала игры проходит 3 секунды и спрайт квадратика меняется на зелёный. Реализуем пошагово
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(<выражение>)
{
case <значение1>: {<действия1>}
break;//это обязательно после каждой метки case!!!
case <значение2>: {<действия2>}
break;
}
Как видите - оператор switch это просто множество зашифрованных if-ов. Он много раз проверяет <выражение> на значения. И когда нашёл соответствие - выполняет соответствующие действия. ВНИМАНИЕ! следите чтобы после каждой метки case стоял оператор прерывания break! Это нужно для того, что бы после выполнения действий сразу пошли другие действия, иначе выполнится всё в операторе. Также после case должно стоят двоеточие. В нашем примере код со множеством спрайтов будет выглядеть приблизительно так
Код:
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 определяются то же из центра спрайта. Вот пример
Первый объект (слева) имеет координаты (50; 40) - по центру спрайта
Второй - (200; 90) - тоже исходя из центра
Как видите это играет немаловажную роль.
Обычно центр спрайта ставят по середине (фактическому центру спрайта). И лишь в редких случаях в другом месте.

Вернёмся к понятию кадр. Каждый спрайт может хранить несколько "подспрайты", которые называются кадрами. По сути наши спрайты тоже имели кадры (по одному), но "пустые" спрайты имеют 0 кадров. Конечно же здесь скрывается подвох. А именно в нумерации кадров. Она начинается с нуля.
Тот кадр, который сейчас рисуется (то есть проигрывается) называется текущим. Его можно узнать при помощи переменной image_index. Вообще image_index представляет собой число в промежутке от 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//устанавливаем спрайт ходьбы вправо(!)
image_speed=0.8//скорость ходьбы
image_xscale=-1//отличный метод
Мы встретили новую переменную. Те, кто знает английский могут догадаться, что она отвечает за масштаб, а префикс x означает "по оси х"
Можно себе представить, если функция несёт положительное значение (2 - увеличиваем в два раза; 3 - в три и т д), но что даёт отрицательное значение? Оказывается, знак - переворачивает картинку относительно её центра. Вот ещё почему важно правильно установить центр спрайта
Ну и следующее за ним (за минусом) число растягивает в своё значение раз.

Аналогично работает переменная image_yscale, только по оси y.

Вращение. Мы подходим к концу относительно изображений.
Тут тоже просто. image_angle устанавливает угол поворота спрайта в градусах, например image_angle=20. Помните о том, что отсчёт градусов (0) начинается справа, поэтому, если вы хотите достичь адекватного вращения делайте так, чтобы спрайт "смотрел" вправо, т. е. был туда направлен.

А теперь, под заключение урока представлю вам очень хорошую функцию:

point_direction(x1, y1, x2, y2) - возвращает направление от точки (x1, y1) до точки (x2, y2) в градусах. Схематично это можно представить так
Угол считается от направления направо, против часовой стрелки, в градусах. Поэтому огромная разница откуда вы считаете направление: от (x1, y1) до (x2, y2) или от (x2, y2) до (x1, y1).
На практике эту функцию обычно применяют для установки направления.
Код:
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=sp
Раз она устанавливает направление, то не будет ошибкой после её вызова оперировать с направлением (новым). Также, он устанавливает скорость (следственно для остановки нужно прописать speed=0)

Функция 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.c='ff'//можно
global.image_speed=4//нельзя: нельзя объявлять встроенную переменную (x, y, и все те, что сегодня узнали) как пользовательскую.
ВНИМАНИЕ! после слова global должен стоять оператор принадлежности (точка).

Задания:
Новички
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
Но вообще, куча разных анимаций в одном спрайте - не лучшее решение.
Например, если захочется добавить несколько новых кадров в анимации, то придётся менять значения в коде (и, возможно, что во многих местах). Кроме того, очень легко можно ошибиться.
Лучше сделать отдельные спрайты под каждую анимацию.
Кроме того, с разными спрайтами будет легче реализовывать проверки текущего состояния (if sprite_index == spr_walk { ... } и т.п.).
А еще лучше будет создавать переменную my_state=0, и задавать ее, когда меняется состояние\свойство\действие обьекта и вызывать конкретно это состояние при нажатии клавиш(удобно но тем, что можно комбинировать прыжок и еще что-нибудь, к примеру, но и подводные камни есть)


Название: 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;
Хм.. получается это все зависит от image_speed?


Название: 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-скорость воспроизведения картинок(всегда ваш кэп).
Вот и получается, что чем она выше, тем скорость проигрывания картинок, соответственно, выше. И эта скорость зависит от скорости комнаты.
Просто попробуйте привязать к клавише определенное количество картинок со скоростью (mage speed) 0.2 и 50 (скорость в комнате).
Нажмите клавишу. Картинки воспроизводятся, как надо. А теперь Поставьте скорость (image) 0.3, а в комнате скорость не меняйте.
Нажмите клавишу. Вот, видите, картинки воспроизводятся все. А теперь опставьте скорость в комнате 70.
Нажмите клавишу. И вуа-ля! Картинки опять воспроизводятся, как нам нужно, только слегка быстрее...
Переменная image_index указывает на то, какой кадр спрайта отображается в данный момент. Реальный же номер кадра берётся с отбрасыванием дробной части: то есть, для image_index равной 2.98 будет показан кадр 2, для 3.5 будет показан кадр 3 и т.п.
А переменная 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Гц, на это, полагаю, тоже можно отталкиваться(но смысла особого нет, так ведь?)
На максимальных разрешениях (которые фактически и используются) максимальная частота ниже (как раз 60 Гц). Чем ниже разрешение, тем максимальная частота выше.