《TypeScript图形渲染实战:2D架构设计与实现》 —1.2.4 第一个TypeScript程序

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

1.2.4  第一个TypeScript程序

  作为本书的第一个Demo,我们使用TypeScript构建一个简单的Web应用程序:使用Canvas2D居中绘制Hello World。

  首先在桌面上单击右键,在弹出的菜单中选择新建文件夹选项,命名为HelloWorld。然后将新建的文件夹拖曳到程序坞中的VS Code图标上,启动VS Code应用程序。单击新建文件按钮,创建一个名为index.html的文件,如图1.11所示。

 image.png

图1.11  新建index.html文件

  接着打开index.html文件,使用Shift + Ctrl + P快捷方式打开命令面板,在输入框中输入insert snippet命令后,会出现“插入代码片段”的命令,如图1.12所示。

 image.png

图1.12  使用VS Code的插入代码片段功能

  选择“插入代码片段”命令后再选择html,就会自动生成如下HTML代码:

 

<!DOCTYPE html>

<html>

  <head>

    <meta charset = "utf-8" />

    <meta http-equiv = "X-UA-Compatible" content = "IE=edge" >

    <title> Page Title </title>

    <meta name = "viewport" content = "width=device-width,initial-scale=1" >

    <link rel = "stylesheet" type = "text/css" media = "screen" href =

    "main.css" />

    <script src = "main.js">  </script>

  </head>

  <body>

  </body>

</html>

 

  将<title>标签中的文本内容替换为Hello World, <link>和<script>标签内容保持不变,后续会使用TypeScrip Compiler生成main.js源文件。

  在VS Code中创建一个名为main.css的文件,输入如下代码:

 

/*

CSS选择器:# 表示ID选择器

*/

#canvas {

    background : #ffffff ;

    margin-left : 10px ;

    margin-top : 10px ;

    -webkit-box-shadow : 4px 4px 8px rgba ( 0 , 0 , 0 , 0.5 ) ;

    -moz-box-shadow : 4px 4px 8px rgba ( 0 , 0 , 0 , 0.5 ) ;

    box-shadow : 4px 4px 8px rgba ( 0 , 0 , 0 , 0.5 ) ;

}

注意:CSS中仅可以使用/* */进行注释。

  在VS Code中创建一个名为main.ts的文件,输入如下代码:

 

class Canvas2DUtil {

    //声明public访问级别的成员变量

    public context : CanvasRenderingContext2D ;

    // public访问级别的构造函数

    public constructor ( canvas : HTMLCanvasElement ) {

        this . context = canvas . getContext ( "2d" ) ;

    }

    // public访问级别的成员函数

    public drawText ( text : string ) : void {

        // Canvas2D和webGL这种底层绘图API都是状态机模式

        //每次绘制前调用save将即将要修改的状态记录下来

        //每次绘制后调用restore将已修改的状态丢弃,恢复到初始化时的状态

        //这样的好处是状态不会混乱

        //假设当前绘制文本使用红色,如果你没有使用save/restore配对函数的话

        //则下次调用其他绘图函数时,如果你没更改颜色,则会继续使用上次设置的红色进行绘制

        //随着程序越来越复杂,如不使用save/restore来管理,最后整个渲染状态会极其混乱

        //请时刻保持使用save / restore配对函数来管理渲染状态

        this . context . save ( ) ;

        //让要绘制的文本居中对齐

        this . context . textBaseline = "middle" ;

        this . context . textAlign = "center" ;

        //计算canvas的中心坐标

        let centerX : number = this . context . canvas . width * 0.5 ;

        let centerY : number = this . context . canvas . height * 0.5 ;

        //红色填充

        // this . context . fillStyle = " red " ;

        //调用文字填充命令

        this . context . fillText ( text , centerX , centerY ) ;

        //绿色描边

        this . context . strokeStyle = "green";

        //调用文字描边命令

        this . context . strokeText ( text , centerX , centerY ) ;

        //将上面context中的textAlign,extBaseLine,fillStyle,strokeStyle

        状态恢复到初始化状态

        this . context . restore ( ) ;

    }

}

 

  接下来调用Canvas2DUtil类,绘制居中对齐的文字。具体代码如下:

 

