2013-05-04 86 views
0

我在做与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到原来的!我的另一个问题是我在做点游戏,所以我怎样才能让线的逻辑,所以我可以让它在两点之间,当我按Enter键?

回答

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... 
    } 
} 

注:我也改名为lineImage,以lineSprite以防止sf::Imagesf::Sprite任何混淆。

编辑:

另一个问题我已经是我做点游戏那么,如何才能让行,所以我可以让它两点之间,当我按下回车键的逻辑是什么?

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

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

编辑2:

让我们更concreate,写的几行代码。

可以声明顶点数组是这样的:

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

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

+0

非常感谢它的工作原理:d 和关于第二概率 我在做Dots游戏,所以我想用lineSprite连接两个点,当用户点击输入时,第二个用户会直到它形成一个正方形,那就是问题我可以用什么来做到这一点!?因为我是SFML新手! 再次感谢您的帮助^^ – 2013-05-04 10:47:23

+0

好的,明白了。看到我编辑的答案。 – Hiura 2013-05-05 19:14:59

+0

所以我的方式是不够的!? ,我认为它比顶点数组更简单:D,srry但是如果你能更清楚地说明一下,我将不胜感激^^ – 2013-05-06 01:30:51