本帖最后由 lrdcq 于 2014-12-10 20:13 编辑
因为制作过以还原东方曲线激光为目标的小游戏(http://tieba.baidu.com/p/2827270606)
所以自誉对东方中的曲线激光还算有点研究了
准备长篇大论,占楼待编辑 好吧,其实我刚才去吃了个晚饭,然后回来慢慢截图 然后来了几局STG
其实LZ已经把问题解决得差不多了,我从一些细节和大家争论的地方,以ZUN为标准来讲一些东西吧。
1.定义,什么是东方中的曲线激光?
嘛,曲线激光就曲线激光嘛,东方的曲线激光,ZUN的曲线激光,非要确定下来的话是自东方亲民船出现的,使用bullet文件夹的这张贴图作为素材(除了火葬场里面的闪电曲线激光)
形成的激光。所以,这样
这样就是曲线激光。
而另一种大家很容易想到的方法,由大量高光blend出来的弹幕组成的看起来像激光一样的瞎眼的东西,比如这样
就不属于东方的曲线激光,不在我们讨论范围之列。
2.曲线激光模型是的怎么构成的呢?
a.仔细观察每一条曲线激光,它是由完整的一块贴图扭曲而成,也就是大家想到的四边形细分扭曲。
b.游戏中可以显而易见的得到,曲线激光的形状是由一颗弹幕移动牵引出的轨迹而得到的,并且牵引轨迹的控制点的数目对于每一条激光是固定(通过大圣非符速度变慢的激光长度变短可证)。
3.曲线激光的牵引弹幕的控制点是怎么选取的?
前提:牵引弹幕的移动路径留下的点压入长度为按需求定义的N的队列中,作为控制点队列
a.可以直接选取需求长度中的所有的N个点构成曲线激光模型。
b.对于宽度过大或速度过慢的曲线激光会出现问题,比如弹幕腾讯狗早喵二符
会导致控制点相对太慢,构成的模型拐弯处内侧可能会出现如下情况
此时应修改参数来解决问题。
c.对于放B或者拍照(文花帖ds),有可能将一条激光打断为两条甚至多条
仔细观察打断的激光,他们各自应用了完整的贴图,是一条完整的激光,但是是沿着相同的轨迹在行进
因此可以得到结论:一个牵引弹幕可以牵引多条曲线激光
4.曲线激光的判定点是怎么构成的?
a.是点构成的么?肯定不是,对于速度稍快的牵引弹幕牵引出的控制点间距就较大,显然如果全是点构成的判定对于激光来说也是凹凸不平的,如下图
如果速度更快,甚至有神穿的可能,显然就完全是游戏BUG。
因此曲线激光的判断一定是由N个牵引点的N-1条短线段做判定构成的:
(附赠点到线段判定算法)
- hit_test_line=function(p,n1,n2,d){//测试点 碰撞线段点1 碰撞线段点1 测试距离
- var a=MATH.dis(p,n1),b=MATH.dis(p,n2),c=MATH.dis(n2,n1),ds=0;
- if(a*a>=b*b+c*c){ds=b}
- else if(b*b>=a*a+c*c){ds=a}
- else{
- var s=(a+b+c)/2;
- s=Math.sqrt(s*(s-a)*(s-b)*(s-c));
- ds=2*s/c;
- }
- if(ds>d){return 0;}
- else{return 1;}
- }
复制代码 b.是所有的控制点间线段都有判定么?显然不是,首先,收尾的两段肯定没有判定,否则判断肯定就超出激光模型范围了
同理,对于超宽曲线激光,判定范围减退到收尾第X个点,显然X=判定长度/牵引点平均间距。
但其实这样判断也会在拐歪处稍微超出一点点,这就是弹幕腾讯狗早喵那张符小弯的激光外侧特别难擦很容易撞的原因。
大概要关注的点就是这些? 具体数据结构应该肯定没问题了
|