C++的2D游戏库SFML中Event方面的理解

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

第一个问题: 为何先检查event.type?

SFML的Event(事件)的基础概念.

先说事件的处理选择的解决方案: 它是纵向, 而非横向. 比如事件的表达是 先看键盘有键按下(keyPressed), 再看是哪个键; 而不是先看键如A键, B键, C键, 再看被按下还是抬起. 所以它是分了2层. 事件类型(按下,抬起)是第一层, 再看按键的具体信息是第二层.

比如整个事件是 A键按下, 分两层, 第一检查事件类型(event.type == keyPressed), 第二查看具体信息(key.code == A), 而且第二层是共用体,  对应keyPressed事件类型, 可以用的就是KeyEvent类型的对象key.

有的比如, Closed事件, 不需要更具体信息,在 共用体 里就不需要它的具体信息项. 就没有Closed. 大多数都是有对应的具体信息项的, 如键盘, 鼠标事件.(具体的可以查看官网API)

Event类里面就只有2个数据成员, EventType(枚举)类型的变量type 和 匿名union里的成员. 对应的就是上面的两层信息. Event是类, 它里面有一个匿名共用体.

上面就是event先检查event.type==sf::Event::keyPressed的原因.

Event之所以设计了匿名共用体, 匿名不重要, 主要是使用共用体成员就是因为它分了两层来表达事件.

 

第二个问题, poll是什么意思

poll是轮询的意思, pollEvent是轮询事件.

第三个问题, 为何用while循环,

 

Suppose the user pressed two keys very fast, faster than one frame. If you use if to check new events, this way:

while (running)
{
  sf::Event event;
  if (window.GetEvent(event))
  {
    // Process event here
  }
  // Drawing here
  window.Display();
}



You will get only one event per frame. There will be a delay of one frame between the time when the user pressed the second key and the time when the program process it.

If you use while:

while (running)
{
  sf::Event event;
  while (window.GetEvent(event))
  {
    // Process event here
  }
  // Drawing here
  window.Display();
}



All available events will be processed every frame. No event will remains to be processed by the next frame. This is the right way.

 

if和while都是条件为真时就执行它语句块内的代码段, if 和while的区别是, if就发生一趟, 而while执行完这一趟, 只要条件为真, 它回来再来执行.

 一次游戏循环(while(window.isOpen())的时间可能很长. 如果在一帧之内接连发生了2个事件, if不能轮询到, 而while能轮询到.

 

在一帧内,就是一趟循环内,  一帧是说在一个游戏主while(while(window.isOpen())下,  

 

所以用while解决的是帧内的事件处理. 比如, 用if的话, 它走到头就结束了, 不再回来检测事件了. 

 

第四个问题, 为什么pollEvent()需要event参数?

解答:

pollEvent(event)l, 从窗口轮询事件, event传入event才会有值. pollEvent函数给出event对象的值. 

附加,

pollEvent和waitEvent的区别: poll是没有事件发生时就为false, wait时从第一个事件发生后就一直为true, 直到有错误发生才会false.

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值