SFML中的键盘

时间:2013-05-04 03:00:57

标签: c++ sfml

我正在用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到原始!我遇到的另一个问题是我正在进行点式游戏,所以我如何制作线条的逻辑,这样当我按下回车键时我可以让它在两点之间?

1 个答案:

答案 0 :(得分:3)

  

当我点击空格键旋转90时我需要保持稳定然后当我再次单击空格时它会旋转90到原始位置!

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

只有在释放钥匙时才会进行轮换。

另外,请考虑使用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...
    }
}

注意:我还将lineImage重命名为lineSprite,以防止与sf::Imagesf::Sprite混淆。

编辑:

  

我遇到的另一个问题是我正在进行点式游戏,所以如何制作线条的逻辑,这样当我按下回车键时我可以让它在两点之间?

我宁愿使用顶点而不是使用纹理。见the corresponding tutorial here

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

编辑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);

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