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
Не могу допереть, как реализуются сие методы на практике.
|
|
| |
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. Вопрос может быть глупый, но все же в каких единицах время ? микросекунды, миллисекунды, секунды? И конечно же дельта, а понимаю это разница времени, но какая, точнее между чем и чем?
За пример огромное человеческое спасибо, плюсую! Тоже нашел простенький пример, сейчас разбираюсь что к чему. Появилась идея в ходе изучения принципов анимации создать небольшой фрэймворк.
|
|
| |