Четверг, 21 Ноября 2024, 17:50

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
2D анимация на FreeBasic + CSFML
SetBeZuMecДата: Вторник, 29 Апреля 2014, 13:22 | Сообщение # 1
был не раз
Сейчас нет на сайте
Всем доброго времени суток!

Обращаюсь с просьбой о помощи. На днях начал портировать заголовки CSFML 2.1 на FreeBasic. Проделана большая часть работы - грузятся спрайты, шрифты, звуки, также все прекрасно рисуется, хотя осталось еще не мало чего доработать и протестировать. Решил для теста написать небольшой платформер, но знаний и опыта, как показала практика, совсем недостаточно. На первом же этапе возникли трудности, а именно с созданием простенького класса анимации. Перелазил по всему официальному форуму SFML в поисках подобного, есть, но написано на С++, поэтому и не смог разобраться.

Прошу помощи, как лучше реализовать класс анимации. Хотя бы алгоритмы, как устроена. Может какие-нибудь небольшие наработки кода, буду рад всему. Понимаю смысл как это должно быть в теории: загружаем спрайт с покадровой анимацией, так называемый "spritesheet", далее с помощью таймера показываем нужные кадры, но как это на практике, вообще не представляю.
Edison6Дата: Вторник, 29 Апреля 2014, 14:09 | Сообщение # 2
TRUE Programmer
Сейчас нет на сайте
Цитата SetBeZuMec ()
как лучше реализовать класс анимации. Хотя бы алгоритмы, как устроена. Может какие-нибудь небольшие наработки кода, буду рад всему. Понимаю смысл как это должно быть в теории: загружаем спрайт с покадровой анимацией, так называемый "spritesheet", далее с помощью таймера показываем нужные кадры, но как это на практике, вообще не представляю.

Простой метод. Берем спрайт sheet и ширину кадра, пишем просто таймер который делает инкремент кадра.При конечном кадре сбрасываем на первый.
В отрисовке рисуем только часть sheet. т.е считаем текущий кадр * ширину.


Берил сбрей усы
SetBeZuMecДата: Вторник, 29 Апреля 2014, 14:32 | Сообщение # 3
был не раз
Сейчас нет на сайте
Цитата Edison6 ()
Простой метод. Берем спрайт sheet и ширину кадра, пишем просто таймер который делает инкремент кадра.При конечном кадре сбрасываем на первый.
В отрисовке рисуем только часть sheet. т.е считаем текущий кадр * ширину.

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

Для примера, есть класс SimpleAnimation (псевдокод):

Код
Type SimpleAnimation
      
     sprite SpriteSheet

     method Animate()
     method Update()
     method Draw()

End Type


Не могу допереть, как реализуются сие методы на практике. sad
Edison6Дата: Вторник, 29 Апреля 2014, 15:05 | Сообщение # 4
TRUE Programmer
Сейчас нет на сайте
Вот нашел небольшой пример :
Код
public class Animate
{
      enum Type {
          CYCLE,
          ONE
      }

      TextureRegion[][] frames;
      int currentFrame = 0;
      int maxFrames = 0;
      int Speed = 0;
      Type type;
     boolean locked = false;
     float time = 0;
      boolean playing = false;
      float x = 0,y = 0;

      public Animate(TextureRegion textureSheet,int widhtFrame,int heightFrame,float x,float y,int Speed)
      {
          this.frames = Sprite.split(textureSheet.getTexture(),widhtFrame,heightFrame);
          this.Speed  = Speed;
          this.x = x;
          this.y = y;
          this.maxFrames = this.frames[0].length;
      }
      public void setType(Type type) {
          this.type = type;
      }

      public void Update()
      {
         if (playing)
         {
             time += 100.0f* Gdx.graphics.getDeltaTime();
             if (time>Speed)
             {
                 time = 0;
                 currentFrame++;
                 if (currentFrame>=maxFrames) {
                     if (type==Type.CYCLE) {
                          currentFrame = 0;
                     } else if (type==Type.ONE) {
                          stop();
                     }
                 }
             }
         }
      }
      public void setPosition(float x, float y) {
          this.x = x;
          this.y = y;
      }
      public float getX() {
          return x;
      }
      public float getY() {
          return y;
      }

      public void Draw()
      {
          Screen.getBatch().draw(frames[0][currentFrame], x, y);
      }
      public void start() {
          if (!locked) {
              this.playing = true;
          }
      }
      public void stop()
      {
          this.playing = false;
          currentFrame = 0;
          locked = false;
      }
      public int getCurrentFrame()
      {
          return currentFrame;
      }
      public void setFrame(int frame)
      {
         currentFrame =  frame;
      }

}


Берил сбрей усы

Сообщение отредактировал Edison6 - Вторник, 29 Апреля 2014, 15:08
SetBeZuMecДата: Вторник, 29 Апреля 2014, 15:16 | Сообщение # 5
был не раз
Сейчас нет на сайте
Спасибо за пример, буду разбираться. Сразу есть вопрос в методе Update() переменная time увеличивается на 100 * DeltaTime. Вопрос может быть глупый, но все же в каких единицах время ? микросекунды, миллисекунды, секунды? И конечно же дельта, а понимаю это разница времени, но какая, точнее между чем и чем?

За пример огромное человеческое спасибо, плюсую! Тоже нашел простенький пример, сейчас разбираюсь что к чему. Появилась идея в ходе изучения принципов анимации создать небольшой фрэймворк.
  • Страница 1 из 1
  • 1
Поиск:

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