成就中心 DouJin Terraria! 社区服务 统计排行 帮助
  • 10502阅读
  • 19回复

[制作范例]GM基本的弹幕制作

发帖
661
信仰
0
蓝点
651
符卡
0


点击鼠标左键切换弹幕样式。
本帖附件为EXE与工程文件。

附件: shellexe.rar (999 K) 下载次数:136
附件: shellgmk.rar (52 K) 下载次数:113
发帖
661
信仰
0
蓝点
651
符卡
0
只看该作者 沙发  发表于: 2011-02-01
(一)

在这篇教程中包含两个主要内容:

房间巡回展示:

类似于一个“幻灯片”功能。
它用处很多,是这个教程范例的主结构。
它会带着你从第一个房间走到最后一个房间,往后则形成循环。

弹幕制作:

通过房间巡回展示功能,我在每个房间介绍一个内容。
这些内容分别为基本的随机、全方位、漩涡弹幕等的制作。
复杂的弹幕,都是在基本弹幕上加中间量、参数或计时制作出来的。

下边先介绍房间巡回展示如何制作。
发帖
661
信仰
0
蓝点
651
符卡
0
只看该作者 板凳  发表于: 2011-02-01
(二)

首先创建一个 object 叫做 obj_nextroom

给它设定一个 Glob Left Pressed 事件:

  1. // 在所有房间间循环切换
  2. if( room! = room_last ) room_goto_next() else room_goto( room0 )


这一句就能完成“所有 room 之间循环切换”的功能?
对,仅这一句。
但下边还有重要的一步:

注意你的 object 编辑器,在 Depth、Parent 中间有一个 Persistent ,将它勾选:

Depth
[√]Persistent
Parent

这是一个很重要的功能。

一旦勾选,它可以使实例保留到下一个 room 中。
在本教程范例里,勾选以后就不必每个房间都摆一个 obj_nextroom ,我们摆在最上边的 room 里即可。

发帖
661
信仰
0
蓝点
651
符卡
0
只看该作者 地板  发表于: 2011-02-01
(三)

好,这里我们已经完成了结构的制作。
如果有几个 room ,现在已经可以进行“幻灯片”式浏览了。

不过要是没内容,也没什么好浏览的。
下边我们来做弹幕的最小元素——子弹。


创建一个 object 叫做 obj_bullet
  
给它设定一个 Outside Room 事件:销毁自己。

毕竟是弹幕,若占用过多资源会卡,所以超出 room 显示范围销毁掉即可。

我这里不仅要做弹,而且要做漂亮绚丽一点的弹。
因此用“叠加模式”来显示子弹素材——在很多知名游戏中,它可以营造泛亮的视觉效果。


为 obj_bullet 设定一个 draw 事件:

  1. // 使用叠加模式绘制子弹
  2. draw_set_blend_mode( bm_add )
  3. draw_sprite_e( sprite_index,image_index,x,y,image_xscale,image_yscale,image_angle,image_blend,image_alpha ) draw_set_blend_mode( bm_normal )


这 3 行的意思分别是:
绘制设置为叠加模式;在开启 draw 模式下正常显示自己的精灵;绘制设置为普通模式。

第 2 行的 draw_sprite_ext() 用处很多。
GM 根据实例是否开启 draw 模式的情况,使用 2 种显示机制。
若开启了 draw 模式,没有在 draw 事件写码的话,原本的精灵不会显示。

用上边的 draw_sprite_ext() 一句,即可在 draw 模式下显示平常的精灵。
同时你还可以绘制一些别的:血条,纸娃娃。
高级一点还可以改变显示模式,改变显示表面等,非常自由。

发帖
661
信仰
0
蓝点
651
符卡
0
只看该作者 4楼 发表于: 2011-02-01
(四)

现在子弹完成!将它以不同的规律发射出来,就形成弹幕了。

在教程范例中,我设定了 4 种弹幕,每个主体都差不多,所以我着重介绍弹幕的必须结构,与 4 种弹幕的区别。

制作弹幕必须用到的句式是循环。例如:

  1. repeat( 8 )
  2. {
  3. code
  4. }


这样既可重复执行 code 8 次。  

具体到弹幕制作中,这个被重复执行的 code 即为“生成子弹”。

可是,如果完全重复,生成的弹就会都一样了,会叠在一起。
那样的话,我们怎么可能看到子弹散开,或者具有规律性美感的构成图案呢?

因此,这里并不是完全重复的去 repeat !

在发射随机弹幕的 obj_type_a 中,repeat 的内容为:

  1. Creation = instance_create( x, y, obj_bullet );
  2. Creation.direction = 180 + random( 180 );
  3. Creation.image_angle = Creation.direction;
  4. Creation.speed = 1 + random( 10 )/10 ;


注意这里方向与速度的赋值:

180 + random( 180 ) 代表了 180 到 360 度的范围。

1 + random( 10 )/10 则代表了 1 到 2 像素每帧的移动速度。
因为 random() 不支持非整数,所以这里用 random( 10 )/10 来获得 0.1 到 1.0 的数值。

这样便保证了“非完全重复”。
因此我们看到第一个房间中,发射的是符合上述赋值的随机弹幕。  
发帖
661
信仰
0
蓝点
651
符卡
0
只看该作者 5楼 发表于: 2011-02-01
(五)

在发射全方位弹幕的 obj_type_b 中,在 repeat 的内容前边加了一个临时变量:

  1. TempDir = 23;


同时,在 repeat 的内容中,TempDir 不断进行累加:

  1. TempDir += 45;



这样做的效果,就是我们在第二个房间中所看到的。
效果为不断发射 8 向弹幕。起始角度为 23 度,子弹间隔 45 度(即 360 / 8 )。


在前者的基础上——

发射漩涡弹幕的 obj_type_c ,将 TempDir 转移到了 create 事件中。
这样一来, TempDir 就不再是临时变量,而是实例的局部变量了!

这次在 repeat 的内容前边又加了一个起始角度修正值:

  1. TempDir += 5;


又是在前者的基础上,进一步的——

这里已经是灵活的改动了。在 repeat 前引入一个临时变量:

  1. TempSpeed = 1;


在 repeat 中加入一个奇怪的式子:

  1. TempSpeed = 1 + ( TempSpeed = 1 );


先介绍一下 ( TempSpeed = 1 ) 这样的用法:

等式在 GM 中可以当做变量参与运算。
在此例中,如果 ( TempSpeed = 1 ) 为真,括号内的值即为 1 ,反之为 0 。

这样的改动,是要实现什么呢?
我的目的是每生成一颗弹,速度在 1 和 2 间切换。最终效果可见附后的截图。

内容到这里就结束了,希望对大家对照例子时能够有所收获。

发帖
3
信仰
0
蓝点
1
符卡
0
只看该作者 6楼 发表于: 2011-02-04
自己狙怎么写?我完全不会GM的
发帖
661
信仰
0
蓝点
651
符卡
0
只看该作者 7楼 发表于: 2011-02-04
F1按出手册,查找 point_direction() 即可。
发帖
16
信仰
0
蓝点
0
符卡
0
只看该作者 8楼 发表于: 2011-02-05
完全版…
发帖
661
信仰
0
蓝点
651
符卡
0
只看该作者 9楼 发表于: 2011-02-05
http://bbs.doujinstg.cn/read.php?tid=40&page=3

楼上,先把这里看一看。
描述
快速回复

您目前还是游客,请 登录注册
批量上传需要先选择文件,再选择上传
认证码: