| 
				
				Анимация движения
				 | 
 | 
| smach1 | Дата: Пятница, 06 Января 2012, 21:19 | Сообщение # 1 |  
 
был не раз 
Сейчас нет на сайте 
 
 | Осваиваю движок windmill. Пытаюсь сделать простенькую анимацию движения объекта.   Суть такова: персонаж делает несколько шагов по нажатию клавиши. Определенное количество шагов, даже если на клавишу уже не жмут.   Проблемный фрагмент кода таков: 
   Code  
   if(KeyCheck(DIK_SPACE))    {     setK=true; //глобальная переменная, изначально false    }         if(setK)    {         int v1=x; 
     while((x-v1)<50)     {      SetAnimation(anim,curAnim);      x+=step*12;  // step = 0.09, глобальная константа      Sleep(30);     } 
     setK=false; 
    } 
    else    {     SetAnimationSpeed(anim,0);    } 
      
   В результате при нажатии на клавишу персонаж перемещается на эти 50 пикселей через ~1 секунду, но промежуточная анимация не отображается.   До этого пробовал вариант с функцией timeGetTime и выполнением каждого кадра в теле цикла через каждые 10 миллисекунд, однако результат был примерно тем же. 
   Очевидно, что я допускаю какую то грубую ошибку, но уже пол дня застрял на этом месте и не могу понять, в чем конкретно.
 |  
| 
 | 
 |    | 
| Aprok | Дата: Суббота, 07 Января 2012, 01:32 | Сообщение # 2 |  
 
был не раз 
Сейчас нет на сайте 
 
 | Я не знаю что это за движок, и как он работает, и вполне могу ошибаться, но у вас часом SetAnimation(anim,curAnim) не выставляет саму анимацию в 0-й кадр? И нет ли какой-то ещё функции типа Animate которая эту самую анимацию запускает?   Можно код SetAnimation посмотреть?
 |  
| 
 | 
 |    | 
| smach1 | Дата: Суббота, 07 Января 2012, 07:54 | Сообщение # 3 |  
 
был не раз 
Сейчас нет на сайте 
 
 | Это где то в дебрях исходного кода движка, но не суть важно, поскольку движок полностью рабочий и конструкция вида 
   Code    if(CheckKey(DIK_D)&&!keyp) //keyp изначально false   {    curAnim=1;    SetAnimation(anim,curAnim);    keyp=true;    x++;   } 
   td = timeGetTime() - startTime;   startTime = timeGetTime();   if(KeysCheck())   {    switch(curAnim)    {      case 1: x+=step*td; break;     ...    }   }   else   {    SetAnimationSpeed(anim,0);    keyp=false;   } 
   if(!DrawSpriteA(anim, x,y)  // функция отвечает за воспроизведение анимации   {    ResetAnimation(anim);  // перезапускает анимацию на конечном кадре   } 
          отлично работает: персонаж шагает вправо, пока нажата клавиша D и останавливается, когда клавиша отпущена.   Мне нужен цикл, который бы определенное время самовыполнялся. Само собой, еще пару дней втыкания в этот дурацкий косяк, и решение может и придет, но...
 |  
| 
 | 
 |    | 
| Aprok | Дата: Суббота, 07 Января 2012, 20:25 | Сообщение # 4 |  
 
был не раз 
Сейчас нет на сайте 
 
 | Ну цикл сам и выполняется, но отрисовки то в нём нет.   Т.е. логика рабочего кода такая:   Цикл бесконечный:   1) Проверяем, если нажали кнопку D: Выставили анимацию.   2) Увеличили координату   3) Рисуем.   4) Возвращаемся в начало цикла. 
   А у вас в первом коде:   Цикл бесконечный:   1) Проверяем нажат ли пробел.   2) во внутренем while выставили несколько раз анимацию(НО НЕ НАРИСОВАЛИ!) и увеличили координату   3) Рисуем   4) Возвращаемся в начало цикла. 
   Т.е. вам не нужен внутренний while, вам нужно чтобы весь внешний цикл выполнялся, и т.к. он выполняется постоянно и бесконечно то он и отрисует то что вам нужно. Т.е. вероятно изменить надо так:   Code    Глобальная ВНЕ ЦИКЛА int v1=0;   ....   if(KeyCheck(DIK_SPACE))     {      setK=true; //глобальная переменная, изначально false      SetAnimation(anim,curAnim);      v1=x;     }    if(setK)     {      x+=step*12;  // step = 0.09, глобальная константа      if((x-v1)>=50)      {          setK=false;      }     } 
      
   Попробуйте так.
 |  
| 
 | 
 |    | 
| smach1 | Дата: Суббота, 07 Января 2012, 21:55 | Сообщение # 5 |  
 
был не раз 
Сейчас нет на сайте 
 
 | Добавил в ваш код Sleep(30) после изменения координаты и все заработало!   Огромное спасибо, сам бы долго до этого не допер
 |  
| 
 | 
 |    |