Анимация движения
|
|
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) после изменения координаты и все заработало! Огромное спасибо, сам бы долго до этого не допер
|
|
| |