SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Глюки при анимации
В этой теме 2 ответа, 1 участник, последнее обновление Alaz777 7 года/лет, 6 мес. назад.
-
АвторСообщения
-
Всем доброго времени суток!
Полтора месяца назад начал серьезно работать над платформером. Нанял художника и все такое. Сейчас уже готов спрайт лист главного героя получилось много анимаций. И как раз тут начались разного рода проблемы.
Анимации у меня хранятся в XML файле, для них есть 2 специальных класса, которые отлично работают. Но когда был нарисован спрайт лист ГГ получилось что ширина и высота почти всех кадров отличается, причем иногда сильно (это из-за большого разнообразия способностей ГГ и меча). Получилось что, из-за того что координаты в SFML начинаются в левом верхнем углу, персонаж все время скачет вверх вниз (т.к. высота спрайта разная, а коорд. y – привязана к голове а не к ногам, т.е. голова в одном положении а ноги прыгают, хотя д.б. наоборот). Аналогичная ситуация получилась и по оси Х, если персонаж отражен влево.
Решение данной проблемы я нашел. Каждый раз сохранял высоту и ширину кадра в прошлом цикле и каждый раз брал их же в новом и затем делал следующее:
C++1234567w = anim.getW(); h = anim.getH(); // беру текущую высоту и ширину спрайтаprevW = nextPrW; prevH = nextPrH; // беру предыдущие значения ширины и высоты спрайта (могут совпадать с текущими если кадр еще не сменился)nextPrW = w; nextPrH = h; // сохраняю текущии h и w чтобы потом их присвоить как предыдущиеy += prevH - h; //меняю положение спрайта по yif (isFlipped) { anim.flip(true); x += prevW - w; } // меняю положение спрайта по х если надоНа первый взгляд все работало превосходно. Но когда я подгрузил 1 анимацию, у которой при смене 2-х кадров особенно сильно меняются размеры спрайта, начали проскальзывать глюки.
Иногда (примерно раз в 13 – 14 полных циклов проблемной анимации, а иногда и чаще) происходило что на короткое мгновение кадр рисовался выше и (если спрайт отражен) правее чем должен быть примерно на величину разницы высот кадров, во время перехода между которыми происходит данный глюк. А затем тут же снова рисовался как надо. Немного поразмыслив, я пришел к выводу, что все выглядит так, как будто иногда программа просто пропускает из указанного выше кода, либо 1-ю строку, либо 2 последние.
В общем, у меня 2 вопроса. Прав ли я в своих догадках насчет причины проблемы и как с этим бороться?
П.С. До этого все работало идеально на тестовых спрайтах (с малыми разницами высоты и ширины) без присутствия вышеуказанных 5 строк кода. Также, думаю стоит отметить, что программа написана без предупреждений.
Хотя наверно я какую-то глупость написал. Как программа может раз в кучу циклов пропускать какую-то конкретную строчку кода, а все остальные разы не пропускать ее, и причем только эту… бред. Но все равно, проблема странная, может кто сталкивался с чем-то подобным.
Нашел проблему, из-за того что анимация не лупнутая, в последнем кадре бралось неправильное h и из-за этого глюки возникали. Странно только почему они не всегда были видны…
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.