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 提供免费的试用版本,足以让你完成本教程。
- 访问官网: 打开浏览器,输入
yoyogames.com。 - 下载 GMS2: 找到下载按钮(通常在主页显眼位置),选择适合你操作系统的版本(Windows 或 macOS)。
- 安装软件: 运行下载的安装程序,按照提示一步步完成安装。默认设置通常是最佳选择。
- 登录或注册: 首次启动 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)
精灵是游戏中所有可见元素的图像表示。
- 打开资源浏览器: 在右侧找到
Sprites文件夹。 - 创建精灵: 右键点击
Sprites文件夹,选择Create->Sprite。 - 命名精灵: GMS2 建议为精灵添加
spr_前缀以便区分。例如:spr_player,spr_enemy,spr_bullet,spr_star,spr_explosion,spr_background。 - 编辑精灵图像:
- 双击你创建的精灵(例如
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)
对象是游戏中实际的“演员”,它们有行为、属性和交互能力。每个对象都至少关联一个精灵(除了管理对象)。
- 打开资源浏览器: 在右侧找到
Objects文件夹。 - 创建对象: 右键点击
Objects文件夹,选择Create->Object。 - 命名对象: GMS2 建议为对象添加
obj_前缀。例如:obj_player,obj_enemy,obj_bullet,obj_star,obj_explosion,obj_game_manager。 - 关联精灵: 双击你创建的对象(例如
obj_player)打开对象编辑器。在右侧的Sprite属性下拉菜单中,选择你刚刚创建的相应精灵(spr_player)。
按照上述步骤,创建所有你需要的对象,并将它们与各自的精灵关联:obj_player, obj_enemy, obj_bullet, obj_star, obj_explosion。
对于 obj_game_manager 这个对象,它不需要精灵,因为它将是一个“看不见”的对象,只负责游戏逻辑。在 Sprite 属性中保持 No Sprite 即可。
2.4 创建房间 (Rooms)
房间是游戏关卡或场景的实际布局。
- 打开资源浏览器: 在右侧找到
Rooms文件夹。 - 创建房间: 右键点击
Rooms文件夹,选择Create->Room。 - 命名房间: GMS2 建议为房间添加
rm_前缀。例如:rm_start,rm_game,rm_end。 - 设置房间属性:
- 双击
rm_game打开房间编辑器。 - 大小 (Size): 在
Properties窗格中,设置房间的宽度和高度。例如,Width: 720,Height: 1280(竖屏手游常用尺寸,或根据你的游戏需求调整)。 - 视图/摄像机 (Views/Cameras): 对于一个俯视角游戏,你可能希望摄像机跟随玩家或者固定在一个区域。我们将在
rm_game中设置一个简单的视图。- 在左侧的
Layer Editor中,确保你选择了Instances层。 - 在
Properties窗格中,展开Views选项。勾选Enable Views。 - 在
Viewports and Cameras下拉列表中,选择Viewport 0。 - 勾选
Visible。 Camera Properties:设置Width和Height与房间尺寸相同,例如720x1280。Viewport Properties:设置Width和Height与房间尺寸相同。Object Following:选择obj_player。Horizontal Border和Vertical Border可以设置为0,表示摄像机始终跟随玩家中心。
- 在左侧的
- 背景层: 在左侧的
Layer Editor中,点击Create New Background Layer按钮(看起来像一个背景图案图标)。命名为background_layer。将spr_background精灵拖拽到这个层上,并在Properties中勾选Tile Horizontally和Tile Vertically,这样背景就会自动平铺。如果你希望背景滚动,可以在obj_game_manager中编写代码。
- 双击
创建 rm_start 和 rm_end 房间,暂时可以保持默认设置,我们稍后会添加文本和按钮。
设置起始房间:
在资源浏览器中,确保 rm_start 是你列表中的第一个房间,或者在 Tools -> Game Options -> Main 中设置 First Room 为 rm_start。
第三章:赋予生命——编写游戏逻辑(GameMaker Language – GML 基础)
现在,我们已经有了游戏的基本框架。接下来,我们将为对象添加事件和动作,让它们动起来、交互起来。GameMaker Studio 2 提供了拖拽式的 GML Visual (以前称为 DnD – Drag and Drop),但为了更灵活和深入的学习,我们将主要使用 GameMaker Language (GML) 脚本。GML 是一种易于学习的类 C 语言。
3.1 玩家飞船 (obj_player) 的移动
让玩家飞船能够响应键盘输入并移动。
- 打开
obj_player对象编辑器。 - 添加
Create Event:- 点击
Add Event按钮,选择Create。 - 在代码编辑器中输入:
gml
// 玩家飞船的初始速度
move_speed = 5;
player_lives = 3; // 玩家的生命值
move_speed是一个自定义变量,用于控制飞船移动的速度。
- 点击
- 添加
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”)用于检测字母键。x
* **和y:** 内置变量,代表对象的当前坐标。clamp(value, min, max)
* **:** 将value限制在min和max之间。这确保玩家不会移出屏幕。room_width
* **和room_height:** 内置变量,代表当前房间的宽度和高度。sprite_width
* **和sprite_height`:** 内置变量,代表对象当前精灵的宽度和高度。
- 点击
现在,你可以在 rm_game 中拖入一个 obj_player 实例,然后点击工具栏上的绿色播放按钮(Run Game)测试一下。你的飞船应该能响应WASD或方向键移动了!
3.2 玩家飞船的射击 (obj_bullet)
让玩家能够发射子弹。
- 打开
obj_player对象编辑器。 -
添加
Key Press - SpaceEvent:- 点击
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.direction和bullet.speed: 我们直接设置了新创建的obj_bullet实例的direction和speed属性。在 GMS2 中,speed和direction是内置的移动变量。
- 点击
-
打开
obj_bullet对象编辑器。 -
添加
Create Event:- 点击
Add Event按钮,选择Create。 - 在代码编辑器中输入:
gml
// 子弹的初始速度和方向将由obj_player设置,
// 但这里可以设定一些默认值或者其他属性
// image_angle = direction; // 让子弹图像朝向移动方向 - 如果你希望子弹是简单的圆形或方形,可能不需要
image_angle。如果子弹精灵是长条形,设置image_angle = direction;会让它看起来更真实。
- 点击
-
添加
Outside Room Event:- 点击
Add Event按钮,选择Other->Outside Room。 - 在代码编辑器中输入:
gml
// 当子弹离开房间边界时销毁自身,避免无限存在
instance_destroy(); instance_destroy(): 销毁当前对象实例。
- 点击
再次运行游戏,现在你的飞船应该可以发射子弹了!
3.3 敌机 (obj_enemy) 的生成与移动
让敌机从上方随机位置出现,并向玩家移动。
- 打开
obj_enemy对象编辑器。 - 添加
Create Event:- 点击
Add Event按钮,选择Create。 - 在代码编辑器中输入:
gml
// 敌机移动速度
move_speed = 2;
- 点击
- 添加
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_player的x和y` 坐标。
- 点击
3.4 敌机的自动生成 (obj_game_manager)
我们需要一个对象来管理敌机的生成。
- 打开
obj_game_manager对象编辑器。 -
添加
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 秒。
- 点击
-
添加
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_height
* 我们将敌机生成在的y` 坐标,这样它就会从屏幕外一点点出现。
- 点击
现在将 obj_game_manager 实例拖入 rm_game 房间。运行游戏,敌机应该会不断出现了!
3.5 碰撞检测与分数系统
让子弹和敌机、玩家和敌机、玩家和星体之间产生交互。
- 打开
obj_bullet对象编辑器。 -
添加
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(): 创建爆炸效果。
- 点击
-
打开
obj_player对象编辑器。 -
添加
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()`:** 重新开始游戏。
* **
- 点击
-
打开
obj_player对象编辑器。 -
添加
Collision Event:- 点击
Add Event按钮,选择Collision->obj_star。 - 在代码编辑器中输入:
gml
// 玩家与星体碰撞时:
with (other) {
instance_destroy(); // 销毁星体
}
global.score += 50; // 增加更多分数
- 点击
-
打开
obj_explosion对象编辑器。 - 添加
Animation End Event:- 点击
Add Event按钮,选择Other->Animation->Animation End。 - 在代码编辑器中输入:
gml
// 爆炸动画播放结束后销毁自身
instance_destroy(); - 这要求你的
spr_explosion精灵必须是一个动画精灵(即有多帧)。你可以在精灵编辑器中添加多帧图像来制作一个简单的爆炸动画。
- 点击
3.6 星体的生成与分数显示 (obj_game_manager)
让星体也随机生成,并在屏幕上显示分数。
- 打开
obj_game_manager对象编辑器。 - 添加
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` 对象编辑器。**gml
5. **添加 `Create Event`:**
* 点击 `Add Event` 按钮,选择 `Create`。
* 在代码编辑器中输入:
// 星体下落速度
move_speed = 1;
6. **添加 `Step Event`:**gml
* 点击 `Add Event` 按钮,选择 `Step` -> `Step`。
* 在代码编辑器中输入:
// 星体向下移动
y += move_speed;// 如果星体离开房间边界,销毁自身
if (y > room_height + sprite_height) {
instance_destroy();
}
7. **添加 `Draw GUI Event` (显示分数和生命值):**gml
* 点击 `Add Event` 按钮,选择 `Draw` -> `Draw GUI`。
* `Draw GUI` 事件用于在屏幕的“顶部”绘制 HUD 元素,不受摄像机缩放或移动的影响。
* 在代码编辑器中输入:
// 设置字体和颜色
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)
让游戏有开始和结束的流程。
-
打开
rm_start房间编辑器。- 创建一个新的背景层,将
spr_background拖入并平铺。 - 创建一个
obj_start_menu对象(无精灵)。 obj_start_menu的Create Event:
gml
// 可以设置一些动画效果或者在这里初始化其他数据obj_start_menu的Draw 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_menu的Key Press - SpaceEvent:
gml
room_goto(rm_game); // 跳转到游戏房间- 将
obj_start_menu实例拖入rm_start房间。
- 创建一个新的背景层,将
-
打开
rm_end房间编辑器。- 创建一个新的背景层,将
spr_background拖入并平铺。 - 创建一个
obj_end_menu对象(无精灵)。 obj_end_menu的Create Event:
gml
// 存储最终分数,因为room_goto会销毁旧房间的实例
final_score = global.score;obj_end_menu的Draw 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_menu的Key Press - REvent:
gml
game_restart(); // 重新开始游戏- 将
obj_end_menu实例拖入rm_end房间。
- 创建一个新的背景层,将
-
修改
obj_player的游戏结束逻辑:- 在
obj_player的Collision with obj_enemy事件中,将game_restart();改为:
gml
room_goto(rm_end); // 跳转到结束房间 - 确保在
rm_game房间中拖入了obj_player和obj_game_manager的实例。
- 在
现在,你的游戏已经有了一个完整的循环:开始界面 -> 游戏界面 -> 结束界面。
第四章:锦上添花——音效与视觉优化
一个没有声音的游戏是没有灵魂的。为你的游戏添加一些音效和简单的视觉效果,将大大提升玩家体验。
4.1 添加音效 (Sounds)
- 准备音效文件: 你可以从免费音效库(如
freesound.org)下载.wav或.ogg格式的音效文件,例如:snd_shoot,snd_explosion,snd_collect_star,mus_background。 - 导入音效:
- 在资源浏览器中,右键点击
Sounds文件夹,选择Create->Sound。 - 双击新创建的声音资源,点击
...按钮导入你的音效文件。 - 为声音资源命名,例如
snd_shoot,snd_explosion等。对于背景音乐,勾选Loop。
- 在资源浏览器中,右键点击
- 在游戏中播放音效:
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_manager的Create Event中添加:
gml
audio_play_sound(mus_background, 10, true); // 播放背景音乐,循环播放 audio_play_sound(sound_id, priority, loop): 播放指定声音资源。priority决定在声音通道紧张时哪个声音被优先播放。loop为true则循环播放。
4.2 简单的视觉优化
- 精灵动画: 如果你的精灵有多个帧,GMS2 会自动播放动画。你可以调整精灵编辑器中的
Animation Speed。 - 粒子系统 (Particles): 粒子系统可以创建烟雾、火花、爆炸碎片等效果,极大地增强视觉表现力。它比本教程的范围略广,但在你掌握基础后,强烈建议学习。
- 背景滚动: 在
obj_game_manager的Step 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)
当你的游戏开发完成并测试无误后,你就可以将其打包发布了!
- 配置游戏选项:
- 在资源浏览器中找到
Game Options。 - 你可以设置游戏图标、启动画面、全屏模式、窗口大小等。
- 对于不同的平台(Windows、macOS、HTML5、Android、iOS等),GMS2 提供了各自的选项卡进行配置。
- 在资源浏览器中找到
- 选择目标平台:
- 在 GMS2 的顶部工具栏中,有一个下拉菜单,你可以选择
Windows、HTML5等目标平台。 - 请注意,某些平台需要特定的SDK或许可证才能导出。
- 在 GMS2 的顶部工具栏中,有一个下拉菜单,你可以选择
- 构建游戏:
- 点击工具栏上的
Create Executable按钮。GMS2 会编译你的游戏并生成一个可执行文件或安装包。 - 对于 Windows,它通常会生成一个
.exe文件。
- 点击工具栏上的
现在,你已经成功制作并打包了你的第一款游戏!你可以分享给朋友和家人,让他们体验你的创作。
结语:你的游戏开发之路才刚刚开始
恭喜你!你已经通过这个教程,成功从零开始制作了一款完整的游戏。这不仅是关于编写代码和制作图形,更是关于将你的想法变为现实,解决问题,以及体验创造的乐趣。
你学到了以下核心概念:
* 资源管理: 精灵、对象、房间、声音。
* 基本 GML 脚本: 变量、条件语句、事件、函数调用。
* 游戏核心机制: 玩家移动、射击、碰撞检测、计分。
* 游戏流程: 开始、游戏、结束界面。
* 优化与调试: 音效、背景滚动、排查问题。
这只是一个开始。GameMaker Studio 2 的世界远比你现在看到的要广阔和精彩。
下一步你可以做什么?
* 探索 GML: 深入学习 GML 文档,掌握更复杂的函数和数据结构。
* 更复杂的玩法: 添加更多种类的敌人、道具、关卡、Boss战。
* 粒子系统: 学习如何使用 GMS2 的粒子系统创建炫酷的视觉效果。
* UI/UX设计: 改进游戏的用户界面和用户体验。
* 物理引擎: 尝试制作平台跳跃游戏或模拟真实物理效果的游戏。
* 社区交流: 加入 YoYo Games 论坛、Discord 服务器,与其他开发者交流学习。
* 坚持与实践: 不断尝试新的想法,制作更多的小游戏。
游戏开发是一场马拉松,而不是短跑。每一次尝试,每一次失败,都是你成长的阶梯。保持热情,享受创造的过程,你的游戏开发之路将充满无限可能!祝你玩得开心,创作出更多精彩的游戏!