2015-08-26 5 views
0

может кто-то пощечину мне формулу идеи или математику о том, как сделать мои враги двигаться в синусоидыПеремещение спрайтов в синусоиды

пытался что-то вроде этого, но они просто двигаться в то же время, так что они просто создают прямой линия врагов, движущихся влево и вправо.

for(int i = 0; i < 5; i++){ 
    float y = sinf(100+delta_time*0.06f) * 75; 
    float x = game->enemy[i].base_x + y; 
    game->enemy[i].x = x ; 
    game->enemy[i].y += 1; 
    SDL_Rect rect = { game->enemy[i].x , game->enemy[i].y ,game->enemy[i].w, game->enemy[i].h}; 
    SDL_RenderCopy(game->renderer , game->enemy[i].sprite , NULL , &rect); 
} 
+1

Не совсем уверен, что вы намерены точно, но если вы хотите, чтобы все спрайты двигались по одной и той же синусоиде, ваш аргумент sine не должен зависеть от времени, что одинаково для всех спрайтов, но на позициях спрайтов _x_ , –

+0

Я пытаюсь достичь чего-то вроде этого https://www.youtube.com/watch?v=Ol9TsSs-9ok&feature=youtu.be&t=1m38s – Nean

ответ

0

Дает v=(v_x,v_y) общее направление врага. Пусть o - это вектор o=(-v_y/||v||,v_x/||v||), где ||v||=sqrt(v_x.v_x+v_y.v_y) является нормой v. Вектор o перпендикулярен v. В этом направлении требуется синусоидальное движение. Следовательно, положение p(t)=(x(t),y(t)) определяется как:

x(t)=v_x.t-A.v_y/||v||.sin(w.t) 
y(t)=v_y.t+A.v_x/||v||.sin(w.t) 

, где A является величина ossilations и w пульсации ossilations. Соответствующая частота равна f=w/(2pi). Затем длина волны lambda=||v||/f соответствует длине осцилляций.

Если противник движется в направлении х (v_y=0), затем:

x(t)=v_x.t 
y(t)=A.sin(w.t) 

Длина ossilations является lambda=2pi.v_x/w.

Смежные вопросы