zoukankan      html  css  js  c++  java
  • pyglet--EventLoop对象(主事件循环,用于从系统消息队列中取出消息,并派发给各个窗口)

    一、识别系统消息,并派出该消息

    EventLoop(应用程序的事件循环),用于循环的从系统消息队列中获取系统消息(包含消息的各种参数:如鼠标位置,事件类型,鼠标左右键,哪个键盘键等),然后派发相应的事件给窗口进行处理。

    二、继承自EventDispatcher

    由于继承字EventDispatcher,所以可以添加自定义事件,并将某个对象作为它的事件处理对象(也叫Listener),对它派发的事件进行处理。如果派发的事件刚好是鼠标或键盘事件,这就能够让Listener获取鼠标的位置信息或键盘信息,这将是非常有用的。(如构建一个button对象就可以知道鼠标是不是点击在自己身上)。

    三、唯一性

    一个pyglet程序只能有一个EventLoop处于工作状态(即调用run()函数)

    四、每一次事件循环所做的工作

    一是从系统事件队列中获取与pyglet相关的系统事件,并派发;

    二是调用idle()函数,该函数的作用包括:

    1.调用clock.tick()函数运行那些预定函数(sheduled functions)

    2.派出on_draw()事件,重绘每一个打开的窗口。

    (个人理解是每一次事件循环,主要任务是处理系统事件,然后调用idle()函数,因为每次处理系统事件时都会调用idle,因此只要有用户事件,就调用idle,就会重绘所有窗口,

    如果既没有系统事件也没有预定函数需要执行,则系统可能不会循环迭代)

    五、event loop itaration真面目

    while True:
        pyglet.clock.tick()#启动clock对象,用于预定函数的执行
    
        for window in pyglet.app.windows:#遍历每个打开的窗口
            window.switch_to()
            window.dispatch_events()#从系统事件队列中获取事件并派出
            window.dispatch_event('on_draw')#重绘每个窗口
            window.flip()#实现双缓冲机制
    因此窗口是每时每刻都在重绘的
  • 相关阅读:
    BZOJ 3028 食物 ——生成函数
    BZOJ 1933 [Shoi2007]Bookcase 书柜的尺寸 ——动态规划
    论咸鱼的自我修养之网络流
    SPOJ LCS2 Longest Common Substring II ——后缀自动机
    SPOJ NSUBSTR Substrings ——后缀自动机
    BZOJ 1879 [Sdoi2009]Bill的挑战 ——状压DP
    BZOJ 1875 [SDOI2009]HH去散步 ——动态规划 矩阵乘法
    BZOJ 1226 [SDOI2009]学校食堂Dining ——状压DP
    BZOJ 4566 [Haoi2016]找相同字符 ——广义后缀自动机
    BZOJ 3473 字符串 ——广义后缀自动机
  • 原文地址:https://www.cnblogs.com/zhuluqing/p/8944137.html
Copyright © 2011-2022 走看看