### 编译

编译前初始化环境

1. 执行 release/vnpackage/install_webpack.bat 
2. 安装 vscode
3. 安装 nodejs
4. 执行命令 npm i typescript 安装 typescript
5. 在当前目录右键打开 vscode
6. 运行从 TS 到 JS 的自动编译任务：按下 ctrl + shift + B 打开编译菜单，找到 tsc 任务执行，该任务用于监视 ts 文件变化并即时编译成 js 文件
7. 打出 VN 包和测试：测试前请保证编译了主项目的 release，按下 ctrl + shift + B 执行 build VN and run QQLive 即可打包并测试

### 调试

调试工具需要 nodejs 运行

1. release/vnpackage/tools/logserver.js 可显示即时日志。设置 util.ts 模块的 logType 为 LogType.remote，执行 logserver.js 即可将 log 内容打印到另一个窗口。提交代码时需要注意改回 LogType.local，这样才会打印到日志中。
2. release/vnpackage/tools/remoteconsole.js 可打开控制台。将 util.ts 注释掉的危险代码 function openRemoteConsole 解掉注释，然后在 index.ts 引入并调用，即可在外部打开一个可以执行任何 JS 表达式的控制台，可以方便的调试各种变量，执行各种操作。非常危险的代码，提交代码时需要注释掉！
3. 配置开关 \[VN\] EnableDebugger=1，按 F5 一键调试。

### Native 对 JS 接口

锁定画布  
lockCanvas(): void;  

解锁画布  
unlockUpdate(): void;  

初始化，参数可以是空字符串  
onInit(params: string): void;  

注册弹幕回调  
onRegisted(seq: string, success: number, registerId: string, danmuKey: string): void;  

打开举报弹幕窗口，参数是 JSON 字符串，格式是 { id: string, content: string }  
reportBulletComment(s: string): void;  

打开登录界面  
login(): void;  

设置最大行 参数是整数格式的字符串  
setMaxLine(maxLine: string): void;  

点赞回调，参数可以是空字符串  
onLike(s: string): void;  

(异步) 得到圆角图片，参数是一个 url 和一个回调函数，下载完图片，裁剪完成时触发回调，传入一个有效路径  
getRoundImage(url: string, onDownload: (path: string)=>void): void;  

得到当前 GFFrame 的底部 margin 值  
getMarginBottom(): number;  

设置当前 GFFrame 的底部 margin 值  
setMarginBottom(bottomMargin: number): void;  

得到父窗口宽度 (当前 GFFrame 有 margin，固需要得到父窗口宽度才是真实宽度)  
getWndWidth(): number;  

得到父窗口高度  
getWndHeight(): number;  

设置箭头光标  
setArrowCursor(): void;  

设置手形光标  
setHandCursor(): void;  

### JS 对 Native 接口

VN onReady 回调  
onReady(): void;  

VN init 回调  
init(): void;  

弹幕开关，参数是 JSON 字符串，格式是 { open: number }  
switchBullet(o: string): void;  

注册弹幕，参数是 JSON 字符串，格式是 { vid: string, cid?: string, lid?: string, seqid?: string  } | { programid?: string }  
registerBullet(o: string): void;  

设置播放进度，参数是 JSON 字符串，格式是 { playtime: number }  
setVideoPlayPos(o: string): void;  

设置播放状态，参数是 JSON 字符串，格式是 { status: 'playing' | 'paused' | 'stoped' }  
setPlayerStatus(o: string): void;  

(透传) 发送弹幕，参数是 JSON 字符串，格式是 { bb_head?: string, bb_id?: number, commentid: string, content: string, content_style: string, headurl?: string, rich_type?: number, sendid?: string, uservip_degree?: number }  
setComment(o: string): void;  

(透传) 设置富文本数据，参数是 JSON 字符串，格式是 { data: { emojiConfig: { vecEmojiInfo:{ emojiCode: string, emojiUrl: string }[] }, roleDMConfig: { roleConfigId: string, type: number, strHeadUrl: string }[] } }  
setRichData(o: string): void;  

设置播放速度，参数是 JSON 字符粗，格式是 { rate: number }  
setRate(o: string): void;  

窗口大小改变，不需要传参数  
onSize(): void;  

鼠标移动，参数是 JSON 字符串，格式是 { x: number, y: number }  
onMousemove(o: string): void;  

鼠标左键弹起，不需要传参数  
onLButtonUp(): void;  

鼠标右键弹起，不需要传参数  
onRButtonUp(): void;  

结束绘制，不需要传参数  
onEndPaint(): void;  

鼠标离开，不需要传参数  
onMouseleave(): void;  
