跳转到内容

游戏制作编程/难题

来自 Wikibooks,开放世界中的开放书籍

此模块的目的是让更多经验丰富的游戏制作学生能够写下他们如何解决特定问题,以便那些可能正在努力解决相同(或类似)问题的人从中受益。

难题并不一定是指高级主题。它们可以是任何让你花费很长时间才能弄清楚的东西,无论该功能或操作是基本还是高级。

请贡献

如果游戏制作或 GML 中的某些东西让你困惑了一段时间,为什么不在这里写出来呢?

How do you make objects fall(in a platform game)in a way so that they rotate when they collide onto another object?

结构

与所有维基教科书一样,此模块的结构无疑会随着时间的推移而发展。经验表明,人们在被给予一个样本结构来遵循时,通常会做得更好,并且有自由发明他们想要的任何结构。随着时间的推移,用户会将任何页面的结构修改为最适合他们的结构。为了帮助,这里有一个样本结构,供难题遵循

我试图做什么
什么不起作用

什么有效

如前所述,您可以自由使用任何适合您的结构。

概念

这不是旨在重写游戏制作手册。但有一些难题是新手(和经验丰富的)程序员会遇到的。这里应该描述一些令人困惑或难以理解的概念。

行话

对象和实例

使用游戏制作创建的程序(游戏)是按照“面向对象编程”的原理设计的。

面向对象设计的三个支柱是多态性、封装和继承,这些是另一个维基页面的主题。但是,所有这些想法都是通过将复杂程序的设计组织成“对象”的想法而实现的。从一个对象中,该对象的实例被创建并根据该对象定义的方法和属性使用。

简单地说,对象基本上是创建实例的模板。例如,你在玩游戏时在屏幕上看到的东西是这些对象的“实例”。

可以将对象视为创建实例的模板或食谱。在一般的面向对象编程中,对象具有方法和属性。方法是对象可以执行的动作。如果我们的对象是一辆汽车,它将具有以下方法

  * Start
  * Speed up
  * Slow Down
  * Turn left
  * Turn Right
  * Back up

每个方法都将附带一个方法定义,详细说明对象执行该动作所需的步骤。

对象的属性只是对象的描述。例如

  * Color
  * Size
  * Year
  * Make
  * Model

汽车的对象定义

因此,当我们定义“汽车”对象时,我们会说,“让一个类型为‘汽车’的对象存在。每辆汽车都有自己的颜色、尺寸、年份、制造商和型号。此外,每辆汽车都可以启动、加速、减速、左转、右转和倒车”。

创建“汽车”对象的实例

这里我们开始在我们的世界中使用该对象。要创建一个汽车的实例,我们会说,“给我一辆汽车。这辆汽车将是红色的,这辆汽车的尺寸很小,是 1982 年的。将这辆汽车的制造商命名为‘mycarcompany’,将这辆汽车的型号命名为‘SuperSpeedy’”。

我们会得到一辆具有给定描述的汽车,并且现在已经生成了一个“汽车”对象的实例。由于所有汽车都是从汽车对象创建的,因此这辆汽车还将具有预定义的启动、加速、减速、右转、左转和倒车的功能,这些功能在“汽车”对象(模板)中定义。

现在我们可以说,“给我一辆汽车。这辆汽车将是蓝色的,这辆汽车的尺寸很大,是 2010 年的。将这辆汽车的制造商命名为‘SuperCompany’,将这辆汽车的型号命名为‘FasterCarNumberOne’”。

此时,我们将拥有两个“汽车”对象的实例。术语“实例”源于我们正在实例化“汽车”对象。

另一种说法是从制作汽车的食谱(对象)中,我们创建(实例化)了两辆汽车;现在我们拥有两个“汽车”对象的实例。

高级:每个实例在创建时都会被赋予自己的实例 ID。使用实例的唯一 ID 使设计者能够直接引用对象的特定实例,例如,当创建了许多实例并且希望引用其中的一个而不是所有从对象创建的实例时。

动作或事件?

在游戏制作程序中,事件显示在对象属性框的中心。动作被拖放到对象的事件中。

