《TypeScript图形渲染实战:2D架构设计与实现》 —3.2.6 CanvasInputEvent及其子类

举报
华章计算机 发表于 2019/12/12 19:16:56 2019/12/12
【摘要】 本节书摘来自华章计算机《TypeScript图形渲染实战:2D架构设计与实现》 一书中第3章,第3.2.6节,作者是步磊峰。

3.2.6  CanvasInputEvent及其子类

  Application类除了不间断地基于时间的更新与重绘封装外,还有一个很重要的功能就是对输入事件的分发和响应机制。输入事件包括鼠标事件和键盘事件,将这两种事件的共有部分抽象成CanvasInputEvent基类,该类的源码如下:

 

// CanvasKeyboardEvent和CanvasMouseEvent都继承自本类

// 基类定义了共同的属性,keyboard或mouse事件都能使用组合键

// 例如可以按住Ctrl键的同时单击鼠标左键做某些事情

// 当然也可以按住Alt + A 键做另外一些事情

export class CanvasInputEvent {

    // 3个boolean变量,用来指示Alt、Ctrl、Shift键是否被按下

    public altKey : boolean ;

    public ctrlKey : boolean ;

    public shiftKey : boolean ;

   

    // type是一个枚举对象,用来表示当前的事件类型,枚举类型定义在下面的代码中

    public type : EInputEventType ;

    // 构造函数,使用了default参数,初始化时3个组合键都是false状态

    public constructor ( altKey : boolean = false , ctrlKey : boolean = false ,

    shiftKey : boolean = false , type : EInputEventType = EInputEventType .

    MOUSEEVENT ) {

        this . altKey = altKey ;

        this . ctrlKey = ctrlKey ;

        this . shiftKey = shiftKey ;

        this . type = type ;

    }

}

 

  再来看一下EInputEventType这个枚举,该枚举罗列出目前支持的各个输入事件,包括鼠标和键盘事件。具体代码如下:

 

export enum EInputEventType {

    MOUSEEVENT ,                                            //总类,表示鼠标事件 

    MOUSEDOWN ,                                                   //鼠标按下事件

    MOUSEUP ,                                                       //鼠标弹起事件

    MOUSEMOVE ,                                                    //鼠标移动事件

    MOUSEDRAG ,                                                     //鼠标拖动事件

    KEYBOARDEVENT ,                                                 //总类,表示键盘事件

    KEYUP ,                                                    //键按下事件

    KEYDOWN ,                                                       //键弹起事件

    KEYPRESS                                                   //按键事件

} ;

 

  接下来看一下子类CanvasMouseEvent和CanvasKeyBoardEvent。具体代码如下:

 

export class CanvasMouseEvent extends CanvasInputEvent {

    // button表示当前按下鼠标哪个键

    // [ 0 : 鼠标左键 ,1 : 鼠标中键,2 : 鼠标右键 ]

    public button  : number  ;

    // 基于canvas坐标系的表示

    public canvasPosition  : vec2  ;

   

    public localPosition  : vec2  ;

    public constructor ( canvasPos : vec2 , button : number , altKey  : boolean

    = false , ctrlKey : boolean = false , shiftKey : boolean = false ) {

        super ( altKey , ctrlKey , shiftKey ) ;

        this . canvasPosition = canvasPos ;

        this . button = button ;

       

        // 暂时创建一个vec2对象

        this . localPosition = vec2 . create ( ) ;

    }

}

export class CanvasKeyBoardEvent extends CanvasInputEvent {

    // 当前按下的键的ASCII字符

    public key : string ;

    // 当前按下的键的ASCII码(数字)

    public keyCode : number ;

    // 当前按下的键是否不停地触发事件

    public repeat : boolean ;

    public constructor ( key : string , keyCode : number , repeat : boolean ,

    altKey : boolean = false , ctrlKey : boolean = false , shiftKey : boolean

    = false ) {

        super ( altKey , ctrlKey , shiftKey , EInputEventType .

        KEYBOARDEVENT ) ;

        this . key = key ;

        this . keyCode = keyCode ;

        this . repeat = repeat ;

    }

}

 

  这些代码比较简单,并且注释也比较详细。相对有点难度的是CanvasMouseEvent类中的canvasPosition和localPosition这两个成员变量,涉及一些坐标变换相关的知识,将会在3.2.7节中详解。关于这两个变量的类型是vec2,表示2D向量,目前仅需要了解的是vec2是2D坐标{ x , y }的表示,关于vec2和mat2d这两个数学类,后面章节也会重点提示,是比较重要的内容。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。