Keyboard in SFML

Keyboard in SFML

本文关键字:SFML in Keyboard      更新时间:2023-10-16

我正在用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度到原来的位置!我遇到的另一个问题是,我在做点游戏那么,我怎么才能使这条线的逻辑在我按回车键的时候让它在两点之间呢?

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

代替使用setRotation,你可以使用rotate并保持角度在一个变量中,这样你的程序:

  • 有更少的神奇数字!参见(什么是神奇的数字,为什么它不好?)
  • 可以按空格键反转旋转:angle = -angle;

只有当键被释放时才会进行旋转。

另外,考虑使用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混淆。

编辑:

我遇到的另一个问题是,我正在做点游戏那么,我如何使线的逻辑,以便我可以让它在两个点之间,当我按回车键?

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

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

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

您可以在这里找到相关文档:

  • VertexArray
  • 顶点