2014-01-22 2 views
0

Я сейчас экспериментирую с событиями и пытаюсь передать окна в качестве параметров для изменения сцен (меню уровней и уровней на другие уровни), но моя основная проблема заключается в том, что программа не набирает мое ключевое событие. Я в основном взял код от here и просто добавил строки обзора для смены сцены. Прямо сейчас функция Change закомментирована, пока не смогу понять, почему keyevent не регистрируется.SFML - KeyEvents не работает

#include <SFML/Graphics.hpp> 
void Change(sf::RenderWindow& rwindow); 
int main() 
{ 
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!"); 
    sf::CircleShape shape(100.f); 
    shape.setFillColor(sf::Color::Green); 

    while (window.isOpen()) 
    { 
     sf::Event event; 
     while (window.pollEvent(event)) 
     { 
      if (event.type == sf::Event::Closed){ 
       window.close(); 
      } 

      if(event.type == sf::Event::KeyPressed){ 
       if(event.key.code == sf::Keyboard::Space){ 
       window.clear(); 
       sf::CircleShape shape(70.f); 
       shape.setFillColor(sf::Color::Red); 
       //Change(window); 
       } 
      } 
     } 

     window.clear(); 
     window.draw(shape); 
     window.display(); 
    } 

    return 0; 
} 

void Change(sf::RenderWindow& rwindow){ 
    rwindow.clear(); 
    sf::CircleShape shape(70.f); 
    shape.setFillColor(sf::Color::Red); 
} 
+0

Вы хотите сказать, что форма никогда не меняет цвет? Вы когда-нибудь отлаживали свой код? Поместите точку останова в определенные места, чтобы узнать, вызван ли вызов? Вы не должны очищать или рисовать в случайных местах, вместо этого вы должны следовать логике: вычислять физику и обновлять позиции, очищать экран, рисовать объекты, отображать на экране. – Lukas

ответ

0

В основном вы делаете это:

int main() { 
    int x = 1; 
    if (true) { int x = 2; } 
    std::cout << x; 
    return 0; 
} 

This code will always output 1. Зачем? Потому что x в заявлении if не совпадает с напечатанным! Google переменная область, если у вас нет хорошей книги на полке.

В своем коде, у вас есть три различных shape переменные: первые в начале вашего main, второй в if заявления и третьем в функции Change.

Вместо создания новой переменной вам нужно всегда использовать то же самое. Вот один из способов:

#include <SFML/Graphics.hpp> 

void Change(sf::CircleShape& shape); 
void Unchange(sf::CircleShape& shape); 

int main() 
{ 
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!"); 
    sf::CircleShape shape(100.f); 
    shape.setFillColor(sf::Color::Green); 

    while (window.isOpen()) 
    { 
     sf::Event event; 
     while (window.pollEvent(event)) 
     { 
      if (event.type == sf::Event::Closed){ 
       window.close(); 
      } 

      if(event.type == sf::Event::KeyPressed){ 
       if(event.key.code == sf::Keyboard::Space){ 
        Change(shape); 
       } 
      } 

      if(event.type == sf::Event::KeyReleased){ 
       if(event.key.code == sf::Keyboard::Space){ 
        Unchange(shape); 
       } 
      } 

     } 

     window.clear(); 
     window.draw(shape); 
     window.display(); 
    } 

    return 0; 
} 

void Change(sf::CircleShape& shape){ 
    shape.setRadius(70.f); 
    shape.setFillColor(sf::Color::Red); 
} 

void Unchange(sf::CircleShape& shape){ 
    shape.setRadius(100.f); 
    shape.setFillColor(sf::Color::Green); 
}