今天是VVVVVV发布十周年!
尽管也许从明天开始,严格来说,这款游戏于2010年1月11日格林尼治标准时间凌晨3点首次发布,经过漫长的一天,我消除了我发现的所有错误,
创建了最后一分钟的程序集,并尝试通过极其不可靠的Internet将所有内容缓慢上传到服务器不断破碎的化合物。 但我一直秉承“
明天直到你醒来才来 ”的座右铭,所以我认为真正的发行日期是1月10日<3
天哪,十年。
VVVVVV对我来说是如此重要,我什至不知道从哪里开始。 我想以一种特殊的方式标记这个日期,所以今天我要展示游戏的源代码!
[github上的VVVVVV源代码]该存储库包含两个版本-桌面版本(
由Simon Roth于2011年移植到C ++) ,第二个版本
由Ethan Lee更新和支持 ,以及基于ActionScript for Adobe AIR编写的移动版本(基于游戏v1.0的原始版本)。 。
我想对
Ethan Lee表示非常感谢,他为我提供了很多帮助,包括为社区准备存储库并在AGDQ上组织了这一发布(您好,速跑者!)! 谢谢伊桑!
源代码的简要概述
在这里提出一个问题是合乎逻辑的:
“ VVVVVV源代码中有什么有趣的?” 。
我认为,即使快速浏览一下源代码,您也可以很快理解,从技术上讲,对VVVVVV的游戏并不是很周全! 即使按照独立的自学开发人员的标准,代码也相当混乱。
可能有趣的注释/解释,为什么一切看起来都如此:
- C ++版本有很多奇怪的东西,只有当您记住游戏首先是在Flash上创建然后直接移植其所有缺陷的情况下,这些逻辑才变得合乎逻辑。 例如,我最糟糕的编程习惯可能是将诸如i,j和k之类的临时变量声明为每个类的成员,这样就不必在函数内部声明它们了(这是无聊的原因)。 至少可以说,这导致出现了一些令人讨厌且难以捕获的错误。 特别是,某些计算实体碰撞的函数具有一个公共变量i 。 因此,无限循环是可能的。
- 如果要查找游戏文本,则大多数(但不是全部)都在Scripts.cpp和TerminalScripts.cpp类中。 本质上,这些函数将数据加载到一个非常简单的脚本解析器中,该脚本解析器控制过场逻辑。 一个有趣的事实:很多年前,modders对这种“ 内部脚本 ”进行了逆向工程,以使用自制的关卡来完成令人惊奇的事情,我什至无法想象。
- 在开发过程中的某个时刻,我决定将代码分为输入,逻辑和渲染是一个好习惯,因此我深信不疑。 游戏关键代码的主要部分位于三个文件中: input.ccp , logic.cpp和错误命名的titlerender.cpp 。 游戏的每个状态都以Teleporterrender和towerlogic等功能名称打包到这三个文件中。 有很多复制粘贴。
- 所有级别都在我自己的文件编辑器中生成的巨大数组中进行了硬编码,该文件编辑器将这些级别导出到我可以读取的源代码中。 这就是我在2009年制作Flash游戏时的工作方式-访问外部数据资源是一项艰巨的任务,因此当时将它们编译到游戏本身中是更合逻辑的。 所有非常大的文件(例如Spacestation2.cpp,Finalclass.cpp等)都是以这种方式创建的。 为了完整起见,我在此处上传了编辑器代码,但老实说,它现在并不特别适用(需要Allegro和Mingw进行编译)。 为了更改最后一个级别的方案,我写了一个类似的工具!
- 当我编写代码时,我并不真正了解静态类如何工作以及为什么使用它们是一个好主意。 似乎我在某处读到静态类和全局变量在Flash中是BAD,所以我试图完全避免它们。 结果如何? 从字面上看,游戏中的每个函数都会传递以下参数: “ Graphics&dwgfx,Game&game,mapclass&map,entityclass&obj,UtilityClass&help” 。
- 实际上,VVVVVV中没有临时对象,并且在游戏的第一次初始化期间,它用数百个空实体填充了其所有实体数组(以及大多数其他数据数组)。 这样做是因为我在某处读到,删除Flash中的对象会导致奇怪的制动,因为垃圾收集器进入并减慢了所有操作,这在某种程度上是正确的。 直到最近,我一直在新项目中坚持这种奇怪的习惯-在Dicey Dungeons中,我终于放弃了它。
- 还有一件事情:除了过场分析器之外,我还有另一种方法来控制游戏逻辑:单片有限状态机,在项目结束时它完全失控了! 可以在Game :: updatestate中找到它,即使您不想阅读任何其他代码,我也建议您阅读它。 他负责管理诸如触发复杂过场动画的开始,传送器发送传送点,关卡完成动画定时以及我想快速加入游戏中的许多其他方面。 状态编号,最大的是4099(有未使用的数字)。 在开发游戏时,我旁边有一个记事本,上面写着最重要的数字:数字1000开始选择“闪亮的饰品”,数字3040开始完成一个特定级别,数字3500开始游戏结束。 这个愚蠢的系统在50.2秒内引起了任何%%类别的出色的Speedran游戏 。
不知道该怎么说? 我还很年轻,在屏幕上创建某些东西比正确实现它更有趣。 可能是最好的VVVVVV源代码-即使您不是一个非常好的程序员,它也证明了您可以自己创建一些东西。
回顾这些年来,我发现非常有趣的是,在大多数情况下,这都是对相同零件进行多次复制粘贴,并更改了值。 因此,十年后,几乎无法维护该代码,但是当我处于最稠密的状态时,我能够执行非常快速的迭代并添加新元素。 在过去的十年中,我养成了更好的习惯,而且作为一名程序员,我确实成长了很多,但是现在看来,由于这个原因,我的工作速度越来越慢。
周年惊喜派对!
在我准备发表该文章的同时,
Sergio Kornaga宣布了一场纪念VVVVVV十年的游戏!
VVVVVV的10岁生日eVVVVVVent!我对此感到
非常高兴,哈哈,而且我
喜欢现场光荣的火车残骸,该残骸经常发生每月的“ Klik of the Month”果酱,我在VVVVVV的开发期间一直参与其中。 这似乎是完美的果酱!
我真的很想知道在困境结束之后人们会想到什么,我将在博客上写一篇大型文章,总结
关于我曾经写过<3的
关于用户级别VVVVVV的旧
文章的样式
甚至在发布游戏源代码之前,我就免费开放了用于创建和完成VVVVVV级别的工具的2014版《
制作与游戏》 ! 您可以
从这里下载
! 如果您对在VVVVVV编辑器中创建关卡感兴趣,则可以从
本主题开始! 祝你好运
有点感伤
我已经谈到过VVVVVV是如何唤起我的-在第一周年纪念日之前,我写了游戏问世时的经历以及
它的成功如何改变了我的生活 。 在我成立五周年之际,我写道
VVVVVV在我看来是一生中仅发生一次的项目,而且在此之前或之后,没有任何事情能接近它。
十年后,我仍然有同样的感觉。 我为VVVVVV感到无比自豪,并对一切感到感谢。 我要感谢在前进道路上为我提供帮助的每个人-Magnus令人难以置信的配乐,Ethan和Simon所做的使公众可以使用该游戏的所有工作,Bennett的房间名称,Stephen协助在发行当天为Mac创建程序集。 这个游戏对我来说很特别,这要感谢所有玩过它并支持我十年的人。 对我来说意义重大。 <3