Game Maker教程:从零开始制作你的第一款游戏 – wiki基地


GameMaker Studio 2 教程:从零开始制作你的第一款游戏

你是否曾梦想过制作自己的视频游戏?将脑海中的奇思妙想变为屏幕上跃动的像素或模型,让玩家沉浸在你创造的世界里?如果答案是肯定的,那么你来对地方了。本教程将带领你踏上一段激动人心的旅程,使用强大的 GameMaker Studio 2 (GMS2) 软件,从零开始,一步步制作出你的第一款游戏。

无需编程基础,无需美术天赋,只需要一颗充满好奇和创造力的心。GameMaker Studio 2 以其友好的界面和强大的功能,成为独立游戏开发者和初学者的首选工具之一。它能让你专注于游戏玩法的核心乐趣,而不是被复杂的底层代码所困扰。

我们将一起制作一款经典的俯视角街机射击游戏,类似于早期的“小蜜蜂”或“太空侵略者”,但会加入一些现代元素和我们自己的创意。通过这个项目,你将学习到游戏开发的核心概念,包括精灵(Sprites)、对象(Objects)、房间(Rooms)、事件(Events)、动作(Actions)以及一些基础的GameMaker Language (GML) 脚本编写。

准备好了吗?让我们开始这段奇妙的创作之旅!

第一章:踏入游戏开发世界——GameMaker Studio 2 的安装与初探

1.1 下载与安装 GameMaker Studio 2

首先,你需要访问 GameMaker Studio 2 的官方网站(yoyogames.com)下载并安装软件。GMS2 提供免费的试用版本,足以让你完成本教程。

  1. 访问官网: 打开浏览器,输入 yoyogames.com
  2. 下载 GMS2: 找到下载按钮(通常在主页显眼位置),选择适合你操作系统的版本(Windows 或 macOS)。
  3. 安装软件: 运行下载的安装程序,按照提示一步步完成安装。默认设置通常是最佳选择。
  4. 登录或注册: 首次启动 GMS2 时,你需要登录你的 YoYo Games 账户。如果没有,可以免费注册一个。这是为了管理你的许可证和访问社区。

1.2 熟悉 GameMaker Studio 2 的工作界面

成功启动 GMS2 后,你将看到一个简洁而强大的开发环境。让我们快速浏览一下它的主要组成部分:

  • 起始页 (Start Page): 这是你打开 GMS2 后看到的第一个界面,可以创建新项目、打开现有项目、访问教程、新闻和社区。
  • 资源浏览器 (Asset Browser): 位于界面的右侧(通常)。这是你管理项目中所有资源的地方,包括精灵(Sprites)、声音(Sounds)、对象(Objects)、房间(Rooms)等。它是你游戏内容的“仓库”。
  • 工作区 (Workspace): 占据界面大部分区域,是你的主要工作画布。当你打开精灵编辑器、对象编辑器或房间编辑器时,它们都会在这里显示。
  • 输出窗口 (Output Window): 通常在底部,显示编译信息、调试消息和错误提示。在测试游戏时,它是你排查问题的重要帮手。
  • 检查器 (Inspector): 位于界面左侧(通常)。当你选中某个资源或编辑器中的元素时,它的属性会在这里显示并供你修改。
  • 工具栏 (Toolbar): 顶部区域,包含各种快捷按钮,如运行游戏、调试游戏、保存项目等。

创建一个新项目:
在起始页,点击 New -> New Project。选择 GameMaker Language (GML),然后为你的项目命名,比如 MyFirstSpaceShooter,并选择一个保存路径。点击 Let's Go!,你就进入了全新的开发界面。

第二章:构建游戏骨架——资源创建与基础规划

在开始编写代码之前,我们需要为游戏准备一些最基本的“砖块”。我们将制作一款名为“星际清道夫”的俯视角射击游戏:玩家驾驶飞船,在太空中收集能量星体,同时躲避并摧毁来袭的敌机。

2.1 规划你的游戏元素

一个简单的游戏,也需要基本的规划。我们需要以下这些元素:

  • 玩家飞船: 玩家控制的主角。
  • 敌机: 从屏幕上方出现,向玩家移动。
  • 玩家子弹: 玩家飞船发射的炮弹。
  • 能量星体: 玩家收集以获取分数。
  • 爆炸效果: 飞船或敌机被摧毁时的视觉反馈。
  • 背景: 宇宙星空。
  • 游戏管理器: 一个看不见的对象,用来管理游戏逻辑,如计分、生成敌人等。
  • 游戏房间: 实际的游戏场景。
  • 开始/结束房间: 游戏开始前的欢迎界面和游戏结束后的结算界面。

2.2 创建精灵 (Sprites)

精灵是游戏中所有可见元素的图像表示。

  1. 打开资源浏览器: 在右侧找到 Sprites 文件夹。
  2. 创建精灵: 右键点击 Sprites 文件夹,选择 Create -> Sprite
  3. 命名精灵: GMS2 建议为精灵添加 spr_ 前缀以便区分。例如:spr_player, spr_enemy, spr_bullet, spr_star, spr_explosion, spr_background
  4. 编辑精灵图像:
    • 双击你创建的精灵(例如 spr_player)打开精灵编辑器。
    • 点击 Edit Image 按钮。这将打开内置的图像编辑器。
    • 制作像素图: 对于初学者,简单的像素图是最容易上手的。使用画笔工具,选择颜色,画出你的飞船、敌机、子弹和星体。保持它们的大小相对较小(例如 32×32 像素或 16×16 像素)。
    • 设置原点 (Origin): 在精灵编辑器中,Origin 决定了精灵的“中心点”或“锚点”。通常设置为 Middle Center 对大多数对象来说是最好的选择,因为它会使旋转和定位更加自然。
    • 碰撞遮罩 (Collision Mask): GMS2 会自动生成一个碰撞遮罩。对于简单的矩形或圆形精灵,默认设置通常足够。如果你的精灵形状不规则,可以手动调整。

按照上述步骤,创建所有你需要的精灵:spr_player, spr_enemy, spr_bullet, spr_star, spr_explosion。对于 spr_background,你可以创建一个更大的精灵,例如 256×256 或 512×512,画上一些星星和星云。

2.3 创建对象 (Objects)

对象是游戏中实际的“演员”,它们有行为、属性和交互能力。每个对象都至少关联一个精灵(除了管理对象)。

  1. 打开资源浏览器: 在右侧找到 Objects 文件夹。
  2. 创建对象: 右键点击 Objects 文件夹,选择 Create -> Object
  3. 命名对象: GMS2 建议为对象添加 obj_ 前缀。例如:obj_player, obj_enemy, obj_bullet, obj_star, obj_explosion, obj_game_manager
  4. 关联精灵: 双击你创建的对象(例如 obj_player)打开对象编辑器。在右侧的 Sprite 属性下拉菜单中,选择你刚刚创建的相应精灵(spr_player)。

按照上述步骤,创建所有你需要的对象,并将它们与各自的精灵关联:obj_player, obj_enemy, obj_bullet, obj_star, obj_explosion

对于 obj_game_manager 这个对象,它不需要精灵,因为它将是一个“看不见”的对象,只负责游戏逻辑。在 Sprite 属性中保持 No Sprite 即可。

2.4 创建房间 (Rooms)

房间是游戏关卡或场景的实际布局。

  1. 打开资源浏览器: 在右侧找到 Rooms 文件夹。
  2. 创建房间: 右键点击 Rooms 文件夹,选择 Create -> Room
  3. 命名房间: GMS2 建议为房间添加 rm_ 前缀。例如:rm_start, rm_game, rm_end
  4. 设置房间属性:
    • 双击 rm_game 打开房间编辑器。
    • 大小 (Size):Properties 窗格中,设置房间的宽度和高度。例如,Width: 720Height: 1280 (竖屏手游常用尺寸,或根据你的游戏需求调整)。
    • 视图/摄像机 (Views/Cameras): 对于一个俯视角游戏,你可能希望摄像机跟随玩家或者固定在一个区域。我们将在 rm_game 中设置一个简单的视图。
      • 在左侧的 Layer Editor 中,确保你选择了 Instances 层。
      • Properties 窗格中,展开 Views 选项。勾选 Enable Views
      • Viewports and Cameras 下拉列表中,选择 Viewport 0
      • 勾选 Visible
      • Camera Properties:设置 WidthHeight 与房间尺寸相同,例如 720x1280
      • Viewport Properties:设置 WidthHeight 与房间尺寸相同。
      • Object Following:选择 obj_playerHorizontal BorderVertical Border 可以设置为0,表示摄像机始终跟随玩家中心。
    • 背景层: 在左侧的 Layer Editor 中,点击 Create New Background Layer 按钮(看起来像一个背景图案图标)。命名为 background_layer。将 spr_background 精灵拖拽到这个层上,并在 Properties 中勾选 Tile HorizontallyTile Vertically,这样背景就会自动平铺。如果你希望背景滚动,可以在 obj_game_manager 中编写代码。

创建 rm_startrm_end 房间,暂时可以保持默认设置,我们稍后会添加文本和按钮。

设置起始房间:
在资源浏览器中,确保 rm_start 是你列表中的第一个房间,或者在 Tools -> Game Options -> Main 中设置 First Roomrm_start

第三章:赋予生命——编写游戏逻辑(GameMaker Language – GML 基础)

现在,我们已经有了游戏的基本框架。接下来,我们将为对象添加事件和动作,让它们动起来、交互起来。GameMaker Studio 2 提供了拖拽式的 GML Visual (以前称为 DnD – Drag and Drop),但为了更灵活和深入的学习,我们将主要使用 GameMaker Language (GML) 脚本。GML 是一种易于学习的类 C 语言。

3.1 玩家飞船 (obj_player) 的移动

让玩家飞船能够响应键盘输入并移动。

  1. 打开 obj_player 对象编辑器。
  2. 添加 Create Event
    • 点击 Add Event 按钮,选择 Create
    • 在代码编辑器中输入:
      gml
      // 玩家飞船的初始速度
      move_speed = 5;
      player_lives = 3; // 玩家的生命值

      move_speed 是一个自定义变量,用于控制飞船移动的速度。
  3. 添加 Step Event
    • 点击 Add Event 按钮,选择 Step -> Step
    • Step Event 每帧执行一次,是处理游戏逻辑的核心。
    • 在代码编辑器中输入:
      “`gml
      // 玩家输入
      key_left = keyboard_check(vk_left) || keyboard_check(ord(“A”));
      key_right = keyboard_check(vk_right) || keyboard_check(ord(“D”));
      key_up = keyboard_check(vk_up) || keyboard_check(ord(“W”));
      key_down = keyboard_check(vk_down) || keyboard_check(ord(“S”));

      // 计算水平和垂直移动方向
      var h_move = key_right – key_left; // 向右为1,向左为-1
      var v_move = key_down – key_up; // 向下为1,向上为-1

      // 更新玩家位置
      x += h_move * move_speed;
      y += v_move * move_speed;

      // 限制玩家在房间边界内移动
      x = clamp(x, 0, room_width – sprite_width);
      y = clamp(y, 0, room_height – sprite_height);
      ``
      * **
      keyboard_check():** 检测键盘按键是否被按下。vk_left等是虚拟键码,ord(“A”)用于检测字母键。
      * **
      xy:** 内置变量,代表对象的当前坐标。
      * **
      clamp(value, min, max):** 将value限制在minmax之间。这确保玩家不会移出屏幕。
      * **
      room_widthroom_height:** 内置变量,代表当前房间的宽度和高度。
      * **
      sprite_widthsprite_height`:** 内置变量,代表对象当前精灵的宽度和高度。

现在,你可以在 rm_game 中拖入一个 obj_player 实例,然后点击工具栏上的绿色播放按钮(Run Game)测试一下。你的飞船应该能响应WASD或方向键移动了!

3.2 玩家飞船的射击 (obj_bullet)

让玩家能够发射子弹。

  1. 打开 obj_player 对象编辑器。
  2. 添加 Key Press - Space Event:

    • 点击 Add Event 按钮,选择 Keyboard -> Key Press -> Space
    • 在代码编辑器中输入:
      gml
      // 创建一个子弹实例
      var bullet = instance_create_layer(x, y, "Instances", obj_bullet);
      // 设置子弹的移动方向(向上)和速度
      bullet.direction = 270; // 270度是向上
      bullet.speed = 10;
    • instance_create_layer(x, y, layer_name, object) 在指定图层上创建对象实例。"Instances" 是 GMS2 默认的对象实例层。
    • bullet.directionbullet.speed 我们直接设置了新创建的 obj_bullet 实例的 directionspeed 属性。在 GMS2 中,speeddirection 是内置的移动变量。
  3. 打开 obj_bullet 对象编辑器。

  4. 添加 Create Event

    • 点击 Add Event 按钮,选择 Create
    • 在代码编辑器中输入:
      gml
      // 子弹的初始速度和方向将由obj_player设置,
      // 但这里可以设定一些默认值或者其他属性
      // image_angle = direction; // 让子弹图像朝向移动方向
    • 如果你希望子弹是简单的圆形或方形,可能不需要 image_angle。如果子弹精灵是长条形,设置 image_angle = direction; 会让它看起来更真实。
  5. 添加 Outside Room Event

    • 点击 Add Event 按钮,选择 Other -> Outside Room
    • 在代码编辑器中输入:
      gml
      // 当子弹离开房间边界时销毁自身,避免无限存在
      instance_destroy();
    • instance_destroy() 销毁当前对象实例。

再次运行游戏,现在你的飞船应该可以发射子弹了!

3.3 敌机 (obj_enemy) 的生成与移动

让敌机从上方随机位置出现,并向玩家移动。

  1. 打开 obj_enemy 对象编辑器。
  2. 添加 Create Event
    • 点击 Add Event 按钮,选择 Create
    • 在代码编辑器中输入:
      gml
      // 敌机移动速度
      move_speed = 2;
  3. 添加 Step Event
    • 点击 Add Event 按钮,选择 Step -> Step
    • 在代码编辑器中输入:
      “`gml
      // 敌机向玩家移动
      // 使用move_towards_point()函数可以简单地实现追逐行为
      move_towards_point(obj_player.x, obj_player.y, move_speed);

      // 如果敌机移动到屏幕底部,也销毁它(或者扣除玩家生命)
      if (y > room_height + sprite_height)
      {
      instance_destroy();
      // 也可以在这里扣除玩家生命或惩罚分数
      // obj_player.player_lives -= 1;
      }
      ``
      * **
      move_towards_point(x_target, y_target, speed):** 让当前实例以指定速度向目标点移动。这里目标点是obj_playerxy` 坐标。

3.4 敌机的自动生成 (obj_game_manager)

我们需要一个对象来管理敌机的生成。

  1. 打开 obj_game_manager 对象编辑器。
  2. 添加 Create Event

    • 点击 Add Event 按钮,选择 Create
    • 在代码编辑器中输入:
      gml
      // 初始化全局分数
      global.score = 0;
      // 设置一个警报,用于定期生成敌人
      alarm[0] = room_speed * 3; // 3秒后触发alarm[0]
    • global.score global 关键字用于创建全局变量,可以在任何对象中访问和修改。
    • alarm[0] GMS2 提供了 12 个警报事件 (alarm[0] 到 alarm[11])。你可以设置一个警报在一定帧数后触发一次。room_speed 是每秒的帧数(通常为60)。所以 room_speed * 3 就是 3 秒。
  3. 添加 Alarm 0 Event

    • 点击 Add Event 按钮,选择 Alarm -> Alarm 0
    • 在代码编辑器中输入:
      “`gml
      // 在房间顶部随机X坐标生成一个敌机
      instance_create_layer(random_range(0, room_width), -sprite_height, “Instances”, obj_enemy);

      // 重新设置警报,以便继续生成敌机
      alarm[0] = room_speed * irandom_range(2, 4); // 每2到4秒生成一个新敌机
      ``
      * **
      random_range(min, max):** 生成一个指定范围内的浮点随机数。
      * **
      irandom_range(min, max):** 生成一个指定范围内的整数随机数。
      * 我们将敌机生成在
      -sprite_heighty` 坐标,这样它就会从屏幕外一点点出现。

现在将 obj_game_manager 实例拖入 rm_game 房间。运行游戏,敌机应该会不断出现了!

3.5 碰撞检测与分数系统

让子弹和敌机、玩家和敌机、玩家和星体之间产生交互。

  1. 打开 obj_bullet 对象编辑器。
  2. 添加 Collision Event

    • 点击 Add Event 按钮,选择 Collision -> obj_enemy
    • 在代码编辑器中输入:
      gml
      // 子弹销毁敌机时:
      // 销毁敌机(other代表与当前对象碰撞的对象)
      with (other) {
      instance_create_layer(x, y, "Instances", obj_explosion); // 创建爆炸效果
      instance_destroy(); // 销毁敌机
      }
      // 销毁子弹自身
      instance_destroy();
      // 增加分数
      global.score += 10;
    • with (other) 这是一个非常有用的 GML 结构,它允许你在碰撞发生时,执行代码来操作与当前对象发生碰撞的那个对象 (other)。
    • instance_create_layer() 创建爆炸效果。
  3. 打开 obj_player 对象编辑器。

  4. 添加 Collision Event

    • 点击 Add Event 按钮,选择 Collision -> obj_enemy
    • 在代码编辑器中输入:
      “`gml
      // 玩家与敌机碰撞时:
      player_lives -= 1; // 减少生命值
      instance_create_layer(x, y, “Instances”, obj_explosion); // 创建爆炸效果
      with (other) {
      instance_destroy(); // 销毁敌机
      }

      // 如果生命值耗尽,游戏结束
      if (player_lives <= 0) {
      game_restart(); // 重新开始游戏 (或者跳转到结束界面)
      } else {
      // 玩家闪烁或短暂无敌等效果
      // 比如,将玩家位置重置到屏幕底部中央,并短暂隐藏或改变alpha
      x = room_width / 2;
      y = room_height – sprite_height * 2;
      // image_alpha = 0.5; // 半透明
      // alarm[1] = room_speed * 2; // 2秒后恢复正常
      }
      ``
      * **
      game_restart()`:** 重新开始游戏。

  5. 打开 obj_player 对象编辑器。

  6. 添加 Collision Event

    • 点击 Add Event 按钮,选择 Collision -> obj_star
    • 在代码编辑器中输入:
      gml
      // 玩家与星体碰撞时:
      with (other) {
      instance_destroy(); // 销毁星体
      }
      global.score += 50; // 增加更多分数
  7. 打开 obj_explosion 对象编辑器。

  8. 添加 Animation End Event
    • 点击 Add Event 按钮,选择 Other -> Animation -> Animation End
    • 在代码编辑器中输入:
      gml
      // 爆炸动画播放结束后销毁自身
      instance_destroy();
    • 这要求你的 spr_explosion 精灵必须是一个动画精灵(即有多帧)。你可以在精灵编辑器中添加多帧图像来制作一个简单的爆炸动画。

3.6 星体的生成与分数显示 (obj_game_manager)

让星体也随机生成,并在屏幕上显示分数。

  1. 打开 obj_game_manager 对象编辑器。
  2. 添加 Alarm 1 Event (用于生成星体):
    • 点击 Add Event 按钮,选择 Alarm -> Alarm 1
    • 在代码编辑器中输入:
      “`gml
      // 在房间顶部随机X坐标生成一个星体
      instance_create_layer(random_range(0, room_width), -sprite_height, “Instances”, obj_star);

      // 重新设置警报,以便继续生成星体
      alarm[1] = room_speed * irandom_range(3, 7); // 每3到7秒生成一个新星体
      3. **在 `obj_game_manager` 的 `Create Event` 中添加:**gml
      alarm[1] = room_speed * 5; // 5秒后首次生成星体
      4. **打开 `obj_star` 对象编辑器。**
      5. **添加 `Create Event`:**
      * 点击 `Add Event` 按钮,选择 `Create`。
      * 在代码编辑器中输入:
      gml
      // 星体下落速度
      move_speed = 1;
      6. **添加 `Step Event`:**
      * 点击 `Add Event` 按钮,选择 `Step` -> `Step`。
      * 在代码编辑器中输入:
      gml
      // 星体向下移动
      y += move_speed;

      // 如果星体离开房间边界,销毁自身
      if (y > room_height + sprite_height) {
      instance_destroy();
      }
      7. **添加 `Draw GUI Event` (显示分数和生命值):**
      * 点击 `Add Event` 按钮,选择 `Draw` -> `Draw GUI`。
      * `Draw GUI` 事件用于在屏幕的“顶部”绘制 HUD 元素,不受摄像机缩放或移动的影响。
      * 在代码编辑器中输入:
      gml
      // 设置字体和颜色
      draw_set_halign(fa_left); // 左对齐
      draw_set_valign(fa_top); // 顶对齐
      draw_set_colour(c_white); // 白色
      draw_set_font(font_default); // 可以创建自定义字体,这里使用默认

      // 绘制分数
      draw_text(10, 10, “Score: ” + string(global.score));

      // 绘制生命值
      // 确保obj_player存在,否则会报错
      if (instance_exists(obj_player)) {
      draw_text(10, 40, “Lives: ” + string(obj_player.player_lives));
      }
      ``
      * **
      draw_text(x, y, text_string):** 在指定位置绘制文本。
      * **
      string(value):** 将数值转换为字符串,以便与文本连接。
      * **
      instance_exists(object)`:** 检查指定对象是否存在实例。

3.7 开始与结束房间 (rm_start, rm_end)

让游戏有开始和结束的流程。

  1. 打开 rm_start 房间编辑器。

    • 创建一个新的背景层,将 spr_background 拖入并平铺。
    • 创建一个 obj_start_menu 对象(无精灵)。
    • obj_start_menuCreate Event
      gml
      // 可以设置一些动画效果或者在这里初始化其他数据
    • obj_start_menuDraw GUI Event
      gml
      draw_set_halign(fa_center);
      draw_set_valign(fa_middle);
      draw_set_colour(c_yellow);
      draw_text(room_width / 2, room_height / 2 - 50, "星际清道夫");
      draw_set_colour(c_white);
      draw_text(room_width / 2, room_height / 2 + 50, "按下空格开始游戏");
    • obj_start_menuKey Press - Space Event:
      gml
      room_goto(rm_game); // 跳转到游戏房间
    • obj_start_menu 实例拖入 rm_start 房间。
  2. 打开 rm_end 房间编辑器。

    • 创建一个新的背景层,将 spr_background 拖入并平铺。
    • 创建一个 obj_end_menu 对象(无精灵)。
    • obj_end_menuCreate Event
      gml
      // 存储最终分数,因为room_goto会销毁旧房间的实例
      final_score = global.score;
    • obj_end_menuDraw GUI Event
      gml
      draw_set_halign(fa_center);
      draw_set_valign(fa_middle);
      draw_set_colour(c_red);
      draw_text(room_width / 2, room_height / 2 - 100, "GAME OVER!");
      draw_set_colour(c_white);
      draw_text(room_width / 2, room_height / 2 - 20, "你的分数: " + string(final_score));
      draw_text(room_width / 2, room_height / 2 + 50, "按下R键重新开始");
    • obj_end_menuKey Press - R Event:
      gml
      game_restart(); // 重新开始游戏
    • obj_end_menu 实例拖入 rm_end 房间。
  3. 修改 obj_player 的游戏结束逻辑:

    • obj_playerCollision with obj_enemy 事件中,将 game_restart(); 改为:
      gml
      room_goto(rm_end); // 跳转到结束房间
    • 确保在 rm_game 房间中拖入了 obj_playerobj_game_manager 的实例。

现在,你的游戏已经有了一个完整的循环:开始界面 -> 游戏界面 -> 结束界面。

第四章:锦上添花——音效与视觉优化

一个没有声音的游戏是没有灵魂的。为你的游戏添加一些音效和简单的视觉效果,将大大提升玩家体验。

4.1 添加音效 (Sounds)

  1. 准备音效文件: 你可以从免费音效库(如 freesound.org)下载 .wav.ogg 格式的音效文件,例如:snd_shoot, snd_explosion, snd_collect_star, mus_background
  2. 导入音效:
    • 在资源浏览器中,右键点击 Sounds 文件夹,选择 Create -> Sound
    • 双击新创建的声音资源,点击 ... 按钮导入你的音效文件。
    • 为声音资源命名,例如 snd_shoot, snd_explosion 等。对于背景音乐,勾选 Loop
  3. 在游戏中播放音效:
    • obj_player 射击时:Key Press - Space 事件中添加:
      gml
      audio_play_sound(snd_shoot, 10, false); // 播放射击音效,优先级10,不循环
    • obj_bullet 销毁 obj_enemy 时:Collision with obj_enemy 事件中添加:
      gml
      audio_play_sound(snd_explosion, 10, false); // 播放爆炸音效
    • obj_player 收集 obj_star 时:Collision with obj_star 事件中添加:
      gml
      audio_play_sound(snd_collect_star, 10, false); // 播放收集音效
    • 背景音乐:obj_game_managerCreate Event 中添加:
      gml
      audio_play_sound(mus_background, 10, true); // 播放背景音乐,循环播放
    • audio_play_sound(sound_id, priority, loop) 播放指定声音资源。priority 决定在声音通道紧张时哪个声音被优先播放。looptrue 则循环播放。

4.2 简单的视觉优化

  • 精灵动画: 如果你的精灵有多个帧,GMS2 会自动播放动画。你可以调整精灵编辑器中的 Animation Speed
  • 粒子系统 (Particles): 粒子系统可以创建烟雾、火花、爆炸碎片等效果,极大地增强视觉表现力。它比本教程的范围略广,但在你掌握基础后,强烈建议学习。
  • 背景滚动:obj_game_managerStep Event 中,你可以让背景图层滚动,制造飞船前进的错觉:
    “`gml
    // 获取背景图层ID
    var bg_layer_id = layer_get_id(“background_layer”);
    if (bg_layer_id != -1) { // 确保图层存在
    // 向下滚动背景
    layer_x(bg_layer_id, layer_get_x(bg_layer_id)); // x不滚动
    layer_y(bg_layer_id, layer_get_y(bg_layer_id) + 1); // y向下滚动1像素

    // 如果背景滚动到底部,重置位置实现无缝循环
    if (layer_get_y(bg_layer_id) >= room_height) {
        layer_y(bg_layer_id, 0); // 或者从-room_height开始
    }
    

    }
    ``
    请确保你的
    spr_background` 是一个可以无缝平铺或循环的图像。

第五章:测试、调试与发布

5.1 测试你的游戏

在开发过程中,频繁测试是至关重要的。每次添加新功能或修改代码后,都应该运行游戏进行测试,确保一切按预期工作。

  • 点击工具栏上的 Run Game 按钮。
  • 尝试各种操作,检查是否有 Bug。

5.2 调试技巧

当游戏出现问题时,GMS2 提供了强大的调试工具。

  • 输出窗口: 编译错误和运行时错误会显示在这里。仔细阅读错误信息,它会告诉你问题出在哪里。
  • show_debug_message() 在 GML 代码中插入 show_debug_message("变量x的值是:" + string(x)); 可以在输出窗口中打印变量的值,帮助你追踪问题。
  • 断点 (Breakpoints): 在 GML 代码编辑器中,点击行号旁边的空白区域可以设置断点。当你运行 Debug Game 时,游戏会在断点处暂停,你可以逐步执行代码,并查看所有变量的值。

5.3 导出你的游戏 (Build)

当你的游戏开发完成并测试无误后,你就可以将其打包发布了!

  1. 配置游戏选项:
    • 在资源浏览器中找到 Game Options
    • 你可以设置游戏图标、启动画面、全屏模式、窗口大小等。
    • 对于不同的平台(Windows、macOS、HTML5、Android、iOS等),GMS2 提供了各自的选项卡进行配置。
  2. 选择目标平台:
    • 在 GMS2 的顶部工具栏中,有一个下拉菜单,你可以选择 WindowsHTML5 等目标平台。
    • 请注意,某些平台需要特定的SDK或许可证才能导出。
  3. 构建游戏:
    • 点击工具栏上的 Create Executable 按钮。GMS2 会编译你的游戏并生成一个可执行文件或安装包。
    • 对于 Windows,它通常会生成一个 .exe 文件。

现在,你已经成功制作并打包了你的第一款游戏!你可以分享给朋友和家人,让他们体验你的创作。

结语:你的游戏开发之路才刚刚开始

恭喜你!你已经通过这个教程,成功从零开始制作了一款完整的游戏。这不仅是关于编写代码和制作图形,更是关于将你的想法变为现实,解决问题,以及体验创造的乐趣。

你学到了以下核心概念:
* 资源管理: 精灵、对象、房间、声音。
* 基本 GML 脚本: 变量、条件语句、事件、函数调用。
* 游戏核心机制: 玩家移动、射击、碰撞检测、计分。
* 游戏流程: 开始、游戏、结束界面。
* 优化与调试: 音效、背景滚动、排查问题。

这只是一个开始。GameMaker Studio 2 的世界远比你现在看到的要广阔和精彩。

下一步你可以做什么?
* 探索 GML: 深入学习 GML 文档,掌握更复杂的函数和数据结构。
* 更复杂的玩法: 添加更多种类的敌人、道具、关卡、Boss战。
* 粒子系统: 学习如何使用 GMS2 的粒子系统创建炫酷的视觉效果。
* UI/UX设计: 改进游戏的用户界面和用户体验。
* 物理引擎: 尝试制作平台跳跃游戏或模拟真实物理效果的游戏。
* 社区交流: 加入 YoYo Games 论坛、Discord 服务器,与其他开发者交流学习。
* 坚持与实践: 不断尝试新的想法,制作更多的小游戏。

游戏开发是一场马拉松,而不是短跑。每一次尝试,每一次失败,都是你成长的阶梯。保持热情,享受创造的过程,你的游戏开发之路将充满无限可能!祝你玩得开心,创作出更多精彩的游戏!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部