| 
 | 
 
两个技术范例 
https://www.bilibili.com/video/BV1jM411o7Bp/ 
https://www.bilibili.com/video/BV1C64y1P7kD/ 
关于斩击首先从如何让斩击出现来讲,用act+nut怎么出现斩击有两个思路,一般思路就是由act新建特效,一个头和尾,两个配对后,由nut的152292新建斩击特效,即用nut新建临时特效,这个临时特效需要nut去计算头和尾的旋转角度和长度。这样到后面只需要考虑头和尾的新建即可。具体实现逻辑是 
我在lst里注册一个特效id为1的特效为头(只是举例子),然后注册特效id为2的特效为尾。这两个特效都看不见(ani里没有写任何图像调用,为DUMMY特效),当头id1新建出来后,act就会去找尾巴即2 
,头1的act里会写上which,passive index =>2 ,找到了后将他save object,同时因为头找到了尾巴,新建152292(以尾巴的坐标去新建),然后对应的nut ani的调用切换成chain ani,这样就能新建出来斩击。 
(脑子里想想,我定义了一个头和一个尾,然后我拿nut把这两个头和尾用ani绘制出来就行了。这样我压根就不用考虑什么角度长度问题了。) 
但是,现在有个问题,如果我同时新建了3个头和3个尾巴,我怎么让这三个头和尾巴匹对上呢?让他们斩击角度和长度是我想要的呢?这里我拿了个鬼思路,我把这三个头的z轴分别为0,1,2,同理尾巴的z轴为0,1,2,让相同z轴的相互匹配上就行了。同理,如果想多个斩击,就接着扩充。 
然后现在怎么触发斩击,接着上面,因为我头已经找到尾巴了,通过act去找到了我对应的尾巴,并用act将他记录下来了。那么我如果想触发斩击,我需要头拿到我记录的那个特效新建一个 
[CREATE PASSIVEOBJECT] 
[INDEX] 
152472 
[PARTICLE FILENAME] 
`` 
[LEVEL] 
-1 
[POS] 
10005 
[USE MAP POS] 
[FOLLOWING TARGET] 
[/CREATE PASSIVEOBJECT] 
就能斩击了,只要新建这个152472即可直接触发屏幕斩击(100是基准长度,如果写成50,代表只有一半的斩击长度,0是默认,而5是斩击的宽度(左右为5),) 
[TRIGGER] 
[LIMIT] 
1 
[IF] 
`TIME` 
[+] 
1700 
[<] 
[GET TIME] 
[/IF] 
[WHICH] 
[LOAD TARGET] 
42 
[CHECKED NO] 
[>] 
0 
[DO BEHAVIOR] 
[CHECKUP OBJECT] 
1 
[/TRIGGER] 
[BEHAVIOR] 
[DIM] 
`TIME` 
[=] 
[GET TIME] 
[/DIM] 
[CREATE PASSIVEOBJECT] 
[INDEX] 
152472 
[PARTICLE FILENAME] 
`` 
[LEVEL] 
-1 
[POS] 
10005 
[USE MAP POS] 
[FOLLOWING TARGET] 
[/CREATE PASSIVEOBJECT] 
[/BEHAVIOR] 
x长度,y不用,z为最大间隔。 
注意必须使用following target 
而152472特效nut是如何写的?这里讲一下只涉及最基本的思路和数学算法。 
首先我们扩展一个数学功能,我希望有一个函数,给一个点的xy和四边形的四个点坐标, 
能直接判断点是否在一个四边形内(四边形的四个点坐标由我定义),如果能够判断出来就完成了第一步 
(这一步可以使用面积法来算。这是最简单的一个方法) 
上面成功后,那么我们就可以通过上面的头和尾,来构建一个四边形,(脑子里想象一个头和尾组成的线,然后拿到宽度比如5,对外扩展,就形成了一个矩形(具体如何拿到这个矩形需要数学方面的函数判断了),然后将这个矩形,去检测对象的身上的坐标点(取决于你如何定义坐标点,越密集越准确)) 
function rayCheckScreenPosObject(checkObjectX,checkObjectY,len,startScreenX,startScreenY,endScreenX,endScreenY) 
{ 
local startSP = Point2D(startScreenX,startScreenY); 
local endSP = Point2D(endScreenX,endScreenY); 
local angle = get360Angle(startSP,endSP); 
local offsetX1 = sq_CosTable(angle.tointeger() + 90 ) * len; 
local offsetX2 = sq_CosTable(angle.tointeger() - 90 ) * len; 
local offsetY1 = sq_SinTable(angle.tointeger() + 90 ) * len; 
local offsetY2 = sq_SinTable(angle.tointeger() - 90 ) * len; 
local p1 = Point2D(startScreenX + offsetX1,startScreenY + offsetY1); 
local p2 = Point2D(startScreenX + offsetX2,startScreenY + offsetY2); 
local p3 = Point2D(endScreenX + offsetX1,endScreenY + offsetY1); 
local p4 = Point2D(endScreenX + offsetX2,endScreenY + offsetY2); 
if (pointIsIn4PointArea(checkObjectX, checkObjectY, p1.getPX(), p1.getPY(), p2.getPX(), p2.getPY(), p4.getPX(), p4.getPY(), p3.getPX(), p3.getPY())) 
return true; 
return false; 
} 
(我的nut扩展的现在有Point2D类对象,所以后面我更倾向用类对象来操纵) 
扩展出来后,让nut去objectmanager扫描头的敌人,然后传入敌人的坐标参数,如果返回true就发送一次打击即可,注意,头得有atk,加一个即可。 
这样你就无需考虑什么旋转角度,长度,只需要考虑头和尾新建在哪个坐标上就行了。 |   
 
 
 
 |