c++ - SFML 奇怪的运动

标签 c++ sfml

出于某种原因,当我运行下面的代码时......角色只会沿对角线向下移动。可以说我画的线是字符:

\
 \
  \
   \
    \

这是我按向上、向右、向下或向左键时它唯一移动的方向!

请帮忙,我想向右走,向右走,向上走,向下走,向左走。

我的代码是:

#include<iostream>
#include<string>
#include<SFML\Graphics.hpp>

using std::cout;
using std::endl;

enum Direction
{
    DOWN,
    LEFT,
    RIGHT,
    UP
};

int main()
{
    sf::RenderWindow _Win(sf::VideoMode(600, 600), "Hello World");
    sf::Texture _texture;
    if (!(_texture.loadFromFile("Resources/SPRITE.png")))
    {
        cout << "Could not load iamge" << endl;
    }

    //Source, tell us our starting position.
    //Vector2i = Vector of 2 in SFML
    sf::Vector2i source(1, DOWN/*or 0*/);

    sf::Sprite _sprite(_texture);

    float x = _sprite.getPosition().x;
    float y = _sprite.getPosition().y;
    while (true)
    {
        sf::Event _event;
        while (_Win.pollEvent(_event))
        {
            switch (_event.type)
            {
            case sf::Event::Closed:
                _Win.close();
                exit(1);
                break;
            case sf::Event::KeyPressed:
                switch (_event.key.code)
                {
                case sf::Keyboard::Up:
                    source.y = UP;
                    _sprite.move(sf::Vector2f(x,y--));
                    y = 3, x=3;

                    break;
                case sf::Keyboard::Down:
                    source.y = DOWN;
                    _sprite.move(sf::Vector2f(x, y++));
                    y = 3, x = 3;
                    break;
                case sf::Keyboard::Right:
                    source.y = RIGHT;
                    _sprite.move(sf::Vector2f(x++, y));
                    y = 3, x = 3;
                    break;
                    case sf::Keyboard::Left:
                    source.y = LEFT;
                    _sprite.move(sf::Vector2f(x--, y));
                    y = 3, x = 3;
                    break;
                }
                break;
            }
        }

        //Cropping Out Image
        //Please Look at sprite in resources/Sprite.png
        //When we run this :
        //_sprite.setTextureRect(sf::IntRect( source.x*32 , source.y*32 , 32 , 32 ));
        //Its going to give us the top left corner sprite image. Thats so because
        //we are cropping source.x*32 , which of 32 is the width of the sprite.. So it
        //starts from 1 * 32. 32 is the width of one sprite so it goes to the end of it.
        //Same Applies to the y. source.y * 32. It just goes to the end of the down sprite.
        //As you go down the y increases, 1 * 32 = 32. And 32 is the width of one sprite
        //so it shows body of one full sprite.
        _sprite.setTextureRect(sf::IntRect( source.x*32 , source.y*32 , 32 , 32 ));
        //Clears Window(Flickering..)
        _Win.clear();
        //Draw Sprite
        _Win.draw(_sprite);
        //And Finally Display the Window.
        _Win.display();
    }
}

最佳答案

在 switch 语句的每一种情况下,您都将 Sprite 移动 (x,y),然后根据方向递增或递减 x 或 y。然而,这是徒劳的,因为在下一行,你将它们都重置为 3。所以实际上,无论按下方向键,你都在这样做:

_sprite.move(sf::Vector2f(3, 3));

也就是说,向右 3 个单位,向下 3 个单位,这似乎符合您对所看到的运动的描述。我不确定您要进行哪种运动,但这里有一个可行的示例:

switch (_event.key.code) {
case sf::Keyboard::Up:
  _sprite.move(sf::Vector2f(0, -3));
  break;
case sf::Keyboard::Down:
  _sprite.move(sf::Vector2f(0, 3));
  break;
case sf::Keyboard::Right:
  _sprite.move(sf::Vector2f(3, 0));
  break;
case sf::Keyboard::Left:
  _sprite.move(sf::Vector2f(-3, 0));
  break;
}

每次按下方向键时, Sprite 都会朝那个方向移动 3 个单位。

关于c++ - SFML 奇怪的运动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37358620/

相关文章:

c++ - SFML 自定义圆数学无法正常工作

c++ - SIMD 程序运行缓慢

c++ - 如何在 while 循环中使用时钟

c++ scanf导致SIGSEGV

c++ - 为什么 Valgrind 不喜欢我对 glutCreateWindow 的使用?

c++ - 我的 SFML 项目的主循环只发生一次。有人知道为什么吗?

c++ - 如何纠正不一致的 Unresolved external 错误?

c++ - 两个 Sprite 在单独列表中的碰撞

c++ - 忽略使用函数名称定义宏的参数

c++ - asterisk [或类似的控制台应用程序]如何实现 "asterisk -r"控制台