在本文中,我们将从 gamemaker Studio 粒子系统的基础知识开始,以高级技术和实现结束。将此视为速成课程,让您熟悉并熟悉 GameMaker Studio 最强大的内置功能之一。演示和可下载的项目文件将允许您按照文章了解粒子系统的全部内容。
如何学习如何学习 GameMaker:Jacob Ford 工作室
粒子系统概述
GameMaker Studio 粒子系统是一种为您的游戏项目创建华丽效果的廉价且简单的方法。通过粒子和发射器的组合,您可以快速创建令人印象深刻的爆炸、烟雾、鲜血、弹片和无数其他效果。使用单个物体也可以实现类似的效果,但内置粒子效果系统的计算成本要便宜得多。
要在您的项目中使用粒子系统,您需要了解 GML(GameMaker 语言),但是一旦您熟悉了粒子系统,这只是填空和实验的问题。
查看下面的演示,看看我们可以实现什么:
粒子系统基础
GameMaker Studio 中的粒子系统由三部分组成:系统本身、粒子和发射器。您可以创建多个系统,每个系统可以包含多个粒子和发射器。将系统想象成一个容器,其中定义了粒子和发射器。
在 GameMaker Studio 中实现粒子效果是一个四步过程。
首先,您必须定义粒子系统本身。
然后,您定义将在该系统中使用的实际粒子。
接下来,您必须定义将创建您定义的粒子的发射器。
最后,您必须确定粒子发射器出现在游戏中的时间和位置。
为了教您 GameMaker Studio 粒子系统的基础知识,我们将从创建这个非常简单的绿色粒子效果开始。
创建粒子系统
创建粒子系统就像定义一个变量一样简单。我们创建一个名为的对象obj_first_particle
,并将以下代码放在对象的 Create 事件中:
FirstParticleSystem = part_system_create();
粒子系统将采用定义系统的对象的深度值,但您也可以使用 GML 单独设置深度:
part_system_depth(FirstParticleSystem,0);
请记住,具有高深度值的对象和粒子系统首先被绘制到屏幕上。深度为 时0
,我们的绿色粒子系统将出现在深度大于的对象上方0
,并出现在深度小于的对象下方0
。
粒子系统以相对于的基本位置绘制到屏幕上(0,0)
。如果出于某种原因你想为这个粒子系统的所有未来位置创建一个偏移量,你可以使用下面的代码来创建一个新的基础位置(ind
粒子系统在哪里):
part_system_position(ind, x, y);
将新的基本位置设置为(10,10)
,将创建的粒子(25,25)
改为绘制到(35,35)
。很少需要更改粒子系统的基本位置,但您可能会发现它在您的特定项目中很有用。
创建粒子类型
现在系统已经设置好了,是时候定义发射器将创建的实际粒子了。粒子可以包含大量参数,这些参数决定了粒子的外观和行为方式。第一步是为粒子创建一个变量,我们在对象的Create
情况下这样做obj_first_particle
:
first_particle = part_type_create();
接下来,我们开始定义粒子的各个参数。由于我们不打算在运行时更改此粒子,因此我们可以将所有这些代码放在对象的Create
事件中obj_first_particle
。
part_type_shape
确定粒子的基本形状。GameMaker Studio 中有 14 种默认粒子形状,您也可以定义自己的形状。我们将在下面的高级部分中介绍这一点,但现在让我们从一个基本的正方形开始。
part_type_shape(first_particle,pt_shape_square);
有关可用默认形状的完整列表,请查看官方 GameMaker 文档。
使用part_type_scale
,我们可以设置粒子形状的基本 X 和 Y 比例值。由于我们想要一个完美的方形,我们使用以下代码:
part_type_scale(first_particle,1,1);
part_type_size
允许我们在创建时以及随时间改变粒子的大小。此代码的格式为part_type_size(ind, size_min, size_max, size_incr, size_wiggle)
.
ind
是粒子变量。size_min
并size_max
确定首次创建时的粒径范围。如果您想要一个统一的大小,只需为最小值和最大值输入相同的值。size_incr
是一个允许粒子随时间增长或收缩的值。这个值决定了增长的速度,所以如果你不希望你的精灵改变大小,你可以使用0
.size_wiggle
稍微复杂一些,所以我们将在下面的高级技术部分中介绍。
这是我们的绿色粒子效果中使用的粒子大小代码:
part_type_size(first_particle,0.10,0.15,-.001,0);
粒子将以介于0.10
和之间的大小0.15
创建以创建变化,并且精灵将以-0.001
. 此速度值很大程度上取决于您的房间速度,因此您可能需要尝试使用这些值以获得所需的结果。我们不会使用任何大小摆动,因此我们将值设置为0
。
GameMaker Studio 中的粒子实际上可以随时间改变颜色。这是通过part_type_color2
和实现的part_type_color3
。如果你不希望你的精灵改变颜色,那么你可以使用part_type_color1
. 对于我们的绿色粒子效果,我们希望它以明亮的黄色/绿色开始,然后变为纯绿色,因此我们使用part_type_color2
:
part_type_color2(first_particle,8454143,65280);
我选择的两种颜色是我经常使用的特定数值,但是如果你想使用更传统的十六进制值,你可以使用格式$RRGGBB
。
随着时间的推移,粒子也可以变得或多或少透明part_type_alpha2
和part_type_alpha3
。如果您想要一致的 alpha 值,请使用part_type_alpha1
. 对于我们的绿色粒子效果,我们希望粒子开始时完全不透明,并在它停留在屏幕上时淡化 25%,因此我们需要两个 alpha 值:
part_type_alpha2(first_particle,1,0.75);
在 GameMaker 中,alpha 是从 0 到 1 的值。完全不可见的对象的 alpha 值为 0,而完全不透明的对象的 alpha 值为 1。
粒子速度就像粒子大小一样被确定。粒子是在一系列速度值范围内创建的,并且该值可以增加或减少。这段代码的格式是part_type_speed(ind, speed_min, speed_max, speed_incr, speed_wiggle)
,其中ind
是粒子变量,speed_min
是speed_max
速度范围,speed_incr
是粒子速度变化的速率,speed_wiggle
是我们稍后会介绍的参数。
我们的绿色粒子的速度代码是:
part_type_speed(first_particle,0.1,0.5,0,0);
我们的粒子将以介于0.1
和之间的速度值开始移动0.5
。这个速度将保持不变,所以我们使用 的值0
,并且我们不会再实现速度摆动,所以我们使用 的值0
。
虽然粒子的速度参数决定了它移动的速度,但方向参数决定了它移动的位置。方向代码的格式如下:part_type_direction(ind, dir_min, dir_max, dir_incr, dir_wiggle)
我们再次设置变量、起始范围、增量值和摆动值。对于绿色粒子效果,我们希望我们的粒子开始向任何方向移动,并且我们希望该方向保持不变:
part_type_direction(first_particle,0,359,0,0);
0 到 359 的范围确保粒子有机会向任何方向(0 到 359 度之间的角度)移动。如果您想要一个粒子向上移动并且只向上移动,那么您将使用 90 到 90 的范围)。
我们的粒子效果的引力是最有趣的。虽然我们的速度和方向参数设置为创建一个粒子,该粒子首先以恒定速度向一个方向移动,但重力参数会随着时间的推移而改变粒子。使用 的格式part_type_gravity(ind, grav_amount, grav_direction)
,重力参数非常简单:
part_type_gravity(first_particle,0.02,90);
通过在向上的方向(90 度)施加 0.02 的轻微引力,我们可以创建一个看起来漂浮的粒子。结合我们的尺寸和 alpha 参数,随着时间的推移,粒子会随着重力升力而收缩并变得更加透明。
粒子形状的方向对效果的外观也很重要,因此我们使用part_type_orientation(ind, ang_min, ang_max, ang_incr, ang_wiggle, ang_relative)
随时间旋转正方形。
ind
是粒子变量。ang_min
并ang_max
确定形状旋转值的起始值。ang_incr
用于随时间增加或减少形状的方向。ang_relative
是一个布尔值,用于确定是否应相对于粒子的运动(真)或不(假)设置方向。
我们希望我们的绿色粒子稍微向左旋转,所以我们使用以下代码:
part_type_orientation(first_particle,0,359,10,0,true);
粒子最重要的参数之一是寿命值。该值决定了将粒子绘制到屏幕上的最小和最大时间。使用两个相同的最小值和最大值,该类型的所有粒子将存在相同的时间。我们希望我们的绿色粒子具有多样性,因此我们将使用 100 到 150 的范围作为寿命值:
part_type_life(first_particle,100,150);
粒子的最后一个参数是一个简单的布尔值,用于确定粒子是否应该与加法混合效果混合在一起:
part_type_blend(first_particle,true);
创建粒子发射器
定义发射器的第一步是创建一个变量。我们在对象的 Create 事件中定义了这个发射器obj_first_particle
。
first_emitter = part_emitter_create(FirstParticleSystem);
接下来,我们用 定义发射极区域part_emitter_region(ps, ind, xmin, xmax, ymin, ymax, shape, distribution)
。
ps
是发射器所属的粒子系统,是发射ind
器变量。x 和 y 的最小值和最大值决定了发射极区域的大小。
shape
确定发射区的形状 (ps_shape_rectangle, ps_shape_ellipse, ps_shape_diamond, ps_shap_line
)。distribution
是分布曲线 (ps_dist_linear, ps_distr_gaussian, ps_distr_invgaussian
)。
我们将在高级技术部分更详细地介绍形状和分布参数。现在,我们将使用默认的椭圆形状和高斯分布值:
part_emitter_region(FirstParticleSystem, first_emitter, x-20, x+20, y-20, y+20, ps_shape_ellipse, ps_distr_gaussian);
此代码创建一个椭圆发射器区域,该区域高 40 像素,宽 40 像素,并以obj_first_particle
对象的 x 和 y 值为中心。由发射器创建的粒子将出现在这个定义的区域内。
激活粒子发射器
下一步是确定两种发射器类型之一:Burst 或 Stream。Burst 发射器在触发时会创建指定数量的特定粒子。流发射器每一步都会创建指定数量的特定粒子。
我们将在高级技术部分了解更多功能的 Burst 发射器,所以现在让我们只使用 Stream 发射器:
part_emitter_stream(FirstParticleSystem,first_emitter,first_particle,1);
我们将此代码放在对象的Create
事件中obj_first_particle
,从而在创建对象后,发射器每一步都会创建一个粒子。房间速度为 30 时,我们的发射器每秒会产生 30 个粒子;要每秒创建 60 个粒子,您只需使用值2
代替1
。
至此,我们简单的绿色粒子效果就完成了!此效果的用处有限,但在深入了解 GameMaker Studio 粒子系统的更复杂方面之前,重要的是要从小处着手。一旦您了解了粒子系统的基础知识,您就可以开始实现更高级的粒子系统。
高级粒子系统技术
粒子摆动
Wiggle 是一个简单但功能强大的参数,可以彻底改变粒子的外观。wiggle 参数导致粒子在粒子生命周期的最小值和最大值之间振荡。该值可以介于0
和之间,20
并确定摆动的速度。
0.40
嵌入式演示中的“Fire Bubble”示例在参数中使用了 wiggle 值part_type_size
:
part_type_size(fire_bubble_part,0.25,0.75,-0.01,0.40);
突发发射器和移动物体
粒子系统最常见的实现之一涉及从移动物体后面发出的粒子,例如火箭上的烟雾轨迹。在 GameMaker Studio 中实现此效果需要将 Burst 发射器放置在对象的Step
事件中。
包含的示例使用与以前相同的绿色粒子系统,但发射器略有修改。不是在对象的事件中触发 Stream 发射器,而是在对象的Create
事件中放置一个 Burst 发射器Step
。将鼠标光标的当前位置与光标的先前位置进行检查,如果光标位置发生变化,则触发 Burst 发射器以释放五个粒子:
x = mouse_x; y = mouse_y; part_emitter_region(MouseParticle,green_mouse_emitter,x,x,y,y,0,0); if x != old_x || old_y != y { part_emitter_burst(MouseParticle,green_mouse_emitter,green_mouse_particle,5); } old_x = x; old_y = y;
发射器区域形状
通过使用不同的发射器形状和分布曲线,您可以创建截然不同的效果。线性曲线分布与线形粒子发射器相结合,可以创造出令人信服的降雨效果。
part_emitter_region(RainParticle,rain_emitter,-100,room_width,y,y,ps_shape_line,ps_distr_linear);
发射器形状由从房间原点左侧 100 像素开始并延伸到房间宽度的线定义。使用线性分布曲线将雨粒子均匀地分布在整个发射器区域。part_system_update
在事件中用于将雨粒子推进几个步骤也很有用Create
。这段代码给人的印象是在你加载房间之前正在下雨,即使粒子系统还不存在于内存中。
repeat (room_speed * 3) { part_system_update(RainParticle); }
粒子系统步骤和死亡效果
系统中的单个粒子也可以在事件Step
上产生其他粒子。Death
该示例显示了一个紫色火花粒子,当它向右移动时会产生较小的尘埃粒子,并在其生命周期结束时产生一个烟雾粒子:
part_type_step(spark_particle,1,dust_particle);part_type_death(spark_particle,5,smoke_particle);
自定义粒子形状
通过使用,您可以使用自定义精灵而不是内置的 GameMaker 粒子类型。 part_type_sprite(ind, sprite, animate, stretch, random)
ind
是粒子变量。sprite
是要使用的精灵变量。animate
是一个布尔值,用于确定是否应为子图像设置动画。stretch
是一个布尔值,将动画长度与粒子的生命周期相匹配。random
是一个布尔值,用于确定是否应随机选择起始子图像。
part_type_sprite(heart_particle,spr_heart,false,false,false);
内存管理
关于 GameMaker Studio 粒子系统,要记住的最重要的一点是,您需要在不使用时手动从内存中删除项目。与标准游戏对象不同,即使您更换房间,粒子系统也会保留在内存中。处理此问题的最简单方法是将内存管理代码放置在游戏对象的房间更改事件中。
part_system_clear(ind)
:清除属于特定粒子系统的所有发射器和粒子。part_system_clear(ind)
:清除特定粒子类型的所有实例。part_emitter_clear(ps, ind)
:清除属于特定发射器的所有粒子。part_emitter_destroy(ps, ind)
:销毁特定粒子系统中的特定发射器。part_emitter_destroy_all(ps)
:销毁特定粒子系统中的所有发射器。part_type_destroy(ind)
:破坏特定的粒子类型。part_system_destroy(ind)
:破坏整个粒子系统,包括其中包含的所有粒子和发射器。
结论
即使有这么长的教程,我们仍然只是了解了GameMaker Studio 粒子系统能够产生哪些效果的皮毛。掌握粒子的关键是熟悉和实验,所以开始使用您获得的知识开始创建自己的效果。请务必查看官方 GameMaker 文档以查看所有可用的粒子系统 GML!
- 创建粒子系统
- 创建粒子类型
- 创建粒子发射器
- 激活粒子发射器
- 粒子摆动
- 突发发射器和移动物体
- 发射器区域形状
- 粒子系统步骤和死亡效果
- 自定义粒子形状