校园周边瞎逛——高冠瀑布
西北(西瓜)工业大学,作为陕西省著名九百八十五工科高校,坐落于秦岭脚边,是一所在山里面的大学。
正值中秋假期,趁着没课,干脆出门走走,抱着这样的想法,我揣着手机和两瓶水就直接出了校门。
折腾来折腾去也总算是把博客部署下来了,中间有很多奇奇怪怪的困难点,不过最后还算是大体成功吧。
不知道为什么远程服务器总是拒绝SSH链接,现在我要更新博客还得靠复制文件。
算了,累了,之后再来维护吧。
FLFramework是一个MonoGame的功能扩展框架,我们(就我一个人)已经在现阶段实现了一些功能,接下来的文章将会包括对这些功能的具体阐述。
PS:建议按照本索引的阅读顺序从上往下阅读,因为后面的教程可能用到前面的知识。
PSS:本文章默认读者有一定的C#和MonoGame编程基础,且已经在项目中部署了FLFramework。如果你还没有部署的话,可以查看FLFramework的介绍文档来操作。
屏幕摄像机Camera
与绘制对象Drawable
使用屏幕摄像机和自定义绘制对象进行图像的输出,更轻松地完成图像的定位、缩放、旋转、淡入淡出、动画播放等。
动画管理AnimationTrack
使用动画管理器读取储存在Json中的自定义动画,然后作用到自定义绘制对象上。
位图文字管理BmfontController
自定义Bmfont字体文件,并进行输出。
瓦片地图和地物TileMap
、Building
、Tile
场景构建的主要方式之一,利用精灵图集的图块组装成完整场景,相关的类还可以继承,以实现更多效果;
物理管理系统ShapeManager
进行任意凸多边形和圆的碰撞判定,搭配TilePhysics
,可以将其运用到瓦片地图。
输入控制InputManager
汇总信息,方便读取玩家的输入;
粒子效果ParticleController
自定义粒子效果,预设特定的粒子扩散样式并输出,自定义特殊的粒子以实现更特别的效果。
游戏菜单和控件Hud
、HudUnit
创建并自定义游戏菜单,设置菜单和控件的样式,通过继承来自定义菜单和控件的事件与功能;
关于上述教程的应用实例,请前往https://gitee.com/half_tree/full-leaf-framework-samples查看,推荐将文档和示例结合阅读。
full_leaf_framework是一个以MonoGame为基础,制作的一个满足游戏开发基本需求的功能拓展框架,遵循GPL-2.0开源协议。
这个拓展框架充当了一个场景编辑器,相关的代码允许你比较容易地读取玩家输入、创建TileMap场景、定义摄像机、播放动画、制造粒子效果、进行物理判定、创建菜单栏等等,它们在原版的MonoGame中并没有,这个框架就是对上述这些功能的实现。
正如你所见,相较于已经帮你封装好了各种游戏开发工具、逻辑的成熟引擎,作为游戏框架MonoGame仅仅只提供游戏开发最基本的功能,像是打印图像,读取资源这一类,而并不帮你直接完成游戏场景的构建。
MonoGame is a “bring your own tools” kind of framework, which means that it provides the building blocks to build your own engine and tools, but it isn’t quite an engine itself. If you are expecting a scene editor (like Unity or Unreal), MonoGame is not that.
**”Bring your own tools”**,我的选择是:既然MonoGame并不提供场景编辑器,我们就自己做。于是,这个功能拓展框架便这样诞生。
If you love coding and understanding how things work under the hood, MonoGame might be what you are looking for.
也许有人会提到,MonoGame已经有了像是MonoGame.Extended这样的功能扩展,为什么还要自己做?实际上,我希望自己在这样一个框架的构建过程中,能够真正搞懂那些决定游戏底层的逻辑到底是怎么运作的。所以,我个人是把这个探究过程看作是磨练能力的过程。
也许以后我接触了更深层的理论,会意识到我自己做的东西其实需要改进、需要更新,甚至可能意识到我做的东西没啥意义,在浪费时间。但是,如果不尝试的话,就连这种意识也不会有,所以,我还是继续做吧。
最后, Programming is an art form ,这个过程本身也很有趣!希望各位也可以在代码所创建的世界中,体会编程的乐趣!
琪露诺特别聪明,算法复杂度仅有 O(logN) !
景公好弋,使烛邹主鸟而亡之。公怒,诏吏欲杀之。晏子曰: “烛邹有罪三,请数之以其罪而杀之。”公曰:“可。”于是召而数之公前,曰:“烛邹!汝为吾君主鸟而亡之,是罪一也;使吾君以鸟之故杀人,是罪二也;使诸侯闻之,以吾君重鸟而轻士 ,是罪三也。数烛邹罪已毕,请杀之 。”公曰:“勿杀,寡人闻命矣。”
—— 《晏子春秋(外篇)》
以上是一个颇有意味的故事:烛邹帮助景公管鸟却不小心放走了鸟,景公一气之下想要杀了他,晏子这时向齐景公列举了烛邹的三条罪状,让景公明白为了鸟杀人是件不值得的事情,从而改变了景公的想法。
晏子为什么能够成功?一是晏子作为春秋时代著名的政治家、思想家,本身就能言善辩,可以于景公发怒之时冷静以对;二是晏子的语言技巧相当精湛——在刚才的文段中,晏子所使用的话术是“归谬法”,这是我们接下来要讨论的主题。
非常遗憾的是,MonoGame作为一个游戏框架,其默认的spriteFont
不支持打印中文(其实这一点也劝退了很多尝试使用MonoGame的开发者)。虽然如此,解决方法也还是存在的,我们可以使用Bmfont(位图字体),自定义我们的字体并使用它输出中文。
官方文档(Bmfont generator,全英文):
https://www.angelcode.com/products/bmfont/documentation.html
Bmfont(位图字体,通常也指它的生成器)是一种字体形式,允许我们从图片来创建自定义字体。只要准备好一张包含所需文字的图片,或者从已有字体中选择文字,就可以生成相应的.fnt
字体描述文件和图片文件。然后,我们的程序就可以读取这些文件,并对其中的字体信息加以利用。
生成Bmfont的过程在此不多赘述,本身也很简单,而且网上有很多教程。
接下来,面对生成的.fnt
文件和图片文件,我们应当如何利用它们?
注:完整项目代码在此:https://gitee.com/half_tree/full-leaf-framework ,建议结合项目代码(在项目的utils\BmfontController.cs
和utils\BmfontInfo.cs
)阅读。
在游戏开发的过程中,我们往往会进行碰撞检测。 SAT(Separating Axis Theorem,分离轴定理)是一种常用的碰撞检测算法。运用它,我们可以对任意凸多边形、圆之间进行碰撞检测。
介绍其原理前,我们先来看在数学上的凸集分离定理,它是SAT算法的基础。
凸集
凸集是对于集合内的每一对点,连接该对点的直线段上的每个点也在该集合内。
超平面
超平面是指n维线性空间中维度为n-1的子空间。 它可以把线性空间分割成不相交的两部分。
对于三维空间来说,超平面就是一个二维平面,对于二维平面,超平面就是一条直线。
凸集分离定理
两个不相交的凸集总可用超平面分离。
注:上述定理的证明我也不会,这需要用到大学的数学知识,然而我连大专学历都没有(
根据上述原理,我们可以得到在二维平面上的分离轴定理
对于两个凸多边形,若存在一条直线将两者分开,则这两个多边形不相交。
接下来,我们将会用程序去寻找这条直线,找到了,两个多边形就会分离,反之为碰撞。
图中给出了一个实例,两个分开的凸多边形被一条直线分开
听起来很神奇,一位诺贝尔奖得者居然会来到江西的一所高中进行演讲,不过这件事确实发生了。
Tim Hunt教授,英国生物化学家,因发现细胞周期中的关键调节因子获得2001年诺贝尔生理学或医学奖。(与Tim Hunt教授合作的还有另外两人,这是他们共同获得的奖项。)
今天,我们很荣幸能在江西师大附中听到这位教授的演讲《Some Secrets of Life》,演讲的主题是:生命如何形成并发挥作用。