2016-12-17 3 views
0

У меня есть некоторые проблемы с событиями в SFML. Я делаю игру с разворотом, когда мышь переместилась или нажала левую кнопку мыши, я проверяю, кто ее поворачивает, а затем порождает снаряд в этой позиции объекта, когда снаряд столкнулся с каким-либо ландшафтом или противником, который он уничтожил, и поворот изменяется.Управление событиями мыши SFML

Поведение не то, что я ожидаю. При щелчке стрелять снаряд иногда не будет появляться вообще (и он меняет ход сразу). Я отключил все столкновения, так что это не может быть. Im 90% уверен, что проблема связана с тем, как я обрабатываю события, поэтому id действительно использует данные о том, как я могу сделать это лучше.

Из чего вы узнали, что вы не должны выполнять функции во время опроса, но только для регистрации того, что произошло в последнее время, поэтому я вместо этого выставляю их снаружи. Это не решает мою проблему, хотя ...

sf::Event event; 
    sf::Vector2i mousePos; 
    while (_window.pollEvent(event)) { 
     if (event.type == sf::Event::Closed) { 
      _window.close(); 
     } 
     if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) { 
      _window.close(); 
     } 
     if(event.type == sf::Event::MouseMoved) { // <- this is how you check to see if an event 
      mousePos = sf::Mouse::getPosition(); 
      moved = true; 
     } 
     if(event.type == sf::Event::MouseButtonPressed) { // <- this is how you check to see if an event 
      mousePressed = true; 
     } 
    } 

    if (mousePressed && tank1Turn) 
    { 
     sf::Vector2f spawnPos = _t1->getPos() + sf::Vector2f(0, -150); 
     sf::Vector2f initVel = _t1->getInitVel(); 
     cout << endl; 
     _p = new Projectile(spawnPos, initVel); 
     tank1Turn = false; 
     tank1Firing = true; 
     mousePressed = false; 
    } 
    if (mousePressed && tank2Turn) { 
     sf::Vector2f spawnPos = _t2->getPos()+sf::Vector2f(0,-150); 
     sf::Vector2f initVel = _t2->getInitVel(); 
     _p = new Projectile(spawnPos, initVel); 
     tank2Turn = false; 
     tank2Firing = true; 
     mousePressed = false; 
    } 
    if (tank1Turn && moved) { 
     _t1->aim(mousePos); 
     moved = false; 
     mousePressed = false; 
    } 
    if (tank2Turn && moved) { 
     _t2->aim(mousePos); 
     moved = false; 
     mousePressed = false; 
    } 
} 

ответ

1

Рассмотрим этот комментарий. Это не ответ (не хватает репутации комментировать, так что я должен сделать это ответ), но вот некоторые вещи, которые я заметил:

  • Вы должны либо заменить if в твоих цикл событий с if-else s или использовать переключатель

  • sf::Keyboard::isKeyPressed предназначен для ввода в реальном времени (помещается внутри цикла обновления игры). В вашем цикле событий должно быть sf::Event::KeyPressed и проверьте, какой ключ был у него: evt.key.code

  • Вы не проверяете, какая кнопка была нажата. Делайте это с evt.mouseButton.button (sf::Mouse::Button::Left для левой кнопкой мыши)

  • Из того, что Ive узнал, что вы не должны выполнять функции в случае во время опроса, его только для регистрации того, что случилось совсем недавно, так что я положил их снаружи.

Где вы читали? Я не думаю, что это правда

  • Не может быть массив из if s ниже цикла событий. Код должен быть лучше структурирован
Смежные вопросы