Пятница, 19 Апреля 2024, 16:57

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Общие обсуждения программистов » Сегментная анимация.
Сегментная анимация.
AlkoshaДата: Воскресенье, 11 Января 2015, 14:51 | Сообщение # 1
участник
Сейчас нет на сайте
Разбил персонажа на отдельные спрайты-сегменты. Теперь надо бы заставить их слаженно двигаться.
На мегадрайве зачастую была подобного рода анимация.
Особенно в играх от Treasure: видео №1, видео №2
Или Konami: Видео №1, видео №2

На самом деле примеров куча. Но мне хотя бы без вращений осилить анимашку, и с гораздо меньшим количеством спрайтов.

Пока вот что получается (пока лишь на примере двух ключевых кадров):
ГИФ

Мне кажется, сам подход не корректный.
Код
class myKingOfHell
{
       SDL_Rect Dest;
       SDL_Texture* molottex;
       float molotx,moloty;
       SDL_Texture* torsotex;
       float torsox,torsoy;
       SDL_Texture* jawstex;
       float jawsx,jawsy;
       SDL_Texture* hooktex;
       float hookx,hooky;

       int animkey;
       float dx,dy;

       void endpoint(float nowX, float nowY, float endX, float endY, float speed)
       {
           auto angle=-atan2(nowX-endX,nowY-endY)/3.14*180;
           dx=sin(angle*3.14/180)*speed;
           dy=-cos(angle*3.14/180)*speed;
       }

public:
       float x=400,y;
       int state=1; // состояние 0=disable 1= idle 2= ползёт 3= атака

       myKingOfHell()
       {
           animkey=0;

           torsox=0;
           torsoy=0;
           molotx=15;
           moloty=190;
           jawsx=25;
           jawsy=100;
           hookx=110;
           hooky=100;
       }

       void update()
       {
           if(state==1)
               {
                   if(animkey==0)
                       {
                           endpoint(jawsx,jawsy,37,107,0.2);
                           jawsx+=dx;
                           jawsy+=dy;

                           endpoint(molotx,moloty,15,190,0.4);
                           molotx+=dx;
                           moloty+=dy;

                           endpoint(hookx,hooky,128,140,0.5);
                           hookx+=dx;
                           hooky+=dy;
                           if(hookx>=128)animkey=1;
                       }

                   if(animkey==1)
                       {
                           endpoint(jawsx,jawsy,25,100,0.2);
                           jawsx+=dx;
                           jawsy+=dy;

                           endpoint(molotx,moloty,20,200,0.2);
                           molotx+=dx;
                           moloty+=dy;

                           endpoint(hookx,hooky,110,100,1);
                           hookx+=dx;
                           hooky+=dy;

                           if(hookx<=110)animkey=0;
                       }

               }
       }

       void  display()
       {
           if(molottex==NULL)
               {
                   molottex = IMG_LoadTexture(renderer, "img//koh1.png");
               }
           if(torsotex==NULL)
               {
                   torsotex = IMG_LoadTexture(renderer, "img//koh2.png");
               }
           if(jawstex==NULL)
               {
                   jawstex = IMG_LoadTexture(renderer, "img//koh3.png");
               }
           if(hooktex==NULL)
               {
                   hooktex = IMG_LoadTexture(renderer, "img//koh4.png");
               }

           Dest.x=molotx-cum.x+x;
           Dest.y=moloty-cum.y+y;
           Dest.w=341;
           Dest.h=208;
           if(Dest.x>-341&&Dest.x<800)
               {
                   SDL_RenderCopy(renderer, molottex ,  NULL, &Dest);
               }

           Dest.x=torsox-cum.x+x;
           Dest.y=torsoy-cum.y+y;
           Dest.w=554;
           Dest.h=453;
           if(Dest.x>-554&&Dest.x<800)
               {
                   SDL_RenderCopy(renderer, torsotex ,  NULL, &Dest);
               }
           Dest.x=jawsx-cum.x+x;
           Dest.y=jawsy-cum.y+y;
           Dest.w=143;
           Dest.h=142;
           if(Dest.x>-143&&Dest.x<800)
               {
                   SDL_RenderCopy(renderer, jawstex ,  NULL, &Dest);
               }

           Dest.x=hookx-cum.x+x;
           Dest.y=hooky-cum.y+y;
           Dest.w=393;
           Dest.h=275;
           if(Dest.x>-393&&Dest.x<800)
               {
                   SDL_RenderCopy(renderer,hooktex ,  NULL, &Dest);
               }

       }

};
myKingOfHell KOH;


animkey = номер ключевого кадра.
Функция endpoint() отвечает за перемещение отдельно взятого спрайта. Тут ещё вручную задаю скорость перемещения каждого. Было бы неплохо, если б скорость сама определялась между ключевыми кадрами.

Добавлено (11 января 2015, 14:51)
---------------------------------------------
Там когда сегмент достигает до конечной - дрожит. Размах этого дрожания зависит от скорости. Вот эту траблу надо бы убрать.

Сообщение отредактировал Alkosha - Воскресенье, 11 Января 2015, 13:54
Форум игроделов » Программирование » Общие обсуждения программистов » Сегментная анимация.
  • Страница 1 из 1
  • 1
Поиск:

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