<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>lanzainc.xyz</title><link>https://lanzainc.xyz/</link><description>Recent content on lanzainc.xyz</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 21 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://lanzainc.xyz/index.xml" rel="self" type="application/rss+xml"/><item><title>关于我</title><link>https://lanzainc.xyz/internal/about/</link><pubDate>Tue, 21 Jul 2026 00:00:00 +0000</pubDate><guid>https://lanzainc.xyz/internal/about/</guid><description>&lt;p&gt;　　你好，我是 Lanza&lt;/p&gt;
&lt;p&gt;　　我一直认为“我想多了解你一点”是最大的尊重（甚至某些时候也是最真诚的告白），所以，首先谢谢你愿意来了解我&lt;/p&gt;
&lt;p&gt;　　首先从 slogan 说起吧，我常用的文本是「赛博流浪汉 · 非主流歌手 · 游戏开发者」，所以可以从这几个方面说起我自己的事&lt;/p&gt;
&lt;h2 id="赛博流浪汉"&gt;赛博流浪汉&lt;/h2&gt;
&lt;p&gt;　　当你的兴趣与观念在你所在的环境里比较小众时，你就不得不去寻找一些属于自己的天地了；考虑到你是一个小城市生人，这一点就更加容易发生&lt;/p&gt;
&lt;p&gt;　　所以，在我成长历程中相当长的一段时间内，我都是依赖于网络上的兴趣圈作为主要的人际来源，因为在线下只有少数几个朋友可以找到共同的话题&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;；甚至至今这一点也没有太大的改变&lt;/p&gt;
&lt;p&gt;　　出于固有性格带来的自我保护习惯，以及对兴趣圈子长期以来的了解造成的厌恶，我实际上是一个很容易与外人发生价值观冲突的人&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;，因此在网络社群上的不少连结都是较为短暂的&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;，除了少数可称之为安全屋一样的社群，绝大多数情况下我都是以一个类似流浪汉的姿态去进行网络社交的；这就是为什么给自己赛博流浪汉的 tag&lt;/p&gt;
&lt;h2 id="非主流歌手"&gt;非主流歌手&lt;/h2&gt;
&lt;p&gt;　　认识我的朋友都知道，我是一个重度王傑控，迄今为止已经听了 15 年左右&lt;sup id="fnref:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;；对我来说不仅只是一个带来力量的歌手，很多时候也是一种图腾&lt;/p&gt;
&lt;p&gt;　　扯远了，总之，在他的影响下，我也逐渐学会了用声音表达自己的情感，虽然我在音乐创作上显然缺乏天分，但是好在有一把不算差的嗓子（经过打磨，目前&lt;sup id="fnref1:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;我的最高可控音域是 A4 左右，极限是 C#5），并且长期因为王傑唱法的熏陶，我也养成了一套自己的唱歌方式，慢慢也有朋友评价说「有出片的资格」这样的话了，虽然不能完全当真，但是总是很开心的嘛&lt;/p&gt;
&lt;p&gt;　　当然，虽然我很喜欢这些充满味道的老歌手（包括齐秦他们的歌我也很钟爱），但实际上我的流行歌审美和目前大家喜欢的类型还是存在许多差别的，也正是因此，我会给自己一个非主流的标签（你可不要想到郭德纲了，哈哈）；唱歌和听歌方面的事，在很大程度上也算是对我的个人成长和性格塑造起了相当大的作用的，至今我都只是偶尔听一听比较 high 的歌曲，大多数时候我更喜欢那些乍一听很悲伤的旋律——但实际上这样的旋律才是有力量的，而不是很多人所认为的哭泣和哀嚎&lt;/p&gt;
&lt;p&gt;　　所以，总之我是一个唱歌爱好者，我目前可以唱中文（国语）、英文、日文三种语言的歌曲；如果有机会的话，我很想去学广东话歌和西语歌，如果你有什么诀窍的话，我诚心向你请教 :-)&lt;/p&gt;
&lt;h2 id="游戏开发者"&gt;游戏开发者&lt;/h2&gt;
&lt;p&gt;　　和大多数玩网游的同龄人&lt;sup id="fnref:5"&gt;&lt;a href="#fn:5" class="footnote-ref" role="doc-noteref"&gt;5&lt;/a&gt;&lt;/sup&gt;相比，我从小就喜欢摆弄家里的那台小霸王（FC 兼容机），以及 PC 上的旧单机，对我来说，这些内容远远要比买一张点卡充值然后和别人拼分数要有趣多了……&lt;/p&gt;
&lt;p&gt;　　长期接触内容丰富且经典的游戏类型，加上平时有较多的可以不受实际上的管束的时间&lt;sup id="fnref:6"&gt;&lt;a href="#fn:6" class="footnote-ref" role="doc-noteref"&gt;6&lt;/a&gt;&lt;/sup&gt;，我大概在 2011 年左右开始有要做游戏的想法，严格来说，我的网络人际也是从那个时候开始的；那个时候不仅认识了很多在这方面可以交流的朋友，更有了可以获得学习方法的信息渠道，这个逻辑至今都在为我带来成长的养料&lt;/p&gt;
&lt;p&gt;　　之前提到我的兴趣于所在环境里是小众的，其实就是指这个；要知道哪怕在我上大学的时候，说起游戏工作室，身边人甚至大多数人的概念都是那种网游代练刷装备的工作室，完全没有游戏制作的概念，你就可以理解我生活在一个什么样的状态里了&lt;sup id="fnref:7"&gt;&lt;a href="#fn:7" class="footnote-ref" role="doc-noteref"&gt;7&lt;/a&gt;&lt;/sup&gt;（事实上，进入这所大学是我目前&lt;sup id="fnref2:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;人生中经过最大的灾难之一）&lt;/p&gt;
&lt;p&gt;　　可以说走上这条路是我命中注定的，也可以说是导致我很多人生灾难的程度加重的引火线，但可能这就是命运二字带来的玩味吧&lt;/p&gt;
&lt;p&gt;　　扯远了，说回游戏开发本身的话，目前我算是一个在游戏程序方面具有多种技能与经验的开发者，尤其是在技术栈偏低层的游戏引擎&lt;sup id="fnref:8"&gt;&lt;a href="#fn:8" class="footnote-ref" role="doc-noteref"&gt;8&lt;/a&gt;&lt;/sup&gt;方面；在大学期间，我使用 C/C++ 及 OpenGL 完整地独立实现过一个 RPG Maker VX Ace 引擎的跨平台 runtime，并且基于它将一部游戏&lt;sup id="fnref:9"&gt;&lt;a href="#fn:9" class="footnote-ref" role="doc-noteref"&gt;9&lt;/a&gt;&lt;/sup&gt;搬上了 switch eshop，这算是我至今都非常能找到自我认可的成就&lt;/p&gt;
&lt;p&gt;　　除此之外，TA 方面的工作我也有一定的心得，足以支持我实现一些不算太过硬核的美术效果了&lt;/p&gt;
&lt;p&gt;　　不过，由于种种原因，2016/2017 年我开始&lt;a href="https://lanzainc.xyz/gallery/20160824/lanza-adventure/"&gt;第一次做游戏打包发给别人玩&lt;/a&gt;开始，我的制作状态在事实上就基本陷入了停滞（虽然可以说是在成长中，但我觉得对自己来说这不是一个好的说法），只在 2020 年和伙伴又制作了类似规模的一款 &lt;a href="https://lanzainc.xyz/gallery/20200225/pocket-lanlli-zalli/"&gt;mini 游戏&lt;/a&gt;；此后从 2021 年中开始，我在一家游戏公司度过了将近 5 年加班/开发/赶进度的时光，见证了游戏业的现状且身体反复疲劳之后，才辞职第一次正式开始了自己的游戏制作（也才有机会翻修这里的个人站点）——而这时候距离 2016 年的暑假已经过去了差不多 10 年的时间&lt;/p&gt;
&lt;p&gt;　　现在你看到的我&lt;sup id="fnref3:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;，大概算是处于刚刚度过人生（及游戏制作者这个身份）真正的开始之前那段漫长的前夜吧&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;　　感谢你可以阅读至此，希望通过了解我这样的人，可以使你减轻一份孤独感&lt;/p&gt;
&lt;p&gt;　　祝你好运，加油&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;　　（本页面的内容会随着我的变化而更新，所有必要的时间戳我都会写成脚注，以便理解一些表达细节，再次感谢你的耐心）&lt;/p&gt;</description></item><item><title>新的起点</title><link>https://lanzainc.xyz/posts/20260720/%E6%96%B0%E7%9A%84%E8%B5%B7%E7%82%B9/</link><pubDate>Mon, 20 Jul 2026 00:00:00 +0000</pubDate><guid>https://lanzainc.xyz/posts/20260720/%E6%96%B0%E7%9A%84%E8%B5%B7%E7%82%B9/</guid><description>&lt;p&gt;　　看着西班牙队的欢呼和抢镜的川普，2026 世界杯就这样结束了。&lt;/p&gt;
&lt;p&gt;　　还记得小时候第一次看世界杯时是 2010 南非世界杯，那届夺冠的也是西班牙……十六年过去了，相似的画面，相似的球风，矫情一点的话，也可以说，仿佛自己又短暂地回到了那样的一个时间；那是一个时代的开始，大概也算是我自我意识的开始。&lt;/p&gt;
&lt;p&gt;　　说起来，我的人生和世界杯还真是有不少的镜像，我是个德国球迷，2014 年世界杯夺冠了，我也在那个时候开始了一段最宝贵时光的日子；2018 年小组出局，我也陷入了人生最大的灾难；2022 年是一个大家以为会引向正途的新的开始（然而还是小组出局），我也本这么期待着我的人生（然而并没有引向正途）；2026 年终于结束了噩梦，但想要走得更远的话仍需成长许多许多。&lt;/p&gt;
&lt;p&gt;　　总之，借着最近的兴奋劲，推进开发进度的同时，也终于重新整理了这个站点，以后我会多在这里发一些我写的东西，希望我的牢骚与悲喜可以热闹地陪伴你一段日子。&lt;/p&gt;
&lt;div align="center"&gt;
&lt;img src="https://i1.sinaimg.cn/2010/photo/U687P939T118D1F3257DT20100712054205.jpg" alt="2010 WC" width="80%"&gt;
&lt;p&gt;(配图为 2010 世界杯西班牙队夺冠影像)&lt;/p&gt;
&lt;/div&gt;</description></item><item><title>Godot Contributor</title><link>https://lanzainc.xyz/posts/20260714/godot-contributor/</link><pubDate>Tue, 14 Jul 2026 00:00:00 +0000</pubDate><guid>https://lanzainc.xyz/posts/20260714/godot-contributor/</guid><description>&lt;div align="center"&gt;
&lt;img src="../imgs/37560e724c99a933072354be4d345287.png" alt="2010 WC" width="80%"&gt;
&lt;p&gt;Godot About 页面里的我！&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;随着 &lt;a href="https://godotengine.org/article/maintenance-release-godot-4-7-1/"&gt;Godot 4.7.1 发布&lt;/a&gt; 作者名单有我一份啦，开心！&lt;/p&gt;
&lt;p&gt;只要持续贡献就会被记录名字，这实在是非常令人开心的一件事&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Q: 想做贡献，第一步应该怎么开始？&lt;/p&gt;
&lt;p&gt;A: 如果你是 C/C++ 开发者，可以用自定义构建的 godot 引擎去制作项目，制作过程中遇到的引擎问题你都可以自己尝试修复，修复好之后向 godotengine 官方 repo 提出 PR，待审核意见修改一致后合并就可以啦；我的提交 80% 以上都是 bug 修复。&lt;/p&gt;</description></item><item><title>制作 oblique/cabinet 投影的 2D 游戏时，确认精灵先后顺序的排序方法</title><link>https://lanzainc.xyz/tech/20210202/oblique-cabinet-2d-sprite-order/</link><pubDate>Tue, 02 Feb 2021 00:00:00 +0000</pubDate><guid>https://lanzainc.xyz/tech/20210202/oblique-cabinet-2d-sprite-order/</guid><description>&lt;p&gt;（&lt;a href="https://indienova.com/indie-game-development/oblique-cabinet-2d-sprite-order-/"&gt;元发布页&lt;/a&gt;）&lt;/p&gt;
&lt;p&gt;我经常说，我们以前玩过的很多游戏虽然看上去是2D的，但其实是3D游戏——比如热血物语、双截龙系列，它们具有一套三维的立体空间逻辑，从而不再使得游戏的舞台限制在只有左右移动和上下跳跃这两种轴向——拥有三个维度极为自由开放的移动范围相信也给很多玩家留下了深刻的印象，在&lt;a href="https://lanzainc.xyz/tech/20200305/make-a-fc-nes-collision/"&gt;上次的文章&lt;/a&gt;里，我们已经介绍了这种游戏的物理部分简单实现，本次将会聊到这类游戏在渲染上的重要技巧。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="../u-53362255342An8.png"&gt;&lt;/p&gt;
&lt;p&gt;显然，在用2D精灵模拟的3D空间里，任何一个物体都不简单：如图所示的一个立方体，具有一个oblique视角(或者，我们叫cabinet视角更准确)的造型。这样的视角下，如果有另外一个精灵和它相互遮挡，应该怎么处理它们的渲染顺序关系呢？&lt;/p&gt;
&lt;p&gt;注：为了简化描述，本文章的3D空间假设所有物件的&lt;strong&gt;z坐标都相同&lt;/strong&gt;，即&amp;quot;没有和地面的高度差&amp;quot;。&lt;/p&gt;
&lt;h2 id="任意两个物体之间的排序"&gt;任意两个物体之间的排序&lt;/h2&gt;
&lt;p&gt;按照我们一般的简单思路(比如在经典的topdown视角下，如RPGMAKER系列)，谁在世界上具有较大的y值，谁就靠近屏幕，谁就应该更靠后地渲染，对吧？不过在这样的视角下，就没有那么简单了，来看一个例子：&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="../u-53362255779DeL.png"&gt;&lt;/p&gt;
&lt;p&gt;如图，根据十字形标记，我们可以轻松地发现shari的y坐标小于立方体的坐标，所以她理应被挡在立方体的后面(先于立方体渲染)，对吧？可是当她来到另外一侧的时候，情况就变化了：&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="../u-53362255983Qz6.png"&gt;&lt;/p&gt;
&lt;p&gt;如图，shari的y坐标仍然小于立方体的y坐标，但这个位置上，我们是希望shari遮挡立方体而不是被立方体遮挡的，所以我们需要考虑到更多的情况。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="../u-53362256265Zbw.png"&gt;&lt;/p&gt;
&lt;p&gt;显然，这个世界里的任何一个物体都应该携带它的&amp;quot;&lt;strong&gt;底座&lt;/strong&gt;&amp;ldquo;信息。如图，红色的平行四边形就是上面立方体的&amp;quot;底座&amp;quot;信息，而绿色是它的高度信息(如果你需要一些更细致的排序，比如算上z轴，本文暂不讨论)有了这个信息，我们就可以确定任意两个对象之间的绘制顺序。&lt;/p&gt;
&lt;p&gt;我们把两个要排序的物体分别命名为A和B，A底座的上边缘称为aTop，下边缘称为aBottom；B底座的上边缘称为bTop，下边缘称为bBottom。&lt;/p&gt;
&lt;h3 id="abottom的y坐标小于btop的y坐标"&gt;aBottom的y坐标小于bTop的y坐标：&lt;/h3&gt;
&lt;p&gt;&lt;img loading="lazy" src="../u-53362256677qci.png"&gt;&lt;/p&gt;
&lt;p&gt;这时候A显然是在B的后方，也就是A先于B渲染。&lt;/p&gt;
&lt;h3 id="atop的y坐标大于bbottom的y坐标"&gt;aTop的y坐标大于bBottom的y坐标：&lt;/h3&gt;
&lt;p&gt;&lt;img loading="lazy" src="../u-53362256956zEh.png"&gt;&lt;/p&gt;
&lt;p&gt;这时候A显然是在B的前方，也就是B先于A渲染。&lt;/p&gt;
&lt;h3 id="其它的情况"&gt;其它的情况：&lt;/h3&gt;
&lt;p&gt;&lt;img loading="lazy" src="../u-533622575694jH.png"&gt;&lt;/p&gt;
&lt;p&gt;由于我们这里的视角下，侧面是一个45度的斜线，所以我们可以很轻松地把两个物体下边缘的y轴距离加到aBottom的右端点去进行判断，像是这样：&lt;/p&gt;
&lt;p&gt;distanceY = bBottom.y - aBottom.y&lt;/p&gt;
&lt;p&gt;(我们用left和right表示一个线段的&lt;strong&gt;左端点&lt;/strong&gt;和&lt;strong&gt;右端点&lt;/strong&gt;)&lt;/p&gt;
&lt;p&gt;aBottom.left.x &amp;gt; bBottom.right.x + distanceY&lt;/p&gt;
&lt;p&gt;如果这个判断是成立的，那就是上图所述的情况：A在B的前方，也就是B先于A渲染。&lt;/p&gt;
&lt;p&gt;否则就是下图所述的情况：A在B的后方，也就是A先于B渲染。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="../u-53362257077JJW.png"&gt;&lt;/p&gt;
&lt;h2 id="对场景内所有物体的排序"&gt;对场景内所有物体的排序&lt;/h2&gt;
&lt;p&gt;好，至此我们已经可以为场景内任意的两个对象进行排序了，那么，我们也可以为场景中所有的对象组织排序。很多人的第一反应是，直接用冒泡/选择/归并/快排这样的算法来对场景中需要排序的物体进行排序不就好了吗？其实这是不合适的，因为场景中的物体遮挡存在拓扑关系，如果直接使用线性表的排序方法，可能在swap一对物体以确保他们遮挡关系的同时又会直接破坏了另一对物体的遮挡关系，因此，我们的第一步是对场景中需要排序的物体进行连线。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="../u-53362258891Orn.png"&gt;&lt;/p&gt;
&lt;p&gt;带有弧线的那一端是射线的末端，末端的物体比首端的物体更先渲染(位置更靠后)。&lt;/p&gt;
&lt;p&gt;这里说明一下，我们只对&lt;strong&gt;需要排序的一对物体&lt;/strong&gt;进行连线(出于性能考虑)，所以你的显示对象可能需要有相应的bounding_box或是什么的。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="../u-53362258896iL4.png"&gt;&lt;/p&gt;
&lt;p&gt;当场景中的物体足够多，遮挡关系足够复杂时，不难发现，我们的物体遮挡关系实际上构建出了一个&lt;strong&gt;有向图&lt;/strong&gt;。而有向图可以通过拓扑排序来获取一个不唯一的线性序列，照着这个线性序列进行渲染就可以获得正确的场景排序了。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="../u-53362258871vSu.gif"&gt;&lt;/p&gt;
&lt;p&gt;(图中蓝绿色的矩形是判断精灵相交/重叠用的bounding_box，DRAWIDX则是拓扑排序后得到的渲染顺序值)&lt;/p&gt;
&lt;p&gt;这样，就得到了整个场景的正确呈现顺序。&lt;/p&gt;
&lt;h2 id="最后一点问题"&gt;最后一点问题&lt;/h2&gt;
&lt;p&gt;相信我们都看到过一些&amp;quot;视觉错觉&amp;quot;的趣味图片，对吧？譬如三个无限循环的台阶，相互遮挡的三个棱柱……之类的，很有意思，不过在游戏开发当中可一点也不有趣。很显然，当游戏场景中出现了几个互相存在遮挡和被遮挡关系的对象时，我们构造出的有向图就&lt;strong&gt;成环&lt;/strong&gt;了。而成环的有向图是不能进行拓扑排序的，这就导致我们没有办法去按正确顺序呈现画面。解决这个问题的最好方法就是把容易引起该问题的那个物体分割为两个物体，使得其中的一个部分&amp;quot;专门遮挡&amp;quot;而另一个部分&amp;quot;专门被遮挡&amp;rdquo;，这样就可以消除我们构造的有向图中的环。&lt;/p&gt;
&lt;p&gt;本次的讨论就到这里，祝大家开发顺利，新年快乐！&lt;/p&gt;</description></item><item><title>实现一个类似于 FC 时代简易的碰撞系统</title><link>https://lanzainc.xyz/tech/20200305/make-a-fc-nes-collision/</link><pubDate>Thu, 05 Mar 2020 00:00:00 +0000</pubDate><guid>https://lanzainc.xyz/tech/20200305/make-a-fc-nes-collision/</guid><description>&lt;p&gt;（&lt;a href="https://indienova.com/indie-game-development/make-a-fc-nes-collision/"&gt;元发布页&lt;/a&gt;）&lt;/p&gt;
&lt;p&gt;注：本文章采用Y轴向下的屏幕直角坐标系&lt;/p&gt;
&lt;h2 id="3d游戏"&gt;&amp;ldquo;3D&amp;quot;游戏&lt;/h2&gt;
&lt;p&gt;我们玩到一些游戏时，往往按照画面表现给出一种分类，讲它是2D或是3D的电子游戏。&lt;/p&gt;
&lt;p&gt;实际上我们不仅可以从画面来分，更可以从游戏当中呈现给我们的活动范围来划分，比如经典的：FC《双截龙》系列。&lt;/p&gt;
&lt;p&gt;&lt;img alt="&amp;ldquo;3D&amp;quot;游戏《双截龙》" loading="lazy" src="../u-53363337783uXz.gif"&gt;&lt;/p&gt;
&lt;p&gt;我们可以发现，游戏对象有纵向移动、横向移动、还可以在高度轴上发生移动，&lt;/p&gt;
&lt;p&gt;实际上，这往往已经可以说明它是一个3D游戏了。&lt;/p&gt;
&lt;h2 id="物理的世界"&gt;物理的世界&lt;/h2&gt;
&lt;p&gt;我们知道现在有很多物理引擎——2D的、3D的都有，这些物理引擎能够制作出像《愤怒的小鸟》这样的具有典型的物理感、机关感的游戏。其实我们自己玩的时候会有一些&amp;quot;感觉&amp;quot;的，这些用专业物理引擎制作出的游戏物体运动和我们以前接触到的一些古典的游戏是有很大不同。这就是我们要去研究的点——在不使用专业物理引擎的情况下，怎么去避开这些麻烦的物理拟真，去做一个简单的、老式的具有运动物体和活动范围的空间呢？&lt;/p&gt;
&lt;h2 id="物体"&gt;物体&lt;/h2&gt;
&lt;p&gt;首先我们可以去设计一个物件，用它去表示物理世界内的一个可运动的物体。一般而言，在一开始设计物体时，你最先给出它的两个关键元素：坐标和速度。&lt;/p&gt;
&lt;p&gt;如果你的编程环境中有基本的一些数学工具(比如Vector3这样的东西)，做起来就会比较快，如果没有的话，可以自己简单地写一个——搬中学数学课本。&lt;/p&gt;
&lt;p&gt;物体的坐标用于直接表示它在这个物理世界当中所处的位置，而速度则指示该物体将要如何去变化它的位置——你在游戏循环中需要不断根据速度来修正其位置，这样就实现了物体的运动。&lt;/p&gt;
&lt;p&gt;当然，你还需要给物体施加一个重力(gravity)，让它无条件地产生某种速度变化。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 可以先这样写一个简单的实现，之后我们再修改&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;update&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; gravity &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Vector3&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;new(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;speed &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; gravity
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;position &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;speed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样的示例代码就表示了一个简单的物体每帧受到在z轴为-0.1个单位的重力的运动模拟的过程。&lt;/p&gt;
&lt;p&gt;物体每帧受到z轴负向的重力就会产生自然下落，如果你要给物体一个z轴正向的速度，那么物体就会出现起跳~下坠，这样的一个很自然的过程。&lt;/p&gt;
&lt;p&gt;&lt;img alt="纯Z轴移动" loading="lazy" src="../u-53363339218spV.gif"&gt;&lt;/p&gt;
&lt;p&gt;通常你绘制一个2D物体时，直接将物体的xy坐标拿来加上摄像机坐标就可以拿去直接绘制精灵了——在绘制3D物体时，你需要体现第三轴向的变化。&lt;/p&gt;
&lt;p&gt;屏幕是一个二维空间，体现第三轴向的变化就需要借助xy这两个轴向才行，像是我举例的《双截龙》截图当中就是借助y轴体现z轴的变化的(跳跃只产生了z轴的变化，但是绘制时反映到了y轴上，你可以简单地认为绘制坐标 = 角色Y - 角色Z)。&lt;/p&gt;
&lt;p&gt;那么问题来了，y轴和z轴在绘制上合并了，那么如果物体同时在y轴和z轴发生移动的话，就会造成玩家的困惑，比如下图：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Shari在跳跃的同时还在上下移动" loading="lazy" src="../u-53363340015kdd.gif"&gt;&lt;/p&gt;
&lt;p&gt;Shari在跳跃的同时还进行了上下移动，这在战斗场景等需要玩家判断位置的场合是容易带来困扰的，那么怎么解决呢？也很简单，加个影子就可以了：&lt;/p&gt;
&lt;p&gt;&lt;img alt="有阴影指示Y轴坐标" loading="lazy" src="../u-53363340329oOL.gif"&gt;&lt;/p&gt;
&lt;p&gt;有一个可以指示物体Y轴位置、且大小和浓度受高度影响的阴影，就可以更快使人透过屏幕而辨识出物体在空间当中的位置。&lt;/p&gt;
&lt;h2 id="舞台是一个大台阶"&gt;舞台是一个大台阶&lt;/h2&gt;
&lt;p&gt;刚才我们的示例当中已经做出了一个可以运动的物体，那么，现在我们需要给物体一个活动范围的限制，一般来说，也就是碰撞相关的内容了。&lt;/p&gt;
&lt;p&gt;像我们上面的代码，给出一个gravity，然后让速度不断添加，坐标也不断变化……那么我们看到的就是一个物体无限地朝着z轴负方向掉了下去。&lt;/p&gt;
&lt;p&gt;实际上这个过程我们是可以去施加一个限度的，你可以想象为设置一个&amp;quot;地板&amp;rdquo;，物体的z坐标到了这个地板就到底了，不能再降低了。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;update&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; gravity &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Vector3&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;new(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;speed &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; gravity
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;position &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;speed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;position&lt;span style="color:#f92672"&gt;.&lt;/span&gt;z &lt;span style="color:#f92672"&gt;=&lt;/span&gt; height &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;position&lt;span style="color:#f92672"&gt;.&lt;/span&gt;z &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; height
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以此代码为例，我们写了一个height方法来获取高度，这个高度我们先写死为0——这样一来，物体的z坐标到0这个值就不会再降低了。&lt;/p&gt;
&lt;p&gt;当然，这样的话世界就变成了一个超大的平地，因此我们可以做点变化……&lt;/p&gt;
&lt;p&gt;def height(x, y)
return 32 if x &amp;gt; 100
return 0
end&lt;/p&gt;</description></item><item><title>Lanza 的口袋心脏病</title><link>https://lanzainc.xyz/gallery/20200225/pocket-lanlli-zalli/</link><pubDate>Tue, 25 Feb 2020 00:00:00 +0000</pubDate><guid>https://lanzainc.xyz/gallery/20200225/pocket-lanlli-zalli/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="../imgs/poster.jpg"&gt;
&lt;img loading="lazy" src="../imgs/snap.gif"&gt;&lt;/p&gt;
&lt;p&gt;同样还是FC的风格&lt;del&gt;lanza这次制作的是经典的纸牌游戏&amp;quot;德国心脏病&amp;quot;的电子游戏版&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;与AI玩家玩纸牌需要更加快的反应速度和敏捷性喔！&lt;/p&gt;
&lt;p&gt;本作采用Lanziss开发，发布windows和android两版。&lt;/p&gt;
&lt;h2 id="原文"&gt;原文&lt;/h2&gt;
&lt;p&gt;&lt;del&gt;这还是lanzainc.xyz在2018赛季伤停2年后的&amp;quot;复出&amp;quot;作品……&lt;/del&gt;&lt;/p&gt;
&lt;h3 id="玩法"&gt;玩法&lt;/h3&gt;
&lt;p&gt;每个选手在一局游戏开始时将会发到同等数量的水果纸牌，每张水果纸牌上会印有不定数量和种类的水果图案。&lt;/p&gt;
&lt;p&gt;选手们将会轮流从自己持有的纸牌中翻出一张并盖住已经翻出的牌，当桌上露出的翻出纸牌中出现某种水果的数目加起来正好为5时，便可以按下铃铛！这样就可以将桌面上所有的翻出牌赢取了。&lt;/p&gt;
&lt;p&gt;当然，如果条件未达成的情况下按下了铃铛，就要向其它每个选手发牌一张。&lt;/p&gt;
&lt;p&gt;选手耗尽自己手中纸牌后，如果翻出牌又被全数赢走，那么就&amp;quot;出局&amp;quot;了。&lt;/p&gt;
&lt;p&gt;本作当中的同局角色人数为2~4人。&lt;/p&gt;
&lt;h3 id="故事模式"&gt;故事模式&lt;/h3&gt;
&lt;p&gt;在故事模式中，玩家在成功按铃后可以根据自己所赢得的水果类型获得四种水果道具：&lt;/p&gt;
&lt;p&gt;香蕉：可以获得无条件按铃成功一次的机会&lt;/p&gt;
&lt;p&gt;苹果：可以获得一次在允许按铃时获得屏幕闪烁提示的机会&lt;/p&gt;
&lt;p&gt;草莓：可以获得一次避免被赢走纸牌的机会&lt;/p&gt;
&lt;p&gt;茄子：稍微减缓本局的翻牌速度&lt;/p&gt;
&lt;p&gt;另外，故事模式中，玩家赢得和输掉关卡的条件是不断变化的，一定要在故事模式每一关开始时仔细阅读喔！&lt;/p&gt;
&lt;p&gt;在游戏过程中按下暂停按钮也可以查阅胜败条件。&lt;/p&gt;
&lt;p&gt;本作共有8个故事模式关卡。&lt;/p&gt;
&lt;h3 id="自由模式"&gt;自由模式&lt;/h3&gt;
&lt;p&gt;自由模式下，玩家可以自定义参与的人数和翻牌的速度，并且还可以把玩家设为无，观察AI玩家的对决。&lt;/p&gt;
&lt;p&gt;在故事模式中，通常每过一关就可以在这里获得新的可选人物，不同的人物在玩牌时也会有不同的策略和性格~&lt;/p&gt;
&lt;h2 id="下载"&gt;下载&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://lanzainc.xyz/files/game/Pocket-Lanlli-Zalli.zip"&gt;Windows 包&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Lanziss</title><link>https://lanzainc.xyz/tech/20200228/lanziss/</link><pubDate>Tue, 25 Feb 2020 00:00:00 +0000</pubDate><guid>https://lanzainc.xyz/tech/20200228/lanziss/</guid><description>&lt;p&gt;（&lt;a href="https://rpg.blue/thread-480426-1-1.html"&gt;元发布页&lt;/a&gt;）&lt;/p&gt;
&lt;p&gt;众所周知&lt;del&gt;我们的RMVA&lt;/del&gt;RGSS3提供的runtime是有一些bug，而且在现代显卡之下性能不佳的。
我们英明神武的黄鸡哥哥和⑨姐姐已经以DirectX制作了RGD来解决硬件加速的问题——&lt;/p&gt;
&lt;p&gt;那么，作为凑热闹心态而言，我用Opengl+SDL+mruby实现了另一个全新的兼容RGSS3的游戏引擎。
目标是在兼容RGSS3大部分内容的情况下，尝试跨平台、并且加入更多的功能来增强其适用范围。
由于脚本层是采用mruby实现的，因此它必然和cruby有很多不兼容的地方，已发现的不兼容和注意事项我已经在示例工程中注明。&lt;/p&gt;
&lt;p&gt;【用 Lanziss 完成的 Nswitch 端移植作品已经登陆 EShop ! &lt;a href="https://rpg.blue/forum.php?mod=viewthread&amp;amp;tid=488723"&gt;发布帖&lt;/a&gt;】&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.bilibili.com/video/BV1ni4y1t7nK/"&gt;移植到Nswitch、Android端的演示录像&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="支持"&gt;支持&lt;/h2&gt;
&lt;p&gt;目前已经不再提供示例工程下载，如需商业支持请看主页联系方式&lt;/p&gt;</description></item><item><title>Lanza 的新年派对 2017</title><link>https://lanzainc.xyz/gallery/20170319/lanzas-newyear-party-2017/</link><pubDate>Sun, 19 Mar 2017 00:00:00 +0000</pubDate><guid>https://lanzainc.xyz/gallery/20170319/lanzas-newyear-party-2017/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="../imgs/snap.gif"&gt;&lt;/p&gt;
&lt;p&gt;这次，Jin收到了不详的消息——好友Chin被绑架了！&lt;/p&gt;
&lt;p&gt;Chin的敌手，本作的主人公Sam，为了找到Chin而决定要击败清河市所有的BOSS…&lt;/p&gt;
&lt;p&gt;大致上算是一个技术试水性质的作品(就是完成度不很高)。&lt;/p&gt;
&lt;h2 id="原文"&gt;原文&lt;/h2&gt;
&lt;p&gt;Lanza Inc. 的第二款游戏。与前作相比,玩法有很大的变化,游戏的目的很简单,打败当地的所有小混混,击败阴谋的幕后黑手!但为了达成这一目标,你需要想办法赚到金钱,提升能力,或是争夺武器等等。在圣诞节到来之前,用你高超的技巧和Chin一决胜负吧!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;新年就要来了,清河市一直处于一片和平之中……然而,Chin的突然失踪将Mr.Jin一行人的平静打破了,为了寻找Chin,当地的打手们全数出动。与此同时,慕名来到此地的Sam也展开了和打手们的斗争,一场混乱就要开始了!&lt;/p&gt;
&lt;p&gt;玩法操作:&lt;/p&gt;
&lt;p&gt;按住摇杆:移动&lt;/p&gt;
&lt;p&gt;双击并按住摇杆:跑步&lt;/p&gt;
&lt;p&gt;X键:起跳&lt;/p&gt;
&lt;p&gt;Y键:特技/释放武器&lt;/p&gt;
&lt;p&gt;A键:连攻击/特技&lt;/p&gt;
&lt;p&gt;B键:重攻击/特技&lt;/p&gt;
&lt;p&gt;攻击方式为C系连技,B,AB,AAB,AAAB会使出不同的动作。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;游戏中有难缠的小混混,强大的BOSS,还有小地摊和各种店铺。&lt;/p&gt;
&lt;p&gt;家中的电视更是含有每天不一样的内容,还可以购买足球彩票,&lt;/p&gt;
&lt;p&gt;此外,还可通过邮局任务来赚取金钱。&lt;/p&gt;
&lt;p&gt;在圣诞节来临之前,发动一切力量,击倒幕后的主使者吧!&lt;/p&gt;
&lt;h2 id="下载"&gt;下载&lt;/h2&gt;
&lt;p&gt;※：游戏使用 libgdx 2017 版编写，因此运行需要 JDK 8 以上；此包为使用 2017 年源码重新编译打包的版本&lt;/p&gt;
&lt;p&gt;&lt;a href="https://lanzainc.xyz/files/game/lanzaNYparty-desktop.jar"&gt;JAR 桌面包&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Lanza Adventure</title><link>https://lanzainc.xyz/gallery/20160824/lanza-adventure/</link><pubDate>Wed, 24 Aug 2016 00:00:00 +0000</pubDate><guid>https://lanzainc.xyz/gallery/20160824/lanza-adventure/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="../imgs/title_screen.gif"&gt;&lt;/p&gt;
&lt;p&gt;lanzainc.xyz的第一作，FC风格的platformer。&lt;/p&gt;
&lt;p&gt;游戏中有各种不同的武器和敌人，你需要尽可能获取好用的武器(比如BT的MINIGUN……)&lt;/p&gt;
&lt;h2 id="原文"&gt;原文&lt;/h2&gt;
&lt;p&gt;这是一个怀念FC的游戏,一个玩了多年FC,终于下决心要去创造同样世界的人所做的游戏。&lt;/p&gt;
&lt;p&gt;游戏融合了一些双截龙和热血硬派的要素,形式上是传统的横版闯关,实际上还有打斗,武器,枪战等元素,游戏的难度也比较大。&lt;/p&gt;
&lt;p&gt;希望这个简单的游戏能让人享受到片刻的昔日美好感觉,在百忙中重温儿时抱着手柄打游戏的快乐!&lt;/p&gt;
&lt;h2 id="下载"&gt;下载&lt;/h2&gt;
&lt;p&gt;※：游戏使用 libgdx 2016 版编写，因此运行需要 JDK 8 以上；此包为使用 2016 年源码重新编译打包的版本&lt;/p&gt;
&lt;p&gt;&lt;a href="https://lanzainc.xyz/files/game/lanzaAdv-desktop.jar"&gt;JAR 桌面包&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>