一、(译)使用“马里奥方法”设计游戏关卡

2024-01-31 09:50

本文主要是介绍一、(译)使用“马里奥方法”设计游戏关卡,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

译者序

《马里奥》的关卡设计历经多个系列的积淀和发展,已经达到了同类游戏无法企及的高度。关于《马里奥》关卡设计方法的论述和研究,无论是通过开发者采访还是研究者解构游戏反推,目前游戏业界已有不少相关文章。然而很多设计师依然没能从这个长寿的游戏系列中汲取到养分,大量粗制滥造的Platformer关卡设计就是证据。这里翻译的这篇文章利用一个完整的游戏关卡实例深入浅出地讲解了“马里奥方法”的核心概念,是我看过的最佳相关教材。

作者序

几年前,我写了一本书专门分析《超级马里奥世界》中的每一个关卡(1990),书中我阐释了每一个游戏关卡在设计时所遵循的系统方法。《超级马里奥世界》是值得学习的一代经典,但从中习得的知识却可以广泛地应用于各类游戏设计领域。”马里奥关卡设计法“,或者说”任天堂关卡设计法“实际上存在于大量游戏之中——甚至是那些并非任天堂开发的游戏。

本教程中,我们将一睹自90年代起便不断在进化的优雅关卡设计方法。随着游戏设计师(特别是任天堂的设计师)对于他们的技艺日臻成熟,他们排布关卡内容的方法也日趋直观。在此,我将为你讲解如何在自己的游戏中使用这些直观的关卡设计方法。

我的范例

我使用”马里奥方法“搭建了一个《超级马里奥制造》关卡用于教学,视频如下:

width="100%" height="400" src="http://player.youku.com/embed/XMTQxOTIzODExMg==" frameborder="0" allowfullscreen="" style="box-sizing: border-box;">

关卡ID:0740-0000-00CD-4D5B

挑战,韵律,技巧主题

我们将要学习的关卡设计法的全名是”挑战,韵律,技巧主题“(Challenge, Cadence, Skill-Theme),简称CCST。为了方便起见我将使用《超级马里奥制造》中的关卡来讲解CCST方法的核心思想。不过我在《洛克人》、《银河战士》、《传送门》、《半条命》、《超级食肉男孩》等很多其他游戏中也看到了CCST方法的运用。通过实践,你也可以在自己钟爱的某些游戏中洞悉到CCST的存在,并将其运用于自己的游戏之中,更好的组织关卡内容并为游戏增加深度。

挑战

首先需要定义并理解什么是”挑战“。

一个挑战是指被 安全边界包围的、玩家必须 一次性完成的、一小段 任务

下图展示了一个挑战:马里奥必须跳到悬崖上方的移动平台上然后跳下来。


在移动平台的左右两侧,玩家可以安全地驻足等待,不过一旦跳上移动平台,玩家就必须格外小心以防坠落悬崖损命——因此,这个挑战开始、结束于移动平台左右两侧安全而稳固的地面。

让我们再看一个更复杂些的例子:我为接下来的挑战增加了一个不同类型的移动平台(纵向移动平台)。对于这个挑战,安全的边界依然是两侧的固定地面,但这一回玩家必须跳过两个不同类型的移动平台才能再次抵达安全地带。


虽然这个挑战的内容更多、难度更大,但它依然是一个挑战,因为玩家必须一次性跳过两个移动平台才能抵达右侧的挑战安全边界

挑战有时可以做得很庞大,但你必须牢记一个挑战一定会被安全(相对的)边界所隔开,在这些安全边界区域中玩家可以稍作”休息“以应对下次挑战。挑战和安全边界在不同的游戏中也会有所不同,例如在《索尼克》中某些挑战要比《马里奥》长很多,因为索尼克移动速度极快,需要更长的距离来减速、急停、变相。即便如此,挑战的概念在这里依然是一致的。

为关卡填充挑战

仅仅知道挑战为何物是远远不够的,优秀的设计师知道如何将他们填充到关卡中。关卡应该逐渐变难,否则就会让人感到无聊。然而设计师决不能将各种挑战杂乱无章地散落在关卡之中——挑战与挑战之间的关系应该连贯而清晰,因此我们需要学习不同类型的挑战以及他们彼此之间的关系。

进化(Evolutions)

我们先来看看上文展示的两个挑战之间具有怎样的联系:

这两个挑战有何不同?他们都是基于移动平台的挑战,只是第二个挑战增加了一些新内容:两个不同类型的移动平台,沿着不同的运动轨迹,依照不同的节奏同时移动。所有这些新增的复杂度均来自”类型“或”方式“的改变。


