Вторник, 26 Ноября 2024, 20:38

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
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 = 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 меньше по времени.


  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг