借助Visual Studio Code提高基于ActionScript的LayaAir HTML5游戏的调试效率

使用Visual Studio Code(VS Code)调试的优势

借助VS Code我们可以极大地提高基于ActionScript的LayaAir Html5游戏项目的调试效率,VS Code的优势有以下几点:

  • 在发生JavaScript运行时错误时,VS Code会自动在对应的代码位置断点,并且可以立即查看当前的变量状态、调用堆栈、日志输出等信息。在Chrome中,我们需要手动开启这个功能,而且在控制台打开的状态才会生效。本文末尾描述了如何在Chrome中开启此功能。
  • 当我们使用了模块化开发技术的时候,我们会有多个JavaScript文件。在chrome中,如果想要定位指定模块中的类,则需要先打开这个文件。而在VS Code中,我们可以立即对所有JavaScript文件进行搜索。
  • 在定位指定的类、类成员、本地变量名的时候,Chrome的搜索的方式是搜索字符串。而VS Code则会对JavaScript进行语法解析,这样能够提高搜索的精确度。

Visual Studio Code简介和下载

Visual Studio Code(VS Code)是一个由微软开发的,同时支持Windows、Linux和OS X操作系统的开源文本编辑器。它支持调试,内置了Git 版本控制功能,同时也具有开发环境功能,例如代码补全(类似于 IntelliSense)、代码片段、代码重构等。Visual Studio Code支持多种主流编程语言,对JavaScriptTypeScript语言的原生支持非常完备。我们熟知的LayaAir IDE以及Egret Wing都是基于Visual Studio Code二次开发的。软件的下载和安装见官方网站

安装VS Code扩展Debugger for Chrome

这是一个必要的插件,它使得我们可以在VS Code中调试Chrome浏览器中运行的JavaScript游戏代码。这个扩展开源免费,由微软驱动。在VS Code中的扩展商店搜索Debugger for Chrome即可找到。详情参考官方文档

示例项目源码和配置

本文使用的示例项目是基于ActionScript的,它由LayaAir IDE自动生成。示例项目只有两个类。

LayaSample.as

package {
import laya.events.Event;
public class LayaSample {
public function LayaSample() {
//初始化引擎
Laya.init(1136, 640);
trace('hello laya.');
Laya.stage.on(Event.CLICK, this, mouseHandler);
} private function mouseHandler(e:Event=null):void {
var myfoo:Foo = new Foo();
// myfoo.barbarbar();
myfoo.baz();
}
}
}

Foo.as

package {
public class Foo { public function Foo() { } public function barbarbar() {
trace('bar bar bar.');
} public function baz() {
var a;
a.b();
}
}
}

把项目文件夹拖入VS Code便形成了一个VS Code工作空间。在根目录创建名为.vscode 的文件夹,并在此文件中创建文件launch.json,并把以下内容复制到此文件中。想要了解配置详情的话,可以查看VS Code以及其插件的官方文档。

{
"version": "0.2.0",
"configurations": [
{
"type": "chrome",
"request": "launch",
"name": "Launch Chrome against localhost",
"file": "${workspaceRoot}/bin/h5/index.html",
"webRoot": "${workspaceRoot}",
"userDataDir": "${workspaceRoot}/.userdata",
"runtimeArgs": [
"--allow-file-access-from-files",
"--allow-file-access-frome-files",
" --disable-web-security"
]
},
{
"type": "chrome",
"request": "attach",
"name": "Attach to Chrome",
"port": 9222,
"webRoot": "${workspaceRoot}"
}
]
}

.vscode 文件夹中创建文件settings.json,并复制以下内容到文件内。这样我们可以在搜索的时候排除一些文件夹。

{
"search.exclude": {
"**/src": true,
"**/libs": true,
"**/laya": true
}
}

最后,在根目录中创建空文件jsconfig.json,这可以让我们进行跨文件搜索。

你也可以下载示例项目的源码并复制相应的文件到你的项目中。可以从这里下载到项目源码。

定位代码

在开发过程中,断点调试是比较频繁的。VS Code提供了多种方式来帮助我们快速定位需要断点的代码行。

  • 如果我们使用了LayaAir的模块化(分包)功能,那么就会生成多个JavaScript文件。使用Ctrl+T在多个JavaScript文件之间定位指定的类名、本地变量名。
  • 在当前打开的文件中使用Ctrl+Shift+O来定位类名、类成员函数、本地变量名。
  • 使用Ctrl+Shift+F在所有的JavaScript文件中的定位任意字符串。
  • 使用Ctrl+P来快速打开任意指定的文件。

在多个JavaScript文件中定位代码

在示例项目中,我们有两个JavaScript文件,一个是分模块文件qux.js,一个是主模块文件LayaSample.max.js。想要跨文件搜索,我们需要保证至少有一个JavaScript文件在VS Code中处于打开状态。如果我们只让qux.js处于打开状态,使用Ctrl+T打开输入框,那么我们可以:

  • 输入类名的全名或者前几个字符来定位类。比如输入layasample或者它的前几个字符来立即定位LayaSample这个类。
  • 输入本地变量的全名或者前几个字符来定位本地变量。比如输入myfoo或者它的前几个字符来立即定位myfoo这个本地变量。

在当前打开的JavaScript文件中定位代码

假设当前打开的文件为LayaSample.max.js,用Ctrl+Shift+O打开输入框,那么我们可以:

  • 输入类名的全名或者前几个字符来定位类。比如输入layasample或者它的前几个字符来立即定位LayaSample这个类。
  • 输入本地变量的全名或者前几个字符来定位本地变量。比如输入myfoo或者它的前几个字符来立即定位myfoo这个本地变量。
  • 输入类成员函数的的全名或者前几个字符来定位它。比如输入barbarbar或者它的前几个字符来立即定位barbarbar这个成员函数。

在所有的JavaScript文件中的定位任意字符串

使用Ctrl+Shift+F快速搜索Foo.barbarbar方法中的字符串'bar bar bar.'

快速打开任意指定的文件

使用Ctrl+P来快速打开任意qux.js这个文件。

调试

使用F5开启调试,调试方式和Chrome基本相同。

一般的调试

myfoo.barbarbar();这一行打上断点,点击游戏区域便可触发此断点。在调试控制台可以看到barbarbar这个方法的输出。

断点自动停止在报运行时错误的代码行

点击游戏区域便可触发Foo.baz这个方法的报错,断点会自动触发并停止在a.b();这一行,并且提醒TypeError: Cannot read property 'b' of undefined

一点重要的说明

在html页面加载的时候执行的JavaScript代码断点可能不生效,除非你再次刷新页面。官方对此有详细的解释

Chrome中开启异常自动断点

见图

参考资料

借助Visual Studio Code提高基于ActionScript的LayaAir HTML5游戏的调试效率的更多相关文章

  1. 使用Visual Studio Code调试基于ActionScript的LayaAir HTML5游戏

    使用Visual Studio Code(VS Code)调试的优势 使用VS Code我们可以极大地提高LayaAir Html5游戏项目的调试效率,VS Code的优势有以下几点: 在发生Java ...

  2. 在基于TypeScript的LayaAir HTML5游戏开发中使用AMD

    在基于TypeScript的LayaAir HTML5游戏开发中使用AMD AMD AMD是"Asynchronous Module Definition"的缩写,意思就是&quo ...

  3. Rust初步(二):使用Visual Studio Code编写Rust程序(猜猜看游戏)

    我是照着下面这篇帮助文档,完成了第一个完整的Rust程序: 猜猜看 游戏 http://kaisery.gitbooks.io/rust-book-chinese/content/content/3. ...

  4. Java on Visual Studio Code的更新 – 2022年1月

    大家好,欢迎来到 Visual Studio Code Java 更新 1 月版!这是我们新年的第一篇博客,我们将回顾 2021 年的亮点,并分享我们 2022 年的产品路线图!除此之外我们还有一些令 ...

  5. 剖析并利用Visual Studio Code在Mac上编译、调试c#程序

    0x00 前言 一周多以前的微软的Build大会上,微软发布了一个让很多人眼前一亮的工具,也是本文的主角——Visual Studio Code.很多使用Windows的朋友都很高兴,认为又多了一个很 ...

  6. Visual Studio Code 1.0发布:100+语言,300+pull请求,1000+扩展

    在第一个预览版发布一年后,微软发表了Visual Studio Code 1.0. 在//BUILD 2015大会上,微软宣布,他们的一个团队需要几个月来创建Visual Studio Code的第一 ...

  7. 剖析并利用Visual Studio Code在Mac上编译、调试c#程序【转】

    0x00 前言 一周多以前的微软的Build大会上,微软发布了一个让很多人眼前一亮的工具,也是本文的主角——Visual Studio Code.很多使用Windows的朋友都很高兴,认为又多了一个很 ...

  8. First ASP.NET Core Application on a Mac Using Visual Studio Code

    一直希望可以在mac上直接编写webapp (用C#)现在终于伴随着 core 世界美好了,不需要用pd windows了 nice. Visual studio code 更新1.1版本了 怀着激动 ...

  9. 如何用Visual Studio Code远程调试运行在服务器上的nodejs应用

    假设我有一个nodejs应用,运行在AWS - 亚马逊云平台上(Amazone Web Service).我想用本地的Visual Studio Code来远程调试服务器端的nodejs应用. Vis ...

随机推荐

  1. 洛谷P1396 营救

    题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪盈眶,开起了门…… 妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小 ...

  2. 详解 Cookie 和 Session 关系和区别

    在技术面试中,经常被问到“说说Cookie和Session的区别”,大家都知道,Session是存储在服务器端的,Cookie是存储在客户端的,然而如果让你更详细地说明,你能说出几点?今天个推君就和大 ...

  3. PHP_INT_SIZE

    PHP_INT_SIZE:表示整数integer值的字长 PHP_INT_MAX:表示整数integer值的最大值 注: 输出下32位中PHP_INT_SIZE:4,PHP_INT_MAX:21474 ...

  4. git grep mysql 操作历史

    history |grep mysql-----git history匹配出mysql操作的命令 !626 到mysql命令安装处链接mysql /usr/local/mysql/bin/mysql ...

  5. Rabbitmq--topic

    一.前言 前面讲到direct类型的Exchange路由规则是完全匹配binding key与routing key,但这种严格的匹配方式在很多情况下不能满足实际业务需求.topic类型的Exchan ...

  6. 1.ideal常用快捷键

    Alt+回车 导入包,自动修正Ctrl+N   查找类Ctrl+Shift+N 查找文件Ctrl+Alt+L  格式化代码 Ctrl+Alt+O 优化导入的类和包Alt+Insert 生成代码(如ge ...

  7. 「LibreOJ β Round #4」游戏

    https://loj.ac/problem/524 题目描述 qmqmqm和sublinekelzrip要进行一场游戏,其规则是这样的: 首先有一个序列,其中每个位置是一个整数或是X.双方轮流将X的 ...

  8. 数字配对(bzoj 4514)

    Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对 ...

  9. HDU 5213 分块 容斥

    给出n个数,给出m个询问,询问 区间[l,r] [u,v],在两个区间内分别取一个数,两个的和为k的对数数量. $k<=2*N$,$n <= 30000$ 发现可以容斥简化一个询问.一个询 ...

  10. MDI窗体简单方法(调用,闪屏)

    调用方式: RibbonForm mdishow = new RibbonForm(); //实例化 midshow.MdiParent = this; //设置在主窗体,以MDI的方式显示,关键属性 ...