avatar

Система плавного\смазанного движения или Motion-Blur

опубликовал в Game Maker
Данный урок я добавил по просьбе одного из разработчиков на «GameSetup»

Этот метод подходит для того, чтобы смазать\сгладить движение объекта(спрайта) по игровому полю. Под движением подразумевается именно движение по сторонам. Если спрайт будет вращаться, motion-blur'а не получится.

Итак, в событие Draw объекта, который мы хотим, чтобы смазывался, пишем:

Dist = point_distance(x,y,xprevious,yprevious);
Dir  = point_direction(x,y,xprevious,yprevious);
X_Position = x;
Y_Position = y;
if (Dist > 0)
   {
   Res   = 1; //Качество(от 1 до +100500, я рекомендую 1, как самое качественное)
   Dist /= Res;
   Num   = 0;
   if (Dist > Num)
      {
      Num    = Dist;
      Dist_x = 0;
      Dist_y = 0;
      };
   if (Dist > 0)
      {
      Dist_x = lengthdir_x(Dist / Num * Res,Dir);
      Dist_y = lengthdir_y(Dist / Num * Res,Dir);
      };
for (i = Num;i > 0;i -= 1)
      { 
      draw_sprite_ext(sprite_index,image_index,X_Position + i * Dist_x,Y_Position + i * Dist_y,image_xscale,image_yscale,0,image_blend,image_alpha / ( Num / 2))
      }; 
   }
else
    {
draw_sprite_ext(sprite_index,image_index,X_Position,Y_Position,image_xscale,image_yscale,image_angle,image_blend,image_alpha)
    };


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

17 комментариев

avatar
Голый код. Без пояснений, без ничего…
avatar
А что нужно пояснить? Главное работает, что ещё надо
avatar
Нужно пояснить, как именно это работает. А то что это такое, работать работает, а как именно неважно?
avatar
Если честно, я не могу подробно объяснить, как это работает. Самое простое объяснение:
Определяем положение объекта, записываем это в переменные. Определяем новое положение, вычисляем между ними разницу. Заполняем эту разницу спрайтами. Чем быстрее двигаемся, тем больше спрайтов.
avatar
Код не ваш что ли?
avatar
Этот код я использую в своей игре. В своей игре я использую только СВОЙ код. Я не вижу смысла комментировать каждую строчку, т.к. я не писатель, а программист. В простых алгоритмах я комментирую, а в подобных оставляю так.
avatar
Вы делаете всё наоборот :)
В простых алгоритмах комментарии излишни
for(i=0; i<10; i++)// Для каждого элемента массива
a[i]=i; // Выставим значение

Вот тут и так понятно, что код делает

А вот тут чёрт быстрее ногу сломит, чем поймёт, что тут происходит
int i=8, a1, a2;
for (a1=a2=1; i>2; a1=(a2+=a1)-a1)
  i--;
avatar
Поддерживаю. Тут комментарии излишне. Итак все понятно.

Нужно пояснить, как именно это работает.
Ты же программист. Пробегись глазами по коду и все поймешь.
avatar
Я то может и пойму, а вот новички? Это же всё-таки в разделе «уроки», а не «готовый код для вставки в игры»
avatar
А зачем нам новички, которые только и умеют что копипастить код? Пусть поседят 5 минут. Разберутся. Только умнее станут.
avatar
Либо вы троллите, либо я не одобряю такого подхода.
avatar
Просто я думаю, нельзя достоверно объяснить мысли одного программиста другому, так как все программисты мыслят по-разному. Для этого как минимум нужно строить логические схемы, таблицы истинности, ну или поэму писать. )
avatar
Для этого и придумали алгоритмы и блок-схемы :) Если не можешь выразить свои мысли — нарисуй блок-схему, и уже по ней будет ясен алгоритм. В коде же порой пару комментариев достаточно, чтобы объяснить любой костыль или нагромождение.
avatar
Num   = 0;
   if (Dist > Num)
код не меняющий Dist
    if (Dist > 0)

Зачем так, что помешало объединить эти условия?
avatar
Для большей наглядности.
avatar
Под движением подразумевается именно движение по сторонам. Если спрайт будет вращаться, motion-blur'а не получится.

т.е. кубики которые красиво нарисованы на логотипе не возможно получить таким методом? тогда почему там кубики, а не пример работы именно этого скрипта.
avatar
Кубики на логотипе лишь для красоты и указывают на обую тему урока.
Чтобы оставить комментарий необходимо .