设为首页收藏本站喵玉殿官方微博

喵玉殿论坛 · 喵玉汉化组

 找回密码
 少女注册中
搜索
查看: 14417|回复: 8

[编程算法] STG游戏弹幕产生算法

[复制链接]
发表于 2014-7-27 23:02:20 | 显示全部楼层 |阅读模式
本帖最后由 drzzm32 于 2014-8-15 23:09 编辑

@drzzm32

本帖主要讨论STG游戏各类弹幕的产生算法。
话说N天以前我在drzzm32家看了一下他的东方铃青游的DEMO(暂且先不吐槽BGM了),别的先不说,弹幕产生的效果就让人看得云里雾里,形状很奇葩,很多弹矢的产生点离BOSS有相当的距离,同时又有很多子弹速度极低以至于几乎看不出来移动,更因为如此,我完全无法想象出来他产生弹幕的算法是怎样写的……
这个帖子有两个目的:①帮助DRZZM32和其他有志于做STG游戏的人,②顺便刷一下存在感(ш ̄□ ̄)┘……
以下脚本都会用RGSS2书写。虽然这确实是门冷门语言,不过我估计多数程序员应该都能看得懂吧。
我回忆了一下12年时我看到的用RMVX做的STG范例,对其中的脚本做些改动,如下:


1.GIF
从这张图中可以看见,有一个非常重要的概念,即行动周期。在多数情况下,这对于控制敌机的行动是很有必要的。
你应该还可以看见,这里用到了“<<”和">>"的运算,在做这两个运算之前,你需要将原数转为二进制,“<< 6”就是在末尾加6个“0”,">>"则是去掉。
还有就是这里的radiate。这个函数定义了一个圆形弹幕的发射。
2.GIF
东方里面最常见的圆形弹幕,就是这样弄出来的,不过这种上图所示的算法会在1帧内产生所有子弹,如果你希望过一会儿再完成这种操作的话,加个时间间隔。比如:radiate(1,@attr1,@attr2,@attr3,@attr4) if @time > 60 and @time % 6 == 0,就可以每隔0.1秒产生一个圆。
哦,是的,时间间隔也是个十分重要的概念。

接下来我们应该看一下如何产生弹幕了。
3.GIF
这张图中的喷射和扇形弹幕,应该算是整个游戏里面最基本的那几类弹幕了。
而漩涡弹幕,其本质也是圆形弹幕,不过是每过一帧起点发射角度加了几度而已。

今天暂时写到这里,有问题请写在这里。如果问题比较统一,我会考虑更新。
发表于 2014-7-27 23:12:19 来自手机 | 显示全部楼层
本帖最后由 drzzm32 于 2014-7-27 23:15 编辑

那个,在群里我传了一个SRC
我用的是双循环,分别控制参数方程的参数和初相,并未考虑到你所说的弹型(后面会更新)。并按照一定的衰减倍数生成增量。我并未进行单位化处理。
当前是注重于系统构建,弹幕设计会在后期进行。
我更倾向于数学生成,但是后期会引入【场】的模拟。

我那些不属于圆形(漩涡)弹幕,那是螺旋线。

明天在电脑上慢慢码。。。
回复 支持 反对

使用道具 举报

发表于 2014-7-28 03:11:14 | 显示全部楼层
膜拜技术帝
回复 支持 反对

使用道具 举报

发表于 2014-7-28 18:58:49 | 显示全部楼层
少年们,看起来你们需要一个定时器
写出来像这个样子的东西(以下是javascript):
捕获.PNG

STORY.timeout 其实就是把需要的函数包装起来,加入了定时器的队列而已。定时器本身很简单(核心就是一个循环),但是要维护好整个队列还是要费点心的。定时器的用处其实很多,你甚至可以把所有活的物体(包括自机,妖精和弹幕)本身看成一个个的定时器来管理。

其他语言的实现的话,c/c++可以用函数指针,c#用委托(delegate)。支持面向对象的语言用继承和多态也是可以的
回复 支持 反对

使用道具 举报

发表于 2014-7-28 23:01:02 来自手机 | 显示全部楼层
ofz 发表于 2014-7-28 18:58
少年们,看起来你们需要一个定时器
写出来像这个样子的东西(以下是javascript):


