【Flutter&Flame 游戏 - 贰肆】pinball 源码分析 - 项目结构介绍.md

9,734 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 25 天,点击查看活动详情


前言

这是一套 张风捷特烈 出品的 Flutter&Flame 系列教程,发布于掘金社区。如果你在其他平台看到本文,可以根据对于链接移步到掘金中查看。因为文章可能会更新、修正,一切以掘金文章版本为准。本系列源码于 【toly_game】 ,如果本系列对你有所帮助,希望点赞支持,本系列文章一览:

第一季完结,谢谢支持 ~


1. pinball 整体介绍

Flutter 在 I/O 2022 中开源的 pinball 游戏,无疑让大家眼前一亮,看到 Flutter 在休闲游戏中也可以发挥价值。但其中使用了 Firebase 进行用户认证,并记录成绩进行排名,这对于 I/O 2022 中的小游戏,是非常必要的。

但是,由于网络原因,克隆项目后并没有跑起来。另外 pinball 目前好像只是支持 web ,这对于学习而言并不是很友好。所我打算对 pinball 这个项目的源码进行解读,从中抽离出一些模块进行介绍,,保证代码的可运行。在其中肯定也能见识到官方大佬对于整体逻辑和结构的处理技巧,相信一定有所收获。


pinball 中的场景并不是非常复杂,在游戏开始时,是资源加载的界面,会有一个加载的进度条:


主页面如下,主要是背景和 play 的按钮,相当于一个简单的菜单,可以看出整体上是一个 伪 3D 的风格,营造一种空间感。


在点击 play 之后,会有一个选择菜单,选择地板的图片纹理。在选择相关的 icon 时,地板就会进行相应的变化。


选中之后,会出现一个 How to Play 的面板,介绍玩法,及按键的操作。这个界面将在几秒后消失:


当游戏结束时,会有一个挺好看的移动转场,用户输入名字后,显示 Replay 的菜单:

总的来看,pinball 整体玩法并不是非常复杂,很符合休闲小游戏的定位。但从代码的角度来看,还是有不少内容的,特别是主游戏场景中,有很多构件,以及弹球的碰撞、发射等。


2. 应用分包处理

pinball 作为官方的开源项目,在项目结构上的处理还是很值得借鉴的。如下所示,可以看出项目对不同模块进行了分包处理。这就可以对项目进行分层管理,本质来说,这就相当于自己在本地创建了一个三方库进行依赖。


在主项目的 pubspec.yaml 中,可以在 dependencies 依赖节点引入这些包。使用 path 属性,指定相对路径即可,如下图所示:


3. 简看各个包的作用

既然把每个模块进行分包处理,那么每个包的作用就相对比较明确。这里想要了解一个包的作用,可以从三个角度入手:外貌资源源码 。外貌就是表面上显示的信息,比如包的名称、包的描述简介,比如 authentication_repository 包,从名称上就可以看个大概,是用于处理用户认证信息的仓储。

包中的 资源 :表示这个包中有哪些文件,从中可以对其复杂程度做一个初步的认知,比如这里 authentication_repository 就一个主要文件,可见其本身并不复杂。对于不太复杂的包,可以稍微瞄一眼其中的源码实现,不一定要全懂,但至少混个眼熟。
这里认证逻辑是非常简单的,通过 FirebaseAuth 出发 signInAnonymously 方法而已。


geometry 包也比较简单,用于提供一些方法作为几何计算的辅助:


leaderboard_repository 用于提供排行榜数据,而且数据是存储在 Firebase 云端存储的。


pinball_audio 包的作用是管理游戏中的音频资源数据,可以看出 pinball 对包的划分还是非常细致的。


pinball_components 是一个非常复杂的包,其中维护着游戏中相关的各种 Component 。前面我们也知道,对于 Flame 游戏而言,最重要的就是各种维护 Component 角色之间的关系。所以这个包必定是以后研究的重点。


pinball_flame 是专门针对于该项目的一些偏僻问题的解决方案,也就是根据实际需求对 Flame 的拓展。其中 Flame1.2.0 在新加入的 parent_is_a.dart 应该就是吸取了这里的经验。框架与实际应用相辅相成,互相促进发展,是个很好的现象。


pinball_theme 也比较简单,从 assets 文件夹在就可以看出,这个包的作用的对选择地板砖的主题进行设置。


pinball_ui 用于处理字体、颜色、对话框、主题等显示样式的工作:


platform_helper 中目前只有一个校验平台是否是 AndroidiOS 的方法,没有什么其他内容。没有要太在意:


share_repository 包主要用于分享分数,维护社交平台分享文字的数据,比如 twitterfacebook


这样,对于 pinball 的整体结构我们就有了一个基本的认知。其中并不太感兴趣的是关于 Firebase 的内容,和它相关的有 authentication_repositoryleaderboard_repository 。下一篇就来从源码的角度去分析一下其中的具体实现。相信从中可以学到很多知识,那本文就到这里,明天见 ~

\