Спрайт не анимируется

Я написал два класса; Анимация и актер. По какой-то причине изображение спрайта не меняется. Он остается первым кадром все время. Код в порядке, у меня нет проблем с компиляцией, моя логика где-то неверна, и она работает не так, как я ожидал.

Объявление класса анимации:

class Animation
{
public:
        Animation(std::string path, int frames);
        ~Animation();
        void nextFrame();
        void gotoStart();
        bool loadFrames();
        sf::Texture& getActiveFrame();

private:
        int frameCount;
        std::string pathToAnimation;
        int currentFrame;
        sf::Texture frame[];
};

Реализация класса анимации:

Animation::Animation(std::string path, int frames)
{
        pathToAnimation = path;
        frameCount = frames;
}

Animation::~Animation()
{
        // destructor
}

void Animation::nextFrame()
{
        if(currentFrame < frameCount)
        {
            currentFrame = 1;
        }
        else
            currentFrame += 1;
}

void Animation::gotoStart()
{
        currentFrame = 1;
}

bool Animation::loadFrames()
{
        for(int i = 01; i < frameCount; i++)
        {
            if(!frame[i].loadFromFile(pathToAnimation + std::to_string(i) + ".jpg")) return false;
        }
        return true;
}

sf::Texture& Animation::getActiveFrame()
{
    return frame[currentFrame];
}

Объявление класса актера:

class Actor
{
public:
        Actor();
        ~Actor();
        void setActiveAnimation(std::shared_ptr<MaJR::Animation> anim);
        void draw(sf::RenderWindow& win);

private:
        sf::Sprite sprite;
        std::shared_ptr<MaJR::Animation> activeAnimation;
};

Реализация класса актера:

Actor::Actor()
{
    // constructor
}

Actor::~Actor()
{
    // destructor
}

void Actor::setActiveAnimation(std::shared_ptr<MaJR::Animation> anim)
{
    activeAnimation = anim;
    activeAnimation->gotoStart();
}

void Actor::draw(sf::RenderWindow& win)
{
    sprite.setTexture(activeAnimation->getActiveFrame());
    win.draw(sprite);
    activeAnimation->nextFrame();
}

Вот код для проверки:

int main()
{
    sf::RenderWindow Window(sf::VideoMode(800, 600), "MaJR Game Engine Sandbox");

    std::shared_ptr<MaJR::Animation> DroneStandNorth = std::make_shared<MaJR::Animation>("./Assets/Sprites/Zerg/Units/Drone/Stand/North/", 61);
    if(!DroneStandNorth->loadFrames()) return EXIT_FAILURE;
    MaJR::Actor Drone;
    Drone.setActiveAnimation(DroneStandNorth);

    while(Window.isOpen())
    {
        sf::Event Event;
        while(Window.pollEvent(Event))
        {
            if(Event.type == sf::Event::Closed)
                Window.close();
        }

        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
            Window.close();

        Window.clear();
        Drone.draw(Window);
        Window.display();
    }

    return 0;
}

Я совершенно не понимаю, что здесь не так. Если вы хотите скомпилировать все самостоятельно, вот исходные файлы: http://www.filedropper.com/animationtesttar Обязательно используйте -std = c ++ 0x или что-то еще, что вам нужно сделать, чтобы использовать C ++ 11 с вашим компилятором.


person Community    schedule 09.06.2012    source источник


Ответы (1)


В вашей реализации анимации у вас есть:

void Animation::nextFrame()
{
    if(currentFrame < frameCount)
    {
        currentFrame = 1;
    }
    else
        currentFrame += 1;
}

Поскольку currentFrame начинается с 1, он всегда будет меньше frameCount, поэтому он всегда будет иметь значение 1. Измените на:

void Animation::nextFrame()
{
    if(currentFrame >= frameCount)
    {
        currentFrame = 1;
    }
    else
        currentFrame += 1;
}

Таким образом, когда currentFrame равен frameCount (в вашем тестовом примере 61), он будет сброшен. Поскольку nextFrame () вызывается после Draw () Актера, будет отрисован последний кадр, а затем currentFrame будет сброшен обратно на 1.

person Daniel Bickler    schedule 03.07.2012