我生成弹幕就是在一个Timer里,因为延时函数不好搞,不能用多线程。
我只是还没有写那种弹型。。。
回复 支持 反对

使用道具 举报

发表于 2014-7-29 08:59:39 | 显示全部楼层
因此,制作一个游戏尤其是一个好游戏,是十分辛苦的事情
回复 支持 反对

使用道具 举报

发表于 2014-7-29 12:12:46 | 显示全部楼层
本帖最后由 lrdcq 于 2014-7-29 13:02 编辑

那我也来吧。这是我这边的 主弹幕发射器类 的 构造函数,我人懒啊把各种物体的发射都蹂躏到一起了确实很对不起,不过功能倒是非常全来着。。
QQ截图20140729120832.jpg
QQ截图20140729120850.jpg
QQ截图20140729120906.jpg
如图所示大量的属性有预设。所以

1.一个简单的自机狙发射弹幕的JSON定义是
  1. {mesh:WEHOUGAME.getBullet(0)}
复制代码
只需要定义弹幕“模型”即可


2.还记得我的bench1的普通弹幕抛洒么,那一个的定义是
  1. {mesh:WEHOUGAME.getBullet(3),anglerandom:360,speedrandom:5,period:1,outfield:true,number:1,numberchange:[0.008,50]}
复制代码
除了模型定义,其他的分别是:角度随机范围:360 速度随机范围:5(默认速度是3,那么实际速度是0.5~5.5) 发射周期:1 出边界清除:true 每次发射数目:1  每次发射数目演变:每tick增加0.008,增加到50为止


eda2d1a20cf431ad54ab04dc4936acaf2fdd98eb.jpg
3.符卡举例,例子是之前的“幻想格林尼治”的莲子一符“中子星喷发”,一共使用2个弹幕发射器
  1. {mesh:WEHOUGAME.getBullet(24),palstancerandom:6,speedrandom:2,period:1,outfield:true},
  2. {period:130,type:'laser',number:3,angle:[15],speed:[1000],mesh:WEHOUGAME.getBullet(25),appearline:60,lifetime:130,bulletevents:[['t',1,['v',0.0001,0]]],birthse:4}
复制代码
分别解释
        第一个发射,是往四周发射的粉色铳弹,如之前所说,默认情况是朝向自机的自机狙,那么palstancerandom:6定义其旋转曲率的随机度为6,即会在-3~3的范围内旋转(如图,发射处均是朝向自机发射,但大部分弹幕会往两边旋转),速度随机度2,这个理解,发射频率1即每tick发射一个弹幕的速度,最后一项是出界即清除。
        第二个发射器,显然,就是中间的激光了(type:'laser'),一共有3条(number:3),其间隔的角度是15度(以目标(自机狙)为中心往两边分摊),然后mesh弹幕定义,预告线时间60tick(appearline:60),弹幕生存时间130tick,发射周期也是130tick。最后涉及到弹幕事件,一开始速度是1000(speed:[1000]),在time为1之后('t',1),其速度变为0.0001('v',0.0001,0),简单的说就是用1tick的时间把激光从发射点伸出来1000的距离,如果没速度的话激光根本没发射出来嘛~~。最后还有一个发射时引用音效ID=4.。。。


我相当于大概讲了一下我这里弹幕发射器的属性构成之类的。。。具体发射那段函数。。。。那百来行密密麻麻的真不敢贴出来啊。。。

点评

蓮子會噴霍金輻射 @@  发表于 2014-7-29 17:46
回复 支持 反对

使用道具 举报

发表于 2014-7-29 17:45:01 | 显示全部楼层
有人用visual basic嗎?
回复 支持 反对

使用道具 举报

发表于 2014-7-29 17:53:10 来自手机 | 显示全部楼层
Capt.Murasa 发表于 2014-7-29 17:45
有人用visual basic嗎?

这里有一枚~Visual Basic 11.0(Visual Studio 2012)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 少女注册中

本版积分规则

合作与事务联系|小黑屋|手机版|无图版|喵玉殿

GMT+8, 2024-3-28 16:36

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表