0

我正在用 SFML 做一个游戏项目,遇到了一个小问题,

这是我的代码:

#include <SFML/Graphics.hpp>
#include <string>
#include <iostream>
using namespace std;
using namespace sf;
int main() {

    sf::RenderWindow Window;
    Window.create(sf::VideoMode(490, 485), "My First Sfml Game");

    sf::Texture pTexture1;
    sf::Sprite playerImage;



    if (!pTexture1.loadFromFile("Data/dots.png"))
        std::cout << "error could not load player image" << std::endl;

    playerImage.setTexture(pTexture1);

    sf::Texture pTexture2;
    sf::Sprite lineImage;
    if (!pTexture2.loadFromFile("Data/line.png"))
        std::cout << "error could not load player image" << std::endl;
    lineImage.setTexture(pTexture2);

    int v;

    while (Window.isOpen()) {
        sf::Event event;
        while (Window.pollEvent(event)) {
            switch (event.type) {
            case sf::Event::Closed:
                Window.close();
                break;
            case Event::KeyPressed:
                if (event.key.code == Keyboard::Right)
                    lineImage.move(5, 0);
                else if (event.key.code == Keyboard::Left)
                    lineImage.move(-5, 0);
                else if (event.key.code == Keyboard::Up)
                    lineImage.move(0, -5);
                else if (event.key.code == Keyboard::Down)
                    lineImage.move(0, 5);
                else if (event.key.code == Keyboard::Space)
                    lineImage.setRotation(90);
                break;
            case Event::KeyReleased:
                if (event.key.code == Keyboard::Right)
                    lineImage.move(0, 0);
                else if (event.key.code == Keyboard::Left)
                    lineImage.move(-0, 0);
                else if (event.key.code == Keyboard::Up)
                    lineImage.move(0, -0);
                else if (event.key.code == Keyboard::Down)
                    lineImage.move(0, 0);
                else if (event.key.code == Keyboard::Space)
                    lineImage.setRotation(90);
                break;
            }
            if (event.type == Event::KeyReleased && event.key.code == Keyboard::Space)
                lineImage.setRotation(180);
        }


        Window.draw(playerImage);
        Window.draw(lineImage);
        Window.display();
    }
    return 0;
}

此处代码中的图像:postimg.org/gallery/71ufmoi/da508bc3/

问题是当我单击空格键时我需要旋转lineImage但是当我单击空格时它会旋转 90 然后再返回 90!当我单击空格键时,我需要使它稳定旋转 90,然后当我再次单击空格时,它会旋转 90 到原来的位置!我遇到的另一个问题是我在做点游戏,我怎样才能使线的逻辑在我按下回车键时让它在两点之间?

4

1 回答 1

3

当我单击空格键时,我需要使它稳定旋转 90,然后当我再次单击空格时,它会旋转 90 到原来的位置!

setRotation您可以使用并将角度保留在变量中,而不是使用rotate,以便您的程序:

仅当释放键时才进行旋转。

另外,考虑使用switch而不是一堆if-else. 它将减少代码重复event.key.code ==并使您的代码更具可读性。

请注意,您的Window变量名称不一致:所有其他变量都以小写字母开头,但这个变量没有。对于这么小的一段代码来说,这没什么大不了的,但在整个程序中保持相同的命名约定总是一个好习惯。

因此,总而言之,您的代码可能如下所示:

// includes...

int main(int, char**) {
    // window and texture loading...

    float rotationAngle = 90;

    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) {
            switch (event.type) {
                case Event::KeyReleased:
                    switch (event.key.code) {
                        case Keyboard::Space:
                            lineSprite.rotate(rotationAngle);
                            rotationAngle = - rotationAngle;
                            break;

                        // other cases...
                    }
                    break;

                // other cases...
            }
        }

        // drawing...
    }
}

注意:我还重命名lineImagelineSprite以防止与sf::Imageand混淆sf::Sprite

编辑 :

我遇到的另一个问题是我在做点游戏,我怎样才能使线的逻辑在我按下回车键时让它在两点之间?

而不是使用纹理,我宁愿使用顶点。看这里对应的教程

您通常会有一个(动态)顶点数组来绘制线条。

编辑 2:

让我们更具体一些,写几行代码。

您可以像这样声明顶点数组:

sf::VertexArray lines(sf::Lines);

起初它是空的,但您可以在需要时轻松添加新行:

// the player connects dots d1 and d2
lines.append(sf::Vertex(d1.position));
lines.append(sf::Vertex(d2.position));

而且,和往常一样,您想在窗口上画线。你可以这样实现:

window.draw(lines);

您可以在此处找到相关文档:

于 2013-05-04T07:51:48.670 回答