简介
前言
这是中级进阶教程,看到这里的朋友首先必须要有Javascript编程经验基础,如果会QML的话会更好。
一、框架架构
鹰歌框架是一款使用Qt+QML、使用C++、Javascript、Java编写的App,非H5核心(但内置H5浏览器),最底层是用Qt/C++、Java编写,用来提供系统平台特定功能、网络、数据库、热更新、跨平台、压缩、加解密等底层功能,所以叫“框架”,而引擎部分基本是纯QML编写,是由RPG游戏运行环境+编辑器组成,运行在框架之上,所以鹰歌框架下可以做多个引擎或游戏,目前鹰歌已经集成了RPG、Bacon2d、Box2d这三种引擎和多个扩展(qnanopainter、quazip等),开发者可任选一种引擎进行开发,也可脱离引擎使用QML来原生开发。
目前鹰歌已适配到windows、安卓、Linux(Debian、Ubuntu、openKylin等)、MacOS、IOS平台,工程通用,真正做到本地化跨平台。
二、RPG引擎架构
RPG引擎,从不同角度讲有不同的东西,总体来说,也就是1个地图编辑器,2种编码方式,3块脚本,4个对象:
从界面角度讲,有2个界面,一个是地图界面,一个是战斗界面,地图界面包含了丰富的组件(比如信息框、对话框、选择框、输入框和地图、视窗、角色等系统组件)和功能,战斗界面也有组件(比如信息框、选择框和战斗人物组件、血条等)和功能;一般地图界面的系统命令是以game开头的,而地图界面的系统命令是以fight开头的。
从编辑器角度讲,一共有地图、角色、特效、道具、战斗角色、战斗技能、战斗脚本、通用脚本、图片、音乐、视频这几个大类。其中“特效”做出的东西会在角色、战斗角色、战斗技能中使用到。
从游戏脚本对象角度讲,游戏一共有4种脚本对象(其他的编辑器做出的是json数据):战斗角色、战斗技能、道具和战斗脚本。
从游戏逻辑脚本角度讲,游戏逻辑脚本有3个地方:游戏起始脚本(start.js)、地图脚本(map.js)和通用脚本(common_script.js)。
游戏起始脚本是游戏载入后的入口文件,start是入口函数,所有的游戏初始化可以写在这里。通用脚本是可高度自定义游戏界面、运行机制等的一些配置和函数(比如战场设置、按钮、摇杆大小、Buff种类和功能等等等非常丰富的配置)。
地图脚本对应每张地图载入后使用的脚本,start是入口函数(载入地图后运行),其他的函数不同名字都有特定的功能,也可以自己定义函数去调用。
从游戏资源的角度讲,有Images(图片)、Maps(地图)、Music(音乐)、Roles(角色)、Sounds(音效)、Sprite(特效)、Video(视频)几种。
三、重点内容
1、4个脚本对象
弄清这个东西非常重要,因为涉及到游戏的自定义和存档的保存(只有战斗角色、战斗技能和道具会保存)。
这4个脚本对象的共同点,就是都包含一个$createData函数和$commons对象,$commons对象就是所有创建的对象所共有的属性,比如你想做一种道具,它的属性都是固定的,它不会保存到存档中,只是游戏启动时加载,那么你可以把属性写在$commons里,如果你想做一种道具,它的属性是有可能变化的,那么你可以写在$createData里,它创建的属性都会保存到存档中,如果两个地方都有相同的属性,那么以$createData创建的属性为先。
两种方案可以混用,比如一个道具的一些数据可以写在$createData中,而道具描述$description写在$commons中,这样好处既能减少存档大小,而且以后修改描述直接修改脚本对象即可,否则保存在存档里就不好改了。
我们有很多地方会创建这4种脚本对象,比如系统命令:game.createfighthero、game.getgoods、game.getskill、game.fighting、game.fighton等,还包括:战斗人物脚本中定义的$skills、$goods、$equipment属性,战斗脚本中对敌人的创建属性$enemiesData(类似战斗人物脚本),道具脚本中$skills、$fight属性,这些属性在脚本对象创建时也会创建为实体对象,所以在定义时有几种方式:
a、字符串。字符串是最简单直接的,字符串本身就是“资源名”(我们这里的资源名就是你保存那四种对象的名字),创建时直接按脚本内容默认的来创建,视图编程基本都用的这种方式,但注意它们的$id就是资源名,如果有$id不允许重复的就会创建失败(比如战斗人物)。
b、带有 RId 属性的对象。这种方式可以自定义你的对象内的属性,对象属性格式为:
RId:字符串,和字符串创建方式一样,是“资源名”;
Params:任意类型;可选,创建对象调用$createData时给定的参数;
其他属性:任意类型;可选,创建对象后会复制/替换到对象中;
比较复杂的是战斗人物对象,它比其他对象多了$Combatant函数,举个例子,如果调用了game.createfighthero({RId: xxx, Params: {。。。}}, $attack: 66, $defense: 99}}),则创建这个战斗人物的步骤为:
先通过 通用脚本的 $Combatant函数 创建一个对象A;
找到RId为xxx的战斗人物脚本,通过 $createData 创建一个对象(参数为上面定义的Params),并覆盖对象A,成为对象B;
将game.createfighthero的其他属性赋值到对象B中($attack: 66, $defense: 99),成为最终战斗人物对象C。
c、直接传入创建好的对象。
这种一般用的少,只有拷贝对象的时候可能会用到(比如getSkillObject、getGoodsObject、getFightRoleObject 和 getFightScriptObject函数)。
2、属性的名称约定
注意:脚本中前缀带"$"号的属性默认都是系统使用的,两个"$"号的属性是系统使用的,但不会被存档(比如$$propertiesWithExtra 或 战斗的一些属性)。
3、代码编辑器
鹰歌的代码编辑器仅仅是有和无的区别,这是因为QML自带的文本组件实在是太难用,加上我也没时间去做一个好的文本编辑器(这也是一个大工程),所以建议使用三方优秀的代码编辑器来辅助(但注意鹰歌不会检测已读取代码文本的内容,所以注意不要用鹰歌打开用其他编辑器打开的代码文件) 。
这边我就推荐一些专业的代码编辑器,例如PC上使用:
- “VSCode”
- “Sublime Text”
- “WebStorm”等
安卓上使用:
安卓前两个工具还带打包APK功能,920 编辑器在高版本安卓会有漂移BUG,不然真是一个很不错的代码编辑器,带高亮和语法分析。
4、关于打包
a、原则上用什么平台开发就打包什么平台的安装包,比如win下是一个带exe和bat的文件夹(你可以自己压缩),安卓下是apk,linux下是deb(也是一堆库和环境文件)等等。
b、打包环境文件一般是2个压缩文件(一个是Qt环境文件一个是引擎文件,前者一般比较大且固定,后者会随着引擎的更新而更新),我一般上传到了qq群文件夹的对应目录里,需要打包的下载,然后按要求和打包步骤去打包。
c、打包的平台中,安卓是比较麻烦的,但我也提供了半自动化处理:把两个环境放在固定目录,然后改一些参数即可(比如包名、图标、存档位置等等,如果上架tap还得修改tap的key等等),再用三方app来打包就行。win和linux相对简单,替换一下工程目录即可。
d、由于时间精力成本问题,目前只有win、安卓的打包环境文件,如果需要其他的打包环境时再说。
四、进入引擎主界面

Tips:
- 点击“示例工程”可以下载官方自带Demo工程,点“开始游戏”进行游戏;
- 可以从群文件下载项目,然后点“导入工程”可以将项目倒入引擎中,点“开始游戏”进行游戏;
- 下面的版本号是RPG引擎的版本;
更新日志
b96e0
-于22132
-于cf9b7
-于e4089
-于12604
-于d5d68
-于