项目源码:https://gitee.com/FantasyWind/word_game
本项目为使用Dart/Flutter语言开发的命令行文字RPG类型小游戏。
该项目是为了学习Dart语法练习所用,功能比较简单;但本着快乐学习的理念,就弄成了一个RPG小游戏。
游戏主体剧情为:主角[龙傲天]来到盖天村,听村民老爷爷说他孙女被后山恶魔抓取关了起来;所以去后山解救人质,但战斗过后发现打不过恶魔,于是求助村长,从村长哪里得到了一些线索可以通过一个仪式强化自己。然后在村长的帮助下,终于集齐了五行精华,激活祭坛,使自己得到强化,最终战胜了后山的恶魔,得到钥匙,将老爷爷的孙女解救出来。
目前游戏中实现的功能有:
.
└── lib
├── battle
├── engine
├── material
└── task
engine:该目录为文字游戏的引擎,负责游戏场景的构建、场景的切换、命令的处理、英雄、怪物、NPC等类型的定义;负责游戏的基础建设,包括了不同类型的文字游戏中共有的部分逻辑。
material:目前该目录中存放了部分游戏中使用的物品,在我的概念中,这部分应该是用来支持游戏完整的物品系统。因为貌似不是所有的游戏类型都需要物品。
task:该目录给游戏提供任务支持,任务系统应该是rpg类游戏才需要,所以把任务系统的逻辑单独剥离出来了。
lib:该目录为文字游戏的全部代码,其中lib文件夹本身包含的文件为本rpg游戏中自己需要使用的一些自定义类和逻辑。
目前代码中使用到的Dart语言技术点有:
Openable
用来声明可以打开的东西。目前比较典型的场景有:
Displayer
。Displayer
,具体的类可以由游戏的业务代码指定。TaskExpecta
。TaskExpecta
。本来以为对于标准引擎中的Hero
类进行任务支持、战斗支持的扩展可以使用extension,但是看了dart官方文档后发现,官方对于extension的定义是只能添加方法,不能添加实例变量,所以走不通。
也不知道是否存在像ObjC那样,通过associate方法曲线救国的方案,只能后面再研究了。
engine
中定义的Hero
类与NPC
类并不支持任务系统,而RPG游戏中创建的英雄和NPC都有任务功能,所以需要创建对应的支持任务的子类。
该场景其实不太符合工厂方法模式所描述的场景,因为Hero
类与其支持任务的子类并不是兄弟关系,因此不需要将对象的创建过程放进工厂之中,不过为了实践一下工厂方法设计模式,我还是给Hero
类和NPC
类创建了对应的工厂方法。
正常来说,工厂方法模式,
HeroFactory
和NPCFactory
都要声明为虚拟类;但在代码中,这两个都是普通类。
因为Flutter不支持反射,所以后续Hero
、NPC
、Monster
等对象的创建都不会使用反射,而要自动注册,把对应关系保存在一个static修饰的map中。为了方便,我把这部分逻辑也放在了工厂基类中,这也是工厂基类没有定义为虚拟类的原因。
接下来会继续完善这个小游戏,计划增加的功能有:
dart main.dart
即可。