|
根据某某人要求,外加某某人心血来潮,因此更新了T版(果然自己不会写T了..........)
[T版在最后,嗯,大家下后面一个吧,整合了一下........]
东方是个好游戏......
弹幕是个好东西......
函数是个烂函数......
咳,虽然我也尽力想做的尽可能的多样化,但果然还是自己数学废柴,完全不能和G君的图形比.........
原理十分简单,就是loop套loop套loop(所以我才说是个烂函数...),给初学者当loop回圈教程也许不错?
现在可以实现的弹幕可以分为两大种,旋臂式和花瓣式。不过我发现如果参数选的怪一点的话倒也可以出现比较特殊的弹幕。
新增多弹幕效果,即比如可以在巨箭的弹幕上加上一生命恢复效果,具体样式可参照后面的图片。
投射物可以自选种类、大小和速度,这大概也算是多样化的其一吧........(注:请不要选择过于华丽的投射物,否则幻灯片可别怪我.......)
可选择弹幕是否跟随施法单位移动而移动........(移动的时候总感觉是在画电场线...啊,罪恶罪恶,物理老师我对不起你......)
由于使用的是loop回圈+TriggerSleep,所以弹幕不能很快的发射,Timer 还得弄个全局数组,果然用struct更简洁一些么........(众:汗,这两句话有什么关系么.......)
[发现多开几个T运行这个函数可以做出更复杂一些的弹幕,不过开多了会很卡就是了........]
发几张图,其实这玩意儿有没有图没什么太大意思.........
2条旋臂:
2瓣花瓣:(有点灵异......)
6条旋臂:
6瓣花瓣:
也可以做出像这样的效果.......
============================================ 我是朴实的分界线 =========================================
嗯,更新的弹幕多效果,现在使用的是暗影猎手的投射物加生命恢复,效果还不错,不过太多了可能就幻灯片了.......(T版尚未支持此功能)
当然,由于所谓的多效果其实就是弹幕的叠加,所以一般情况下伤害弹幕和效果弹幕的弹射速度要相同,如果要其他效果那随便。
代码已更新。
[jass]
//### (boo) single --> 判断弹幕方式为旋臂还是花瓣 --| 注定减少判断次数就必须
// | -----> 增加代码,我也不想判断
//### (boo) moveable --> 判断弹幕是否随施法单位移动而移动 --| 一个定值那么多次......
//
//### (int) roundmax --> 最大圈数(其实为 (360/花瓣,旋臂数),但函数中转换成了真正的圈数,当然
// 如果希望转小于一圈的,可以修改 exitwhen i > (roundmax*armmax) 一行
// 为 exitwhen i > roundmax ,此时旋转的角度就等于 (360/花瓣,旋臂数).)
//
//### (int) armmax --> 花瓣,旋臂数
//
//### (int) bombmax --> 旋臂密度数(即 (360/花瓣,旋臂数) 角度中有多少弹,数值越大花瓣越长,
// 个人觉得太大或太小效果都不是很好(旋臂除外),当然也可以自行尝试.
// 其实这个数值在一定程度上影响着旋转的速度(因为在step2中等待嘛).)
//
//### (int) unum --> 单幕效果计数器( 所谓的弹幕效果,其实就是多个TempCaster同时施放技能,
// 然后效果技能删除允许目标.但是如此修改后移植成了个比较麻烦的问题,因
// 为无法知道移植者需要多少种效果(虽然理论上是可以无限多的,但其实这个
// 数字大于5很可能就会幻灯片),因此GetSpellInt()函数在移植时需要移植者
// 自行修改.这对看不懂J的同学们比较麻烦,同时,也是无法做成T的. )
//
//### (rea) size --> 弹幕大小(效果大小,伤害区域大小请修改辅助技能.)
//
//### (uni) caster --> 施法单位
//弹幕ID(移植须修改,多效果必须手动修改判断语句的返回值和次数)
function GetSpellInt takes integer i returns integer
if (i==1) then
return 'A000'
endif
if (i==2) then
return 'A002'
endif
return 'A003'
endfunction
//傀儡施法者ID
function GetSpellUnit takes nothing returns integer
return 'h000'
endfunction
//
function test takes boolean single,boolean moveable,integer roundmax,integer armmax,integer bombmax,integer unummax,real size,unit caster returns nothing
local integer step1 = 0
local integer step2 = 0
local integer step3 = 0
local real LocX = GetUnitX(caster)
local real LocY = GetUnitY(caster)
local real angle1 = 360/I2R(armmax)
local real angle2 = angle1/bombmax
local real x = 0
local real y = 0
local integer unum = 0
local unit array u
loop
set unum = unum + 1
exitwhen unum > unummax
set u[unum] = CreateUnit(GetOwningPlayer(caster),GetSpellUnit(),GetUnitX(caster),GetUnitY(caster),0)
call SetUnitScale(u[unum],size,size,size)
call UnitAddAbility(u[unum],GetSpellInt(unum))
endloop
set unum = 0
if (single == false) then
loop
set step1 = step1 + 1
exitwhen step1 > (roundmax*armmax)
set step2 = 0
loop
set step2 = step2 + 1
exitwhen step2 > bombmax
set step3 = 0
//这四行决定着是否弹幕随施法单位移动而移动.
//<--------- Start Move --------->
if (moveable == true) then
set LocX = GetUnitX(caster)
set LocY = GetUnitY(caster)
set unum = 0
loop
set unum = unum + 1
exitwhen unum > unummax
call SetUnitX(u[unum],LocX)
call SetUnitY(u[unum],LocY)
endloop
endif
//<--------- End Move --------->
loop
set step3 = step3 + 1
exitwhen step3 > armmax
set x = LocX+50*Cos((I2R(step3)*angle1+I2R(step2)*angle2)*(3.14159/180.0))
set y = LocY+50*Sin((I2R(step3)*angle1+I2R(step2)*angle2)*(3.14159/180.0))
set unum = 0
loop
set unum = unum + 1
exitwhen unum > unummax
call SetUnitFacing(u[unum],I2R(step3)*angle1+I2R(step2)*angle2)
call IssuePointOrderById(u[unum],852218,x,y)
endloop
set x = LocX+50*Cos((I2R(step3)*angle1-I2R(step2)*angle2)*(3.14159/180.0))
set y = LocY+50*Sin((I2R(step3)*angle1-I2R(step2)*angle2)*(3.14159/180.0))
set unum = 0
loop
set unum = unum + 1
exitwhen unum > unummax
call SetUnitFacing(u[unum],I2R(step3)*angle1-I2R(step2)*angle2)
call IssuePointOrderById(u[unum],852218,x,y)
endloop
endloop
call TriggerSleepAction(0)
endloop
endloop
else
loop
set step1 = step1 + 1
exitwhen step1 > (roundmax*armmax)
set step2 = 0
loop
set step2 = step2 + 1
exitwhen step2 > bombmax
set step3 = 0
//这四行决定着是否弹幕随施法单位移动而移动.
//<--------- Start Move --------->
if (moveable == true) then
set LocX = GetUnitX(caster)
set LocY = GetUnitY(caster)
set unum = 0
loop
set unum = unum + 1
exitwhen unum > unummax
call SetUnitX(u[unum],LocX)
call SetUnitY(u[unum],LocY)
endloop
endif
//<--------- End Move --------->
loop
set step3 = step3 + 1
exitwhen step3 > armmax
set x = LocX+50*Cos((I2R(step3)*angle1+I2R(step2)*angle2)*(3.14159/180.0))
set y = LocY+50*Sin((I2R(step3)*angle1+I2R(step2)*angle2)*(3.14159/180.0))
set unum = 0
loop
set unum = unum + 1
exitwhen unum > unummax
call SetUnitFacing(u[unum],I2R(step3)*angle1+I2R(step2)*angle2)
call IssuePointOrderById(u[unum],852218,x,y)
endloop
endloop
call TriggerSleepAction(0)
endloop
endloop
endif
loop
set unum = unum + 1
exitwhen unum > unummax
call RemoveUnit(u[unum])
set u[unum] = null
endloop
endfunction
[/jass]
欢迎大家吐槽、批评...........
以上! |
评分
-
查看全部评分
|