找回密码
 点一下
查看: 4284|回复: 15

弹幕啊弹幕~~~  [增加T版及一些其他的]

[复制链接]
发表于 2008-10-14 23:24:47 | 显示全部楼层 |阅读模式
根据某某人要求,外加某某人心血来潮,因此更新了T版(果然自己不会写T了..........)
[T版在最后,嗯,大家下后面一个吧,整合了一下........]

东方是个好游戏......

弹幕是个好东西......

函数是个烂函数......

咳,虽然我也尽力想做的尽可能的多样化,但果然还是自己数学废柴,完全不能和G君的图形比.........

原理十分简单,就是loop套loop套loop(所以我才说是个烂函数...),给初学者当loop回圈教程也许不错?

现在可以实现的弹幕可以分为两大种,旋臂式和花瓣式。不过我发现如果参数选的怪一点的话倒也可以出现比较特殊的弹幕。

新增多弹幕效果,即比如可以在巨箭的弹幕上加上一生命恢复效果,具体样式可参照后面的图片。

投射物可以自选种类、大小和速度,这大概也算是多样化的其一吧........(注:请不要选择过于华丽的投射物,否则幻灯片可别怪我.......)

可选择弹幕是否跟随施法单位移动而移动........(移动的时候总感觉是在画电场线...啊,罪恶罪恶,物理老师我对不起你......)

由于使用的是loop回圈+TriggerSleep,所以弹幕不能很快的发射,Timer 还得弄个全局数组,果然用struct更简洁一些么........(众:汗,这两句话有什么关系么.......)

[发现多开几个T运行这个函数可以做出更复杂一些的弹幕,不过开多了会很卡就是了........]

发几张图,其实这玩意儿有没有图没什么太大意思.........

2条旋臂:

1.jpg


2瓣花瓣:(有点灵异......)

2.jpg

6条旋臂:

3.jpg

6瓣花瓣:

4.jpg

也可以做出像这样的效果.......

5.jpg

6.jpg

============================================    我是朴实的分界线  =========================================

嗯,更新的弹幕多效果,现在使用的是暗影猎手的投射物加生命恢复,效果还不错,不过太多了可能就幻灯片了.......(T版尚未支持此功能)
当然,由于所谓的多效果其实就是弹幕的叠加,所以一般情况下伤害弹幕和效果弹幕的弹射速度要相同,如果要其他效果那随便。


n.jpg

代码已更新。

[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]

欢迎大家吐槽、批评...........

以上!

[10.17更新]弹幕(T加J版).w3x

30 KB, 下载次数: 196

评分

参与人数 2威望 +21 收起 理由
laomang11 + 20
sxlrose + 1 很认真!创意很唯美

查看全部评分

发表于 2008-10-15 12:49:22 | 显示全部楼层
完全不觉得灵异  很漂亮呢
回复

使用道具 举报

发表于 2008-10-15 15:43:06 | 显示全部楼层
感觉不错哈~.~很有娱乐效果呢
回复

使用道具 举报

发表于 2008-10-15 16:24:38 | 显示全部楼层
菊花弹幕。。。
回复

使用道具 举报

发表于 2008-10-15 19:02:02 | 显示全部楼层
很漂亮``但是很难。。。。。。。。
回复

使用道具 举报

发表于 2008-10-17 13:47:19 | 显示全部楼层
怎么看不到红色的,不过确实很漂亮
回复

使用道具 举报

 楼主| 发表于 2008-10-17 15:22:13 | 显示全部楼层
额,不是说可以修改投射物的模型么......在物品编辑器-->技能里
回复

使用道具 举报

恶声恶气 该用户已被删除
发表于 2008-10-17 16:20:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2008-10-17 17:15:17 | 显示全部楼层
好看但是看不懂J.......
有T的就更好了..
回复

使用道具 举报

发表于 2008-10-18 18:59:44 | 显示全部楼层
这就是我梦寐以求的效果,谢谢LZ了啊~~
回复

使用道具 举报

发表于 2008-11-12 08:40:51 | 显示全部楼层
很有创意,顶一下
回复

使用道具 举报

kw 该用户已被删除
发表于 2008-11-19 17:51:09 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2008-11-19 20:58:27 | 显示全部楼层
隱藏施法單位貌似不會自動消失呢...
回复

使用道具 举报

 楼主| 发表于 2008-11-19 21:04:43 | 显示全部楼层
我不是写了 call RemoveUnit(u[unum]) 么........
回复

使用道具 举报

发表于 2008-11-19 21:08:09 | 显示全部楼层
剛剛把隱藏施法單位穿上模型後發現的
回复

使用道具 举报

 楼主| 发表于 2008-11-19 21:32:41 | 显示全部楼层
发现了,最后一个loop前没写unum=0,改一下应该好了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-12-28 19:07 , Processed in 0.145712 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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