【问题标题】:Moving focussed sprites gradually to target position (C++ & SFML)将聚焦的精灵逐渐移动到目标位置(C++ 和 SFML)
【发布时间】:2015-03-05 09:33:08
【问题描述】:

我正在尝试找出如何将精灵移动到目标位置。 (通过左键单击聚焦精灵,然后再次左键单击以将其移向被单击的位置)。我的代码有什么问题?如何实现这样的功能。提前谢谢您的帮助。

#include <SFML/Graphics.hpp>
#include <iostream>
#include <vector>

int main()
{
    sf::RenderWindow mMainWindow(sf::VideoMode(600,600), "Map", sf::Style::Close);
    mMainWindow.setFramerateLimit(60);
    mMainWindow.setKeyRepeatEnabled(false);
    sf::Image image;
    image.create(50, 50, sf::Color::Red);
    sf::Texture texture;
    texture.loadFromImage(image);

    std::vector<sf::Sprite> EnemyVector;
    std::vector<sf::Vector2f> EnemyPositions;
    std::vector<sf::Vector2f> EnemyVelocities;

    sf::Sprite* focus = nullptr;
    bool move = false;

    while (mMainWindow.isOpen())
    {
        sf::Event event;
        bool creating = false;
        bool leftclicked = false;

        sf::Vector2i mousePos;

        while (mMainWindow.pollEvent(event))
        {
            switch (event.type)
            {
            case sf::Event::Closed:
                mMainWindow.close();
                break;
            case sf::Event::KeyPressed:
                creating = (event.key.code == sf::Keyboard::A);
                break;
            case sf::Event::MouseButtonPressed:
                if (event.mouseButton.button == sf::Mouse::Left)
                {
                    leftclicked = true;
                    mousePos = sf::Vector2i(event.mouseButton.x, event.mouseButton.y);
                    break;
                }
            }
        }
        if (creating)
        {
            sf::Sprite sprite;
            mousePos = (mousePos == sf::Vector2i(0, 0) ? sf::Mouse::getPosition(mMainWindow) : mousePos);
            sprite.setTexture(texture);
            sprite.setColor(sf::Color::Red);
            sprite.setOrigin(static_cast<float>(sprite.getTextureRect().width) / 2, static_cast<float>(sprite.getTextureRect().height) / 2);
            sprite.setPosition(static_cast<float>(mousePos.x), static_cast<float>(mousePos.y));
            focus=nullptr;
            EnemyVector.push_back(sprite);
            EnemyPositions.push_back(sf::Vector2f(static_cast<float>(mousePos.x), static_cast<float>(mousePos.y)));
            EnemyVelocities.push_back(sf::Vector2f(0,0));
        }
        if (leftclicked)
        {
            for (auto& enemy = EnemyVector.rbegin(); enemy != EnemyVector.rend(); ++enemy)
            {
                if (enemy->getGlobalBounds().contains(static_cast<float>(mousePos.x), static_cast<float>(mousePos.y)))
                {
                    focus = &(*enemy);
                    move = !move;
                    break;
                }
            }
        }
        if(move)
        {
            if(focus!=nullptr)
            {
                focus->move((sf::Mouse::getPosition(mMainWindow).x*0.1 - focus->getPosition().x*0.1),(sf::Mouse::getPosition(mMainWindow).y*0.1 - focus->getPosition().y*0.1)) ;
            }
        }
        mMainWindow.clear();
        for (auto& enemy = EnemyVector.rbegin(); enemy != EnemyVector.rend(); ++enemy)
        {
            mMainWindow.draw(*enemy);
        }
        mMainWindow.display();
    }
    return 0;
}

【问题讨论】:

    标签: c++ sfml


    【解决方案1】:

    基本上有两种方式:

    1. 在事件循环中进行
    2. 使用线程

    对于这两种情况,您都需要保留精灵的目标坐标。

    使用事件循环方法你必须修改事件循环以不阻塞等待事件,然后在需要时更新精灵坐标并重绘。

    如果使用线程,一个线程可以更新所有应该移动的精灵的坐标,并要求主渲染线程重绘。

    需要注意的是,这两种方法基本相同,只是精灵当前位置更新的地方不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-19
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 2017-07-18
      • 2014-10-09
      • 1970-01-01
      相关资源
      最近更新 更多