2016-12-17 106 views
0

我在SFML中遇到了一些事件。我正在制作一款基于转机的游戏,当鼠标移动或鼠标左键点击时,我会检查whos是否转动,然后在该物体位置产生一个抛射体,当抛射体与地形或对手相撞时,它会被破坏,转动被改变。处理鼠标事件SFML

行为不是我所期待的。点击发射时,弹丸有时不会产生(并且它会立即改变转向)。我禁用了所有的碰撞,所以它不能这样。我90%确定这个问题与我如何处理事件有关,所以我真的很喜欢输入关于如何让它变得更好的输入。

了解到的是,您不应该在while轮询事件中执行函数,它只能用于注册最近发生的事件,所以我将它们放在外面。这并不能解决我的问题,但...

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.buttonsf::Mouse::Button::Left为鼠标左键)

  • 中什么香港专业教育学院学到的是,你不应该在同时调查事件执行的功能,做到这一点,其只对注册什么happend最近,所以我把它们而不是外面。

你从哪里读到的?我不认为这是真的

  • 在事件循环下面不应该只有一个if的数组。代码应该更好地构造