zoukankan      html  css  js  c++  java
  • 03.交互--鼠标,键盘

    """交互
    一个两层的场景。一个显示当前被按下的键(一次,一个或多个),另一个显示鼠标位置的文本,然后单击以移动文本。
    """
    import cocos
    import pyglet
    from cocos.director import director
    
    
    class KeyDisplay(cocos.layer.Layer):
        # 允许图层接收Director.window事件
        is_event_handler = True
    
        def __init__(self):
            super(KeyDisplay, self).__init__()
            self.text = cocos.text.Label('', x=100, y=280)
            # 记录按键set集合
            # self.key_pressed = []
            self.key_pressed = set()
            self.update_text()
            self.add(self.text)
    
        def update_text(self):
            """更新text"""
            # 转为符号字符串
            key_names = [pyglet.window.key.symbol_string(k) for k in self.key_pressed]
            text = 'Keys:' + ','.join(key_names)
            self.text.element.text = text
    
        # 事件处理器, 向层添加事件处理器就是一个添加名为 on_<event name(事件名)> 的方法
        def on_key_press(self, key, modifiers):
            """按下一个键
           'key'是一个常量,指示按下哪个键,来自 pyglet.window.key
           'modifiers(修饰符)'是一个按位或几个常量,指示哪些修饰符在按下时处于活动状态(ctrl,shift,capslock等)
           """
            # self.key_pressed.append(key)
            self.key_pressed.add(key)
            self.update_text()
    
        def on_key_release(self, key, modifiers):
            """释放一个键
             'key'是一个常量,指示按下哪个键,来自 pyglet.window.key
             'modifiers(修饰符)'是一个按位或几个常量,指示哪些修饰符在按下时处于活动状态(ctrl,shift,capslock等)
             """
            self.key_pressed.remove(key)
            self.update_text()
    
    
    class MouseDisplay(cocos.layer.Layer):
        """
        其他:
        on_mouse_release : 当按键松开
        on_mouse_scroll : 当滚轮转动
        on_mouse_leave : 当鼠标指针移除窗口
        on_mouse_enter : 当鼠标指针移入窗口
        """
        is_event_handler = True
    
        def __init__(self):
            super(MouseDisplay, self).__init__()
    
            self.posx = 100
            self.posy = 240
            self.text = cocos.text.Label('No mouse events', font_size=18, x=self.posx, y=self.posy)
            self.add(self.text)
    
        def update_text(self, x, y):
            text = 'Mouse @ %d,%d' % (x, y)
            self.text.element.text = text
            self.text.element.x = self.posx
            self.text.element.y = self.posy
    
        def on_mouse_motion(self, x, y, dx, dy):
            """当鼠标移动到应用程序窗口上并且没有按鼠标按键时
            (x,y)是鼠标的物理坐标 ,鼠标事件处理器从pyglet接收其物理坐标
            (dx,dy)是鼠标至上次调用后经过的的距离向量
            """
            self.update_text(x, y)
    
        def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers):
            """此函数在鼠标在应用程序窗口上移动并按下鼠标按键时被调用
              (x,y)是鼠标的物理坐标
              (dx,dy)是鼠标至上次调用后经过的的距离向量
              'buttons' 是一个按位或pyglet.window.mouse常量-->LEFT,MIDDLE,RIGHT
              'modifiers' 是一个按位或pyglet.window.key修饰符常量(值如 'SHIFT', 'OPTION', 'ALT')
            """
            self.update_text(x, y)
    
        def on_mouse_press(self, x, y, buttons, modifiers):
            """按下鼠标按键不仅更新鼠标位置,还改变标签的位置
            (x,y)是鼠标的物理坐标
            'buttons' 是一个按位或pyglet.window.mouse常量-->LEFT,MIDDLE,RIGHT
            'modifiers' 是一个按位或pyglet.window.key修饰符常量(值如 'SHIFT', 'OPTION', 'ALT')
            """
            self.posx, self.posy = director.get_virtual_coordinates(x, y)
            self.update_text(x, y)
    
    
    if __name__ == '__main__':
        cocos.director.director.init(resizable=True)  # 可调整大小
        keyDisplay_layer = KeyDisplay()
        mouseDisplay_layer = MouseDisplay()
        # 接收层列表
        main_scene = cocos.scene.Scene(keyDisplay_layer, mouseDisplay_layer)
        # 运行场景
        cocos.director.director.run(main_scene)
  • 相关阅读:
    08.设计模式,和ES6let
    H5之本地存储
    07..前后台交互,设计模式
    查询出总数集合
    06.JSON+ajax+跨域+onde 环境搭建 笔记
    05 this 在不同环境下的指向 和正则
    04学习 JS 作用域 继承 闭包
    技术盛宴 | 从实战浅析运营商云资源池—解析流量模型
    从实战浅析运营商云资源池网络—技术的抉择
    ovn-sbctl
  • 原文地址:https://www.cnblogs.com/fly-book/p/11769858.html
Copyright © 2011-2022 走看看