2013-05-04 88 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