Суббота, 27 Апреля 2024, 21:15

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Анимация движения
Анимация движения
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) после изменения координаты и все заработало!
Огромное спасибо, сам бы долго до этого не допер
Форум игроделов » Программирование » C/C++ » Анимация движения
  • Страница 1 из 1
  • 1
Поиск:

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