如果两个挑战的区别来自于新增的” 质变类“元素,我们就将后面这个挑战定义为前者的”进化“。挑战2是挑战1” “上的迭代与提升( 质变)。

我们再看一个进化的例子:


这一次我在两个移动平台之间增加了一个上下移动的电锯。这使得复杂度再一次得到了“质”的提升,使得玩家更难找到合适的跳跃时机。

在复杂度方面这显然不是一个多大的飞跃。任天堂的游戏通常会一小步一小步地提高游戏难度:在一个高难度关卡的结尾,逐渐堆砌起来的进化最终创造出最难的挑战,但是这个过程总是通过一次次小幅度进化完成的。

增量(Expansions)

还有另一种方法可以在遵循关卡核心设计思路的前提下增加挑战难度。在下图展示的挑战中我重新迭代了挑战1,但加入了一处显著的变化:


我增加了固定地面和移动平台之间的距离。由于马里奥的跳跃距离增加了,跳跃的难度也得以略微提高。这就是我所说的增量挑战。

增量是指在上一个挑战的基础上进行某些“ ”上的增加。

如上例所示,两个平台之间的距离被增加至3倍。让我们再看一个例子:


这个挑战和此前第二个“进化”挑战很像,只是我将两个移动平台之间的电锯数量加倍了。由于安全的跳跃时机进一步减少跳跃难度再次提高——不过这些改变均来自简单的“量变”——电锯从1个变成2个。

增量挑战很容易实现,因为设计师只需增加挑战中已经存在的元素。也正因如此,经验不足的设计师经常会过度使用增量挑战(关于这一点我们会在另一篇教程中做进一步讨论)。

进化,增量,重置

在为你的关卡添加进化增量类挑战之前,还有几条设计方法值得一提。

首先,《马里奥》的游戏关卡不会沿着一个方向持续进化,而是经常“重置”回初始状态,再从另一个方向重新开始进化过程。

如下图所示:


我的关卡并未沿着循环移动平台的方向一直增加复杂度,而是中途转向了另一个方向。在这个挑战中,移动平台进化成了单向线性移动平台,马里奥不再需要想方设法跳到另一个平台上,而是要在平台前进的过程中躲避敌人。

虽然运用的技巧是相同的——在恰当的时机跳跃——但这是一个全新的进化方向。在后续的几个挑战中,我们将沿着这个方向持续进化每一个挑战。

接下来的挑战延续了线性移动的点子:


不难发现在这个挑战中我同时使用了“进化”和“增量”。下沉的移动路线属于“质变”,而中间平台上方更多数量的敌人则属于“量变“。因此这个挑战即是一个进化也是一个增量。

在《超级马里奥世界》中,同时进化和增量的挑战和仅在单方面变化的挑战几乎一样常见。

最后,我的关卡结束于这个挑战,在这里我加入了最初的循环移动平台元素:


这是一个惯用的策略——两个不同的进化分支最终在关卡结束时会和。在我的关卡中,循环移动平台和线性移动平台共同构成了最后的高潮挑战。

韵律

现在,我想回到关于“韵律”的定义上来。

韵律是指关卡中所有挑战之间的联系和组合方式。

为了更直观的讲解这个概念,我给我制作的关卡画了一张韵律图:


如你所见,关卡可以分解为两条支线,我称之为“叉子”韵律,然后在终点汇合。

在《超级马里奥世界》和其他任天堂游戏中,我们可以看到各式各样的韵律:


在其他开发者开发的游戏中可以看到更多种类的韵律。韵律结构并不会在关卡设计中束缚你的创意,恰恰相反,韵律带来的限制反而可以更大限度地激发你的创意。

CCST框架只是辅助设计师将他们的关卡内容变得更有条理、更加连贯的工具。“进化”和“增量”理论上可以应用于任何游戏的任何游戏机制。韵律可以辅助理解关卡背后内在的设计模式。

结语

尽管我将上述理论称为我的研究成果,可实际上本文所讨论的所有东西(还有接下来将会讨论的)都浑然天成地融入在了传统游戏之中。理论与实践同样重要,关卡设计没有通用的良方,带上CCST框架,希望它可以帮到你。

原文链接:http://gamedevelopment.tutsplus.com/articles/how-to-design-levels-with-the-super-mario-world-method--cms-25177

这篇关于一、(译)使用“马里奥方法”设计游戏关卡的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/663357

相关文章

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb