找回密码
 点一下
查看: 8569|回复: 22

【魔法飞弹】(函数+截图)感谢原提供者Westwood

[复制链接]
发表于 2009-7-5 21:16:16 | 显示全部楼层 |阅读模式
New.gif
[jass]
    constant real               SYD_PI=3.14159
    constant real               SYD_PI2=1.570795
    constant real               SYD_TODEG=180/3.14159
    constant real               SYD_TORAD=3.14159/180

function MissileWithTargetGroup takes nothing returns nothing
    local unit u = GetEnumUnit()
    local integer vMix = GetUnitUserData(u)
    local integer aParam = Modi(vMix,200)
    local integer rParam = Modi_EX(vMix,120000,200)
    local integer tParam = vMix/120000
    local integer vLimit = SYS_GroupTempData[1]
    local integer cur = tParam - SYS_GroupTempData[0]
    local real bAngle
    local real bAngleEx
    local real r
    local real d
    local real x
    local real y
    set SYS_GroupInt = SYS_GroupInt + 1
&#160;&#160;&#160;&#160;if(cur<=0)then
&#160;&#160;&#160;&#160;elseif(cur>0 and cur<vLimit)then
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set bAngle = cur*SYD_PI/vLimit
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set r=1-Cos(bAngle)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set d=r*Sin(bAngle)*rParam
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set r=r*Cos(bAngle)*SYS_GroupTempDataR[0]
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set bAngleEx = I2R(aParam)*SYD_TORAD
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call SetUnitFlyHeight(u,60+d*Sin(bAngleEx),0)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set x = GetUnitX(SYS_GroupUnit)+r*Cos(SYS_GroupTempDataR[1])+d*Cos(bAngleEx)*Cos(SYS_GroupTempDataR[2])
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set y = GetUnitY(SYS_GroupUnit)+r*Sin(SYS_GroupTempDataR[1])+d*Cos(bAngleEx)*Sin(SYS_GroupTempDataR[2])
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call SetUnitX(u,x)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call SetUnitY(u,y)
&#160;&#160;&#160;&#160;elseif(cur>=vLimit)then
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call RemoveUnit(u)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call GroupRemoveUnit(SYS_Group,u)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set SYS_GroupInt = SYS_GroupInt - 1
&#160;&#160;&#160;&#160;endif
&#160;&#160;&#160;&#160;set u = null
endfunction

function MissileWithTargetLoop takes nothing returns nothing
&#160;&#160;&#160;&#160;local integer tmIndex = GetTimerIndex(GetExpiredTimer())
&#160;&#160;&#160;&#160;local unit su = SYS_TimerData_U00[tmIndex]
&#160;&#160;&#160;&#160;local unit tu = SYS_TimerData_U01[tmIndex]
&#160;&#160;&#160;&#160;set SYS_Group = SYS_TimerData_Group[tmIndex]
&#160;&#160;&#160;&#160;set SYS_GroupUnit = su
&#160;&#160;&#160;&#160;set SYS_GroupTarget = tu
&#160;&#160;&#160;&#160;set SYS_GroupInt = 0
&#160;&#160;&#160;&#160;set SYS_GroupTempData[0] = SYS_TimerData_I00[tmIndex]
&#160;&#160;&#160;&#160;set SYS_GroupTempData[1] = SYS_TimerData_I01[tmIndex]
&#160;&#160;&#160;&#160;set SYS_GroupTempDataR[0] = iGetDistanceBetweenUnit(su,tu)/2
&#160;&#160;&#160;&#160;set SYS_GroupTempDataR[1] = iGetAngleBetweenUnit(su,tu)
&#160;&#160;&#160;&#160;set SYS_GroupTempDataR[2] = iGetAngleBetweenUnit(su,tu) - SYD_PI2
&#160;&#160;&#160;&#160;call ForGroup(SYS_Group,function MissileWithTargetGroup)
&#160;&#160;&#160;&#160;if(SYS_GroupInt<=0)then
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call DestroyGroup(SYS_Group)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set SYS_Group = null
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set SYS_GroupUnit = null
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set SYS_GroupTarget = null
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call ReleaseTimer(GetExpiredTimer())
&#160;&#160;&#160;&#160;else
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set SYS_TimerData_I00[tmIndex] = SYS_TimerData_I00[tmIndex] - 1
&#160;&#160;&#160;&#160;endif
    set su = null
    set tu = null
endfunction

function MissileWithTargetLanch takes unit su,unit tu,integer Num,integer aMin,integer aMax,integer dMax,integer rLatency,integer bIndex returns nothing
&#160;&#160;&#160;&#160;local integer tmIndex
&#160;&#160;&#160;&#160;local integer i = Num
&#160;&#160;&#160;&#160;local integer vMix
&#160;&#160;&#160;&#160;local integer rParam
&#160;&#160;&#160;&#160;local integer aParam
&#160;&#160;&#160;&#160;local integer tParam
&#160;&#160;&#160;&#160;local integer vLimit = IConfig(R2I(iGetDistanceBetweenUnit(su,tu)/6.0),40,80)
&#160;&#160;&#160;&#160;local group gp
&#160;&#160;&#160;&#160;local unit blot
&#160;&#160;&#160;&#160;local integer blotId = 'u00A'
&#160;&#160;&#160;&#160;local real uFacing = GetUnitFacing(su)
&#160;&#160;&#160;&#160;local location loc
&#160;&#160;&#160;&#160;if(i<=0)then
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return
&#160;&#160;&#160;&#160;endif
&#160;&#160;&#160;&#160;set loc = GetUnitLoc(su)
&#160;&#160;&#160;&#160;set tmIndex = GetTimerIndex(GetTimer())
&#160;&#160;&#160;&#160;set gp = CreateGroup()
&#160;&#160;&#160;&#160;loop
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;exitwhen(i<=0)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set aParam = IConfig(GetRandomInt(aMin,aMax),-90,90)+90
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set rParam = GetRandomInt(0,IConfig(dMax,0,512))
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set tParam = GetRandomInt(80,80+IConfig(rLatency,0,40))
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set vMix = tParam*120000 + rParam*200 + aParam
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set blot = CreateUnit(GetOwningPlayer(su),blotId,GetUnitX(su),GetUnitY(su),uFacing+aParam)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call SetUnitFlyHeight(blot,60+GetLocationZ(loc),0)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call SetUnitIgnoreRegister(blot)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call SetUnitUserData(blot,vMix)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call GroupAddUnit(gp,blot)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set i = i - 1
&#160;&#160;&#160;&#160;endloop
&#160;&#160;&#160;&#160;set SYS_TimerData_U00[tmIndex] = su
&#160;&#160;&#160;&#160;set SYS_TimerData_U01[tmIndex] = tu
&#160;&#160;&#160;&#160;set SYS_TimerData_I00[tmIndex] = vLimit + rLatency
&#160;&#160;&#160;&#160;set SYS_TimerData_I01[tmIndex] = vLimit
&#160;&#160;&#160;&#160;set SYS_TimerData_I02[tmIndex] = bIndex
&#160;&#160;&#160;&#160;set SYS_TimerData_Group[tmIndex] = gp
&#160;&#160;&#160;&#160;call TimerStart(SYS_Timer[tmIndex],0.025,true,function MissileWithTargetLoop)
&#160;&#160;&#160;&#160;call RemoveLocation(loc)
&#160;&#160;&#160;&#160;set gp = null
&#160;&#160;&#160;&#160;set blot = null
&#160;&#160;&#160;&#160;set loc = null
endfunction
[/jass]

评分

参与人数 1威望 +3 收起 理由
kook + 3 特别附送~

查看全部评分

 楼主| 发表于 2009-7-5 21:17:07 | 显示全部楼层
。。貌似发错地方了。。谁帮我挪到jass区。。
回复

使用道具 举报

 楼主| 发表于 2009-7-6 08:58:22 | 显示全部楼层
恩。此函数使用单位传递数据,方便修改
回复

使用道具 举报

发表于 2009-7-6 11:28:24 | 显示全部楼层
把目标距离放远点比较cool些,你这个截图不太能显示出来~

还是施放时即创造所有bolt而不是在delay到期时么
回复

使用道具 举报

 楼主| 发表于 2009-7-6 11:53:41 | 显示全部楼层
因为是用单位传递数据的。。

话说不看懂你这函数什么意思还真没法改
回复

使用道具 举报

发表于 2009-7-6 17:09:31 | 显示全部楼层
帅死了
回复

使用道具 举报

发表于 2009-7-6 18:22:11 | 显示全部楼层
还好玩.
回复

使用道具 举报

发表于 2009-7-6 18:24:46 | 显示全部楼层
引用第4楼eff于2009-07-06 11:53发表的  :
因为是用单位传递数据的。。

话说不看懂你这函数什么意思还真没法改
你可以先全部创建然后隐藏呵,到点再show

函数核心部分是纯数学…

我这个是定时间抵达的,所以距离近时感觉较慢
需要弄成按距离么?
回复

使用道具 举报

发表于 2009-7-7 04:00:22 | 显示全部楼层
这应该叫可变弧度弹道=v= 曾经用T做这个 因为太麻烦么耐心就放弃了...还是JASS方便 函数偶收下了
回复

使用道具 举报

发表于 2009-7-7 10:45:47 | 显示全部楼层
这个每个飞弹是厚薄不同的心形曲线,不是普通弧线(图片里看不太出来,放远了比较明显)
回复

使用道具 举报

 楼主| 发表于 2009-7-7 11:49:31 | 显示全部楼层
另外提一点
IConfig(val,min,max)会返回val介于max和min之间的一个值
回复

使用道具 举报

发表于 2009-7-7 13:13:52 | 显示全部楼层
=v= 安啦安啦 偶看出来了
明白是什么意思
回复

使用道具 举报

发表于 2009-7-7 16:21:21 | 显示全部楼层
不错的曲线公式、、hmmm、、
回复

使用道具 举报

发表于 2009-7-9 16:58:02 | 显示全部楼层
是的,非常美丽。
回复

使用道具 举报

发表于 2009-7-9 16:58:44 | 显示全部楼层
手痒忍不住点了致谢。
回复

使用道具 举报

发表于 2009-7-9 19:07:01 | 显示全部楼层
第二个函数有两个单位变量泄露,技能SET NULL 一下
回复

使用道具 举报

发表于 2009-7-9 21:58:11 | 显示全部楼层
太漂亮了,多谢提供!!!!
回复

使用道具 举报

 楼主| 发表于 2009-7-10 08:46:59 | 显示全部楼层
哦对,忘记了泄漏。
以补上
回复

使用道具 举报

发表于 2009-7-13 17:20:10 | 显示全部楼层
支持了。。算法盲路过。。。
回复

使用道具 举报

发表于 2009-7-14 17:55:42 | 显示全部楼层
我完全不懂的JASS……
效果很好很强大~~
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-4 16:40 , Processed in 0.201255 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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