Sprites
|
|
JesusOnExtasy88 | Дата: Вторник, 16 Февраля 2021, 17:49 | Сообщение # 1 |
частый гость
Сейчас нет на сайте
| Есть спрайт в 7 кадров. Имя : sp_ShivaStay
Как прописать в объекте чтобы анимация проходила в стиле пинг-понг (1-2-3-4-5-6-7-6-5-4-3-2-1) Кто знает как лучше и правильнее прописать код в обьект с этим спрайтом.
|
|
| |
MagicHero | Дата: Вторник, 16 Февраля 2021, 21:10 | Сообщение # 2 |
участник
Сейчас нет на сайте
| А в чем собственно проблема сделать замкнутый счётчик от 0 до 6 и обратно и вставлять значения вместо номера спрайта?
|
|
| |
faridunibodullo | Дата: Вторник, 16 Февраля 2021, 21:34 | Сообщение # 3 |
частый гость
Сейчас нет на сайте
| if(image_index=image_number-1 && image_speed = 1){ image_speed = -1; }else if(image_index=0 && image_speed = -1){ image_speed = 1; }
|
|
| |
JesusOnExtasy88 | Дата: Среда, 17 Февраля 2021, 19:30 | Сообщение # 4 |
частый гость
Сейчас нет на сайте
| Это в Animation End писать?
|
|
| |
faridunibodullo | Дата: Среда, 17 Февраля 2021, 19:32 | Сообщение # 5 |
частый гость
Сейчас нет на сайте
| JesusOnExtasy88, в Step
|
|
| |
JesusOnExtasy88 | Дата: Среда, 17 Февраля 2021, 19:49 | Сообщение # 6 |
частый гость
Сейчас нет на сайте
| Спасибо, завтра проверю. Добавлено (18 Февраля 2021, 09:04) --------------------------------------------- faridunibodullo, Твоя функция не работает. Видимо я её уже проверял и на форум пришёл.
|
|
| |
MagicHero | Дата: Четверг, 18 Февраля 2021, 11:23 | Сообщение # 7 |
участник
Сейчас нет на сайте
| Цитата JesusOnExtasy88 ( ) faridunibodullo, Твоя функция не работает. Видимо я её уже проверял и на форум пришёл. Там все должно работать но вы видимо не использовали данный спрайт в виде дефолтного для обьекта, либо не задали скорость анимации в самом спрайте. Хотя проще сделать как я выше написал используя счетчик от 0 до 6 в step а в draw уже отрисовывать данный спрайт с указанным номером. К тому же спрайтов у обьекта может быть несколько на анимацию и через switch легко оперировать что нужно отображать в draw и какой использовать счетчик в step.
|
|
| |
2009yasha2009 | Дата: Четверг, 18 Февраля 2021, 14:06 | Сообщение # 8 |
частый гость
Сейчас нет на сайте
| В create:
Код anim_dir = 1;//направление на увеличение index_sp_loop = 0;//стартовый кадр number_img = sprite_get_number(sp_ShivaStay)-1;//количество кадров в спрайте В step:
Код if (anim_dir){ if (index_sp_loop<number_img) { index_sp_loop+=1; }else{ anim_dir = !anim_dir; } }else{ if (index_sp_loop>0) { index_sp_loop-=1; }else{ anim_dir = !anim_dir; } }//зацикливаем и триггерим выполнение В draw:
Код draw_sprite(sp_ShivaStay,index_sp_loop,128,128);
На гмс давно не кодил, но сейчас намалякал - вроде работает исправно. Для ГМС 1.4, но думаю и на ГМС 2 подобная реализация, лень его запускать...долго грузится хд Вообще, можно и циклом с массивами...но для такого, наверно слишком замароченно получится, но я могу быть и не прав. А так, можно написать функцию и так юзать много разных спрайтов.
Ватануки, Ватануки - первое апреля^^
|
|
| |
MagicHero | Дата: Пятница, 19 Февраля 2021, 11:18 | Сообщение # 9 |
участник
Сейчас нет на сайте
| 2009yasha2009 добавлю лишь то что +1 при скорости комнаты в 60 кадров будет слишком быстрая анимация и там можно использовать что то типа +0.2.
|
|
| |
JesusOnExtasy88 | Дата: Пятница, 19 Февраля 2021, 16:34 | Сообщение # 10 |
частый гость
Сейчас нет на сайте
| faridunibodullo, всё заработало с твоим кодом,таким образом разгрузил проект на 11мб
Добавлено (20 Февраля 2021, 18:28) --------------------------------------------- У меня вот ещё один вопрос появился. В каком случае этот код не будет работать? Страйт состоит из 12 кадров и всё стоит по деволту в спрайте но этот код не работает.
if(image_index=image_number-1 && image_speed = 1){ image_speed = -1; }else if(image_index=0 && image_speed = -1){ image_speed = 1; }
Аналогичный спрайт с 7 кадрами работает, в чём разница?
Сообщение отредактировал JesusOnExtasy88 - Суббота, 20 Февраля 2021, 18:29 |
|
| |
Ternox | Дата: Четверг, 25 Февраля 2021, 19:12 | Сообщение # 11 |
Light my fire
Сейчас нет на сайте
| JesusOnExtasy88, самое тупое что пришло на ум — image_speed то 1?
Ternoxgames.com. Разрабатывают игры и выпускаю их на консолях.
|
|
| |
Fire_Phoenix | Дата: Четверг, 25 Февраля 2021, 21:55 | Сообщение # 12 |
был не раз
Сейчас нет на сайте
| JesusOnExtasy88, я конечно не эксперт в GML, но разве нет ошибки в условии Вашего кода:
Цитата if(image_index=image_number-1 && image_speed = 1){ image_speed = -1; }else if(image_index=0 && image_speed = -1){ image_speed = 1; } ?
В ЯП обычно операторы присваивания и сравнения не могут быть идентичны - это вызывает путаницу, так например, если:
означает присваивание image_speed единицы, то в условии сравнения:
Цитата if (image_speed == 1) означает, если image_speed равно единице, то ...
P. S. Хотя, скорее всего, Вы про разницу "=" и "==" знаете, и это просто опечатка...
P. P. S. В условии "=" использовать конечно можно, при условии (тавтология, извините ), что Вам нужно присвоить значение, а не сравнить, тоже касается "++" и "--" в условиях (хотя такое уже встречается чаще, и может быть полезно)...
|
|
| |
MagicHero | Дата: Пятница, 26 Февраля 2021, 02:59 | Сообщение # 13 |
участник
Сейчас нет на сайте
| Fire_Phoenix ошибки там нет. В GMS2 можно использовать = вместо == при компелировании GMS поймет что от него хотят, но лучше все же начинать переучиваться писать правильно.
|
|
| |
Fire_Phoenix | Дата: Пятница, 26 Февраля 2021, 19:31 | Сообщение # 14 |
был не раз
Сейчас нет на сайте
| MagicHero, спасибо за разъяснения, про это я не знал:
Цитата В GMS2 можно использовать = вместо == при компелировании GMS поймет что от него хотят
о как, "=" и в условии, и в присваивании использовать можно? До чего техника дошла...
Тогда давайте разбираться...
Как я понял, image_index это не целочисленная переменная, то в условиях, равенство ("==") лучше не использовать (исходя из логики сравнения вещественных чисел).
Предлагаю такой код:
Код globalvar epsilon, frames, frame_step;
epsilon = math_get_epsilon();
var frames_count = 12; frames = sprite_add(<fname>, frames_count, 0, 0, 0, 0); sprite_index = frames;
frame_step = 1 / 30; image_speed = frame_step;
#define step if ((image_index > image_number - frame_step - epsilon) && (image_speed == frame_step)) { image_speed = -frame_step; } else if ((image_index < frame_step - epsilon) && (image_speed == -frame_step)) { image_speed = frame_step; }
#define draw draw_sprite(frames, image_index, 8, 8);
Этот код проверен, и работает.
Для проверки я использовал эту картинку:
Нужно ее указать как fname в sprite_add.
И да, неплохо бы сделать отладку с меньшим FPS, чтобы проверить правильность условий.
Вторую часть условия: Цитата (image_speed == ±frame_step)
можно опустить, но тогда, по идее первый и последний кадр анимации будут показываться на frame_step меньше по времени.
|
|
| |