Witam,
Stworzyłem parę klas odpowiadających za to że parę elementów np ręka czy noga złączyć ze sobą i dzięki temu uzyskiwać animację.
wygląda to w ten sposób:
https://www.dropbox.com/s/r24oxfpgkx08kt6/AnimacjaDemo.rar?dl=0
Jak widać mając parę obrazków udało mi się stworzyć postać która emituje ruch.
W każdym razie użyłem rozwiązać z nowego Cpp 11 i boję się że mogą być niefunkcjonalne niewydajne etc.
System działa na prostej zasadzie. Tworzę obiekt dodaje do niego obrazki i piszę wyrażenie lambda uruchamiane w funkcji update. Te wyrażenia odpowiadają w jaki sposób ma być animowana postać. Tutaj dorzucam main takiej animacji prezentujący działanie: (Zamiast w main lepiej zrobić to w jakiejś klasie np Player, bo wiadomo są różne animacje idzWLewo, w prawo, walcz, etc).
System ma jeszcze wiele braków ale nie chce tego rozwijać jeśli ma się okazać że rozwiązanie nie jest zbyt optymalne etc... Poczekam na wasze opinie.
Tutaj main jak to wygląda:
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <iostream>
#include <functional>
#include "Animation.h"
using namespace std;
using namespace std::placeholders;
float number = 10;
int ch = 1;
int * chW = &ch;
float * testHere = &number; // Just for test
// Function given to the Animation Object responsible for animation
void walk( Animation * object, float dT, float angel )
{
auto obj = bind(&Animation::getElement, object, _1);
obj("OUT_ARM")->setRotateCenter(14, 15);
obj("IN_ARM")->setRotateCenter(14, 15);
obj("IN_ARM")->setRotation(angel);
obj("OUT_ARM")->setRotation(-angel);
obj("OUT_LEG")->setRotateCenter(14, 0);
obj("IN_LEG")->setRotateCenter(14, 0);
obj("IN_LEG")->setRotation(angel*0.4);
obj("OUT_LEG")->setRotation(-angel*0.4);
obj("HEAD")->setRotateCenter(32,64);
obj("HEAD")->setRotation(angel*0.1);
}
// Function given to the Animation Object responsible for animation
void claun( Animation * object, float dT, float angel )
{
auto obj = bind(&Animation::getElement, object, _1);
*testHere = *testHere + 190*dT * *chW;
if(*testHere > 50 || *testHere < -50)
*chW=*chW*(-1);
obj("OUT_ARM")->setRotateCenter(14, 15);
obj("IN_ARM")->setRotateCenter(14, 15);
obj("OUT_LEG")->setRotateCenter(14, 0);
obj("IN_LEG")->setRotateCenter(14, 0);
obj("IN_ARM")->setRotation(270-*testHere);
obj("OUT_ARM")->setRotation(270+*testHere);
obj("IN_LEG")->setRotation(330-*testHere);
obj("OUT_LEG")->setRotation(330+*testHere);
obj("IN_ARM")->move(*testHere*0.2*dT, 0);
obj("OUT_ARM")->move(*testHere*0.2*dT, 0);
}
int main()
{
sf::ContextSettings s;
s.antialiasingLevel = 32;
s.depthBits = 24;
// Creating window
sf::RenderWindow WindowApp(sf::VideoMode(1024, 600), "jump", sf::Style::Default ,s);
//WindowApp.setVerticalSyncEnabled(true);
//Create new animation Object
Animation a(100, 200);
// Add elements to animate object (Position is relative to mother)
a.createElement("head.png", "HEAD", 82, 0);
a.createElement("arm.png", "OUT_ARM", 100, 54 );
a.createElement("leg.png", "OUT_LEG", 100, 115);
a.createElement("body.png", "BODY", 92, 64);
a.createElement("leg.png", "IN_LEG", 100, 115);
a.createElement("arm.png", "IN_ARM", 100, 54 );
//Create new animation object
Animation b(100, 200);
//Add elements to animate object (Position is relative to mother)
b.createElement("head.png", "HEAD", 82, 0);
b.createElement("arm.png", "OUT_ARM", 100, 54 );
b.createElement("leg.png", "OUT_LEG", 100, 115);
b.createElement("body.png", "BODY", 92, 64);
b.createElement("leg.png", "IN_LEG", 100, 115);
b.createElement("arm.png", "IN_ARM", 100, 54 );
// This line is responsible to scale object head (now he will look in other direction)
b.getElement("HEAD") -> getDraw() -> setScale( sf::Vector2f( - 1, 1 ) );
//Create new animation object
Animation c(100, 200);
//Add elements to animate object (Position is relative to mother)
c.createElement("head.png", "HEAD", 82, 0);
c.createElement("arm.png", "OUT_ARM", 100, 54 );
c.createElement("leg.png", "OUT_LEG", 100, 115);
c.createElement("body.png", "BODY", 92, 64);
c.createElement("leg.png", "IN_LEG", 100, 115);
c.createElement("arm.png", "IN_ARM", 100, 54 );
//Setting position of object
a.setPosition(300,100);
b.setPosition(500, 100);
c.setPosition(700, 100);
//Adding function created in top to the Object
a.createFunction(walk, "WALK" );
b.createFunction(walk, "WALK" );
c.createFunction(walk, "WALK" );
//Began to animate function called WALK if you use function ( create ) without string all created functions will run animate
a.startAnimation("WALK");
b.startAnimation("WALK");
c.startAnimation();
//Just delta time
sf::Clock dT;
while (WindowApp.isOpen())
{
sf::Event event;
while (WindowApp.pollEvent(event))
{
if (event.type == sf::Event::Closed)
WindowApp.close();
if(event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::D)
c.stopAnimation();
if(event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::S){
//Deleting function from object
b.deleteFunction("WALK");
// Adding a new function to object
b.createFunction(claun, "Claun");
// Begin animate this function
b.startAnimation();
}
}
float delta = dT.restart().asSeconds();
//Just update state
a.Update(delta);
b.Update(delta);
c.Update(delta);
WindowApp.clear();
//Just draw state
WindowApp.draw(a);
WindowApp.draw(b);
WindowApp.draw(c);
WindowApp.display();
}
return EXIT_SUCCESS;
}
Tutaj pliki cpp i headers: trzeba mieć zlinkowaną bibliotekę SFML
https://www.dropbox.com/s/nsg8isaj9ghmjrr/Animacja.rar?dl=0
Wypali to dodam na githuba :3
Pozdrawiam i dziękuje z góry za testy.