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 |
|
| |