事件实际上是传递给游戏中的对象实例的消息。每当事件发生时,你放置在事件中的动作就会被执行。这会产生对象实例的行为。

常见问题

游戏制作程序问题

本节将讨论人们在学习使用游戏制作时遇到的某些问题。错误消息也可能在本节中讨论。

我的电脑死机、卡住或冻结

  1. 你在任何地方使用while语句了吗?
    While语句是导致系统挂起的一个常见原因。如果 while 循环没有结束(无限循环),则计算机将冻结。

我点击对象属性中的图标,但没有任何反应

  1. 对象属性菜单右侧的图标旨在拖放到事件中。
  2. 右键点击图标也会将其添加到事件中。

对象问题

对象卡住

很多时候,移动对象会卡在墙壁或其他静止对象上。

  1. 对于移动项目,将“solid”标志设置为false
  2. 对于静止项目,将“solid”标志设置为true
  3. (平台游戏专用)对于与墙壁发生碰撞事件的移动对象,检查移动对象的正下方是否有对象(墙壁),如果有,将 vspeed 设置为零。
  4. (平台游戏专用)现在检查移动对象的正左侧是否有对象(墙壁),如果有,将 hspeed 设置为零,如果移动对象的右侧有对象(墙壁),执行相同的操作。

对象掉出地板

移动项目不应设置为 solid。问题是非 solid 对象往往会掉出地板,或者有时会穿过墙壁,而你并不希望它们这样做。

  1. 创建一个非透明精灵,其大小与对象相同或略小。
  2. 在对象属性框中,转到“蒙版”并选择该精灵。

对象出现在房间的左上角

  1. 确保对象的“相对”标志设置为true

变量问题

字符串和数字

每当我想要显示消息、连接字符串或添加变量时,都会收到“参数类型与 + 不匹配”的消息。

  1. 确保你在“设置变量”对话框中没有将字符串添加到数字,反之亦然。

步进事件问题

步进事件中的任何内容都将在每一步发生。所以要小心你放在里面的东西。

请勿将以下内容放在步进事件中(或者如果你这样做,请非常小心...)

  • 时间线
  • 绘制精灵
  • 声音
  • 创建实例

为了避免在步进事件中使用以下操作而可能发生的错误,您可能需要添加一个随机动作。如果您在使用以下动作进行测试时没有采取预防措施,可能会导致游戏延迟。如果延迟严重,可能会导致您的电脑崩溃。

绘图问题

物体不可见

可能发生的情况:当您创建一个新物体时,Game Maker 会绘制您选择的用来代表该物体的精灵。但是,无论何时您在物体中添加绘制事件,您在绘制事件中添加的任何动作都会覆盖该物体的正常绘制。

  1. 确保“可见”标志设置为 *true*。
  2. “绘制精灵”动作必须位于“绘制事件”中。
    或者
  3. “绘制事件”中的脚本必须包含以下函数:
    draw_sprite(sprite_index,image_single,x,y)

文本不可见

  1. 绘制文本的第一条规则
    您只能在两个地方放置绘制动作。
    * 绘制事件(绘制动作在其他地方会被 *忽略*)
    * 脚本(但不能是“执行一段代码”动作,它也必须位于绘制事件中)
  1. 绘制文本的第二条规则
    仅当实例被标记为可见时才会绘制

鼠标和键盘问题

  1. 左键、左键按下和左键释放之间的区别是什么?
    **左键** - 动作 *持续进行*,只要按钮被按下。
    **左键按下** - 仅发生 *一次*。
    **左键释放** - 当按钮被释放时仅发生一次。
  2. 当我点击鼠标结束游戏时,它经常(或总是)会激活我 Windows 桌面上的一些东西。
    将您的 *结束游戏* 操作设置为由鼠标按钮 *释放* 激活。这样一来,当您的游戏关闭时,您的点击不会传递到桌面。
  3. 我想使用我的鼠标在右键点击屏幕上的任何地方时执行一些操作,但没有反应!
    确保您将鼠标点击事件设置为 *全局鼠标*。

如果一个网站从 *问题解决* 的角度(而不是教程等)来处理 Game Maker 问题,请添加链接。

华夏公益教科书