I Wanna Edition
I wanna be the Engine Nikaple Edition
镜像备份!!!!!!
一个完整的 I Wanna 衍生游戏制作框架。
引擎功能
- 多人联机支持
- 多语言支持
- 集中管理的音乐系统
- 方便的调试功能
- 快捷的内置聊天室
- 更友好的错误信息
- ……
联机
如何禁用
在脚本 setGlobals 中,将设置 global.game_mode = MODE_SINGLE_PLAYER 即可。(默认不禁用)
……
音乐
果引擎使用了 Super Sound 音乐系统,在它的支持下,你可以从外部读取声音文件,并且可以暂停与继续播放音乐(这是 GM 自带函数所做不到的)。
Super Sound 支持的音乐格式仅限 ogg 与 wav,推荐使用 ogg 格式( wav 格式的音乐占用空间太大)。因此,在使用音乐前需要将其转换为 ogg 格式,这可以借助 狸窝全能视频转换器 或 在线转码网站 来完成。
音乐播放主要涉及到两个脚本: music_init 与 music_config ,它们都在Scripts -> audio文件夹下。
music_init用来从外部文件夹中读取音乐至游戏中;music_config会在各个房间刚开始时调用一次,决定各个房间中需要播放的音乐。
音乐的存放位置可以通过
setGlobalsMinor中的global.music_directory设置,默认为Data/Music
升级到 2.0
在果引擎升级到 2.0 版之后,播放音乐的脚本名称更加统一了:
1 | // 音乐与音效均可以使用 music_play 播放 |
房间音乐的设置方法
以下两种方法任选其一,同时使用时分房间设置的 BGM 会覆盖集中设置的 BGM。在果引擎中, /Data/Music 目录下的所有音乐都会被默认自动加载,并将其 id 以全局变量名 BGM_文件名 储存。因此在制作游戏的过程中,最好不要使用 BGM_ 开头的变量名,否则很可能发生冲突。音乐加载具体说明如下:
Death.ogg会被自动读取为BGM_Death;faQ.ogg会被自动读取为BGM_faQ;myMusic.ogg会被自动读取为BGM_myMusic。
注意,由于 GM 引擎限制,自动加载的音乐名称均只由 0-9, A-Z, a-z, 下划线”_” 构成,如果文件名中含有其他字符,需要手动调用
music_load函数加载。
分房间设置(新手推荐)
在房间中放入 objPlayMusic (位于 rooms 文件夹下)并设置相关参数即可,如果你想将音乐文件夹中的 faQ.ogg 设置为当前房间的 BGM,则:
Creation Code 参数:
1 | // 当前房间的 BGM |
由于此处的 BGM_faQ 为全局变量,而不是 GM 中的资源名,所以在 GM 中呈现的是变量的颜色(黑色),这并不影响音乐文件的正常播放。
集中设置
在
music_config中,仿照示例增加代码播放音乐,例如:1
2
3
4
5// add your code here
case myRoom:
music_play(BGM_myMusic);
break;
// ...注意后面的
break不可省略!
对音乐进行骚操作
如果你需要暂停、跳转播放、区域循环等高级功能,可以对需要使用高级功能的音乐使用非流模式加载。即:
1 | globalvar BGM_myMusic; |
之后,便可以使用 SS_SetSoundPosition 等函数对 BGM_myMusic 进行处理而不受缓冲区大小限制。
BOSS 房间的 BGM 处理
在 BOSS 房间中,你可能想要自己控制 BGM 播放的时机。可以按照下面的方法设置:
先找到脚本
isBossRoom,并设定相关房间为 BOSS 房(参照脚本即可)。在你需要播放 BOSS 战音乐时,调用:
1 | music_play(myMusic); |
如果需要在流式播放模式下将某首音乐设置为非流式播放,可以在
music_init的 最下方 加上BGM_myMusic = music_load('myMusic', false)(将 myMusic 更换为音乐文件的名称)即可。
另外,在默认设置下,BOSS 房间中不可暂停。如果需要允许暂停,可以到
setGlobalsMinor脚本中修改global.enable_pause_in_boss_room = true即可。
Creation Code
如何使用 Creation Code
在引擎中,大量存在着通用 object,它们通过放置在房间之后的 Creation Code 来实现差异化功能。具体使用方法为:
打开房间编辑器,将
object摆放到房间中根据 GameMaker 版本的不同,添加 Creation Code 的方式也不同
- GameMaker 8.0:
Ctrl + 右键 -> Creation Code... - GameMaker 8.1:
右键 -> Creation Code...
- GameMaker 8.0:
果引擎中的 Creation Code 规范
Creation Code 中,存在着许多通用代码,记住它们将能帮助你更快更好地使用引擎,归类如下:
1 | --------------- 通用 --------------- |
触发系统
触发是 I Wanna 中各种坑实现的基础。果引擎 2.0 版重写了触发系统以提高运行时效率,使用起来几乎与原来一致。
简介
触发系统主要包含两种 object:触发器与触发对象,它们通过 触发事件 联系到一起。该系统的运作方式可概括为下图:
触发器指一类会响应
player动作的object,它可以在某种条件下发出带有一定标记(trg)的触发事件。包括:- 隐形的
trigger,当player与之相碰撞时,发出触发事件; - 延时的
trigger,当player与之相碰撞之后,过一段时间再发出触发事件; - 可见的
button,当player射击击中时,发出触发事件; - …
- 隐形的
触发对象是一类可以响应
触发事件的object,包括:- 在触发后会运动的刺
- 在触发后会运动的板子
- 在触发后会被创建的隐形砖
- 在触发后会做任何动作的任意
object
trg 与 key 一体化
在之前的版本中,keyTrigger 经常用于回头坑,因为它在指定 trg 的 freeTrigger 触发之前不会对 player 的任何动作作出反应。而在 2.0 版中,freeTrigger 与 keyTrigger 合并为了 objTrigger。objTrigger 的使用方法与 freeTrigger 完全一致。并且,当在 Creation Code 中指定 key 时,即可当做 keyTrigger 使用。
普通 objTrigger:
1 | trg = 1 |
当作 keyTrigger 使用:
1 | trg = 2 |
为了更方便地调试触发机关,在调试模式下 objTrigger 会有一些额外的处理。
playerKiller 均可被触发?
这也是果引擎 2.0 版中触发系统最明显的变化。你可以将任意 playerKiller 放置在房间中,然后使用 trg 使其触发。支持 4 种模式:
- 速度
- 路径
- 缩放
- 旋转
速度模式
触发之后会以指定速度运动。有两种触发方式:
横向/纵向速度触发:
Creation Code 参数:
1
2
3
4
5
6// 必填,触发器编号
trg = 1
// 可选,横向速度
h = 4
// 可选,纵向速度
v = 4速度/方向触发:
Creation Code 参数:
1
2
3
4
5
6// 必填,触发器编号
trg = 1
// 必填,速度
spd = 6
// 可选,方向,默认向右
dir = 45
路径模式
触发之后会沿着给定路径运动。
Creation Code 参数:
1 | // 必填,触发器编号 |
缩放模式
触发之后会参照指定中心进行放大/缩小。公共参数如下:
Creation Code:
1 | // 必填,触发器编号 |
其中,origin 的值为 1 - 9,分别对应精灵的左上角,中上,右上角……见下:
1 | 1 2 3 |
触发方式有两种:
缩放时间触发:
Creation Code 参数:
1
2// 必填,缩放到目标缩放量所需要的时间(帧)
time = 50x, y 缩放速度触发:
Creation Code 参数:
1
2
3// xsp 与 ysp 不能都为空
xsp = 0.04 // 触发之后 x 方向的缩放速度
ysp = 0.04 // 触发之后 y 方向的缩放速度
对于这几个参数的额外说明:
假设你需要将某刺在 1 秒内缩放到原来的 3 倍大小,那么 tarx,tary 的值均为 3。
- 对于缩放时间方式,time = 50;
- 对于缩放速度方式,xsp 与 ysp 的值均为:(3 – 1) / 50 = 0.04。
旋转模式
触发之后会沿着指定中心旋转一定角度。
Creation Code 参数:
1 | // 必填,触发器编号 |
其中,origin 的值为 1 - 9,分别对应精灵的左上角,中上,右上角……见下:
1 | 1 2 3 |
?> 当 playerKiller 被直接摆放在房间外时,引擎会自动设置 noDes = true,确保它能被正确地创建。
时序触发器
该 object 可以在 Objects -> triggers -> objSequenceTrigger 找到。用于触发一些按特定顺序出现的坑。
应用场景举例:
player 碰到时直接触发 trg = 1 的触发事件,1 秒之后触发 trg = 2的触发事件
1 | trg[1] = 1 |
player 碰到时不触发任何事件,1 秒之后触发 trg = 1 的触发事件,3 秒之后触发 trg = 2 的触发事件:
1 | trg[1] = 9999 |
调试模式以及报错
当游戏以调试模式运行时,objTrigger 会显示当前的 trg 以及 key 以便观察:
当 objTrigger 等 object 的 Creation Code 中没有 trg ,或者 trg 为 0 时,引擎会捕捉到这类错误并抛出一个错误,如:

此时在位于 rOnlineSpike (384, 480) 处的 objTrigger 的 Creation Code 中补充必要的参数即可。