[SheRO]Lua框架搭建的一点思路

脚本的搭建真的是件非常具有创造性的事情,也是游戏开发里最核心的技术活,因为它是整个游戏的发动机,粘合剂,涉及整个游戏的方方面面。一般还集成在地图编辑器里,比如War3,RPGMaker这些。总之,把脚本框架搭好,我个人认为是一个好游戏必备的核心要求。

今天刚把SheRO的Lua框架搭完,觉得用来创作自己的小游戏完全够用了。还是记一些思路吧,仅供参考,不涉及源码及Lua与C++集成这些,因为我觉得这些开源后就能看明白的,而且我用的是LuaPlus。实在没啥讲的。

我在SheRO里暴露给Lua的函数有这些,分为3个模块,GameLogic,GameView,Audio。

GameLogic::GetPos(param)      --获得某个Entity的Pos
GameLogic::SetPos(param) --设置某个Entity的Pos
GameLogic::GetAttribute(param)--获得某个Entity的属性
GameLogic::SetAttribute(param)--设置某个Entity的Pos
GameLogic::CreateEntity(param)--创建一个Entity,Npc,Mob等
GameLogic::RemoveEntity(param)--删除一个Entity
GameLogic::ChangeEntityState(param)--更换一个Entity的状态机
GameLogic::ChangeMap(param) --更换地图

GameView:Talk(param) --显示一个Npc对话框直到所有语句显示完毕
GameView:AddEffect(param) --显示一个特效

Audio:AddAudio(param) --播放一个音效

注意,param为一个table类型,所以它里面可以存储很多数据,具体可以参阅SheRO源码。

有了这些函数后,Lua在SheRO里扮演的角色是:

  1. Datebase
  2. 地图初始化
  3. 触发器
  4. AI

下面逐个简单介绍下:

1,Database

其实,我用Lua作数据库纯粹是取巧,对于SheRO来说,目前整个游戏就几个种类的怪物,用Lua来存储信息足够了。不过比较好的方法是用自定义二进制格式存储。

在SheRO里,我用的是一个table存储一个Entity的信息,实际上所有数据我都用的table。比如对于Mob1,它的数据如下:

Mob1=
{
EntityType = "mob",
VisualData = "data//sprite//阁胶磐//wish_maiden",
typeId = 1,
Attribute =
{
fov=14,--视野
fof=4,--攻击距离
walkSpeed=14,--移动速度
atkSpeed=60,--攻击速度
hp=10000,
maxHP=10000,
mp=2000,
maxMP=2000,
minAtk=600,--最小攻击力
maxAtk=800,--最大攻击力
def=100,--防御力
},
}

2,地图初始化:

在进入某个地图时,地图上需要增加哪些怪物,哪些触发器等,也由Lua来做

3,触发器:

一般来说这是最重要的,它分为2种:主动触发和被动触发。

主动触发:比如传送点,它在每轮循环判断是否满足设置的条件,满足则触发

被动触发:比如Npc,它需要玩家点击Npc才触发

4,AI:

实际上就是把怪物AI最上层的决策模块用Lua来驱动,最主要的还是编码在C++里的状态机与寻路。

具体的一些例子可以在Script目录下查看。

最后,用一个设计实例来介绍下上面的应用,这是我目前设置的Boss关卡,纯粹脚本驱动的。

首先,地图上一个触发器,实际上是传送点,进入范围内就传送到Boss所在房间

然后和Boss对话:

这个Npc对话是一个被动触发器,对话完毕后,增加两个怪物,Boss也进入战斗状态。其中,两个怪物是普通AI,就是如果玩家在视野内则追着打,Boss则不一样,当它血量大于一半时,它会每隔10秒施放一个火焰技能,当血量少于一半时,它就会进入狂暴状态跟着你打:

 

整个关卡的设计没有一点硬编码,而且可以任意更改数据使可玩性增强,这就是Lua的强大。。。

Over。

你可能感兴趣的:(C/C++)