let canvas : HTMLCanvasElement | null = document . getElementById ('canvas')

as HTMLCanvasElement ;

if ( canvas === null ) {

    alert ( "无法获取HTMLCanvasElement !!! " ) ;

    throw new Error (  "无法获取HTMLCanvasElement !!! " ) ;

}

let canvas2d : Canvas2DUtil = new Canvas2DUtil ( canvas ) ;

canvas2d . drawText ( "Hello World" ) ;

 

  选择“查看|集成终端”菜单项(或使用Ctrl+`快捷键)打开集成终端面板,使用tsc命令将TS代码编译(转译)成JS代码:

 

tsc main.ts

 

  当按回车键后会发现VS Code左侧的资源管理中多了一个名为main.js的文件,如图1.13所示,该main.js文件就是使用main.ts编译(转译)后的结果。

 image.png

图1.13  通过tsc命令将TS文件转译成JS文件

  接下来,在index.html中的body标签对内声明一个canvas标签,代码如下:

 

<body>

     <canvas id = "canvas"  width = "800" height = "600" > </canvas>

</body>

 

  该canvas标签的ID名称必须和main.css中的CSS ID选择器名称一致,这样才能使#canvas中设置的CSS属性生效。

  接着使用canvas元素的width / height属性进行尺寸设置,当前设置的尺寸是800×600像素。如果没有设置canvas元素的width / height属性,默认情况下,浏览器所创建的canvas元素是300像素宽,150像素高。

  为了能够方便地运行HTML文件,引入一个名为open in browser的VS Code扩展插件。请单击VS Code最左侧的活动栏中的扩展图标(或使用Shift + Ctrl + X快捷键)打开扩展面板,输入Open in Browser后下载安装,如图1.14所示。

  安装完Open in Browser插件后,在VS Code中定位到HTML文件处,单击右键显示上下文菜单,即可使用该扩展,如图1.15所示。

  其中,Open In Default Browser(Alt + B快捷键)可直接在默认的浏览器中运行HTML文件。而Open in Other Browsers(Shift + Alt + B快捷键)则显示如图1.16所示面板,可以选择想要运行的浏览器。

 image.png

图1.14  从VS Code 应用商店下载安装插件

 image.png

图1.15  使用Open in Browser插件

 image.png

图1.16  Mac OS X 中可运行的浏览器

  当运行index.html文件时可能会出现运行页面出错提示,如图1.17所示。

 image.png

图1.17  运行页面出错

  之所以出现这个问题,是浏览器解析标签顺序导致的。参考上面的index.html代码,会发现script标签在canvas标签前面,浏览器解析HTML时,先遇到script标签,就去下载script标签中的main.js脚本,然后开始运行这段脚本,此时脚本中引用的canvas元素实际并没有解析完成,因此会弹出“无法获取HTMLCanvasElement”提示。

  有两种修改代码方式来解决这个问题,第一种修改方式是将script标签放到canvas标签后面。具体代码如下:

 

<body>

  <canvas id = "canvas" width = "800" height = "600" > </canvas>

  <script src = "main.js" > </script>

</body>

 

  第二种方式不用调整代码顺序,仍旧让script放在<head> </head>中,并使用defer属性。具体代码如下:

 

<head>

     <script src = "main.js" defer > </script>

</head>

 

  defer属性会让脚本的执行延迟到整个文档加载后再运行,这样就能避免上面遇到的问题。

  修正了上述问题后,继续运行Open In Default Browser命令,程序正常运行,文字居中绘制,具体效果如图1.18所示。

 image.png

图1.18  Hello World居中绘制


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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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