找回密码
 点一下
查看: 5131|回复: 10

非常简单的JASS之三(技能)——根据单位的属性决定伤害并显示的风暴之锤

  [复制链接]
发表于 2008-8-28 17:26:22 | 显示全部楼层 |阅读模式
最近好象有人说了一句话,让我彻底沸腾起来了。就先做了个JASS技能(有详解):
我做这个技能的目的是为了最初级的不会JASS的人准备的,如果觉得太简单了,我以后还会发新的JASS技能上来

效果:
对单位使用风暴之锤时
伤害公式这样计算:
获得 【施法单位的 力量】
乘以 风暴之锤的等级
乘以 250
减去 【目标单位的 力量】*15的数值
乘以 随机数:1到1.33

并把这个伤害用漂浮文字显示出来。

怎么用JASS来做呢??
首先,我的Trigger是:
[trigger]
对战初始化
    事件
        单位 - 山丘之王 0000 <预设> 发动技能效果
    条件
    动作
        如果所有条件成立则做动作1,否则做动作2
            If - 条件
                (施放技能) 等于 风暴之锤
            Then - 动作
                自定义代码: call Bolt_Spell(GetTriggerUnit(),GetUnitAbilityLevel(GetTriggerUnit(),GetSpellAbilityId()),GetSpellTargetUnit())
            Else - 动作

[/trigger]
那么,也就是说:
单位在释放风暴之锤时,会调用一个Bolt_Spell的函数,并传递给了他这些:
[codes=jass]
GetTriggerUnit()
翻译成触发器就是:  触发单位  的意思
GetUnitAbilityLevel(GetTriggerUnit(),GetSpellAbilityId())
翻译成触发器就是
获得单位的技能等级(触发单位,释放的技能ID)
GetSpellTargetUnit()
翻译成触发器就是:  技能释放目标  的意思
[/codes]
恩恩?这些有什么用呢?那么看看Bolt_Spell的原型吧:
[codes=jass]
function Bolt_Spell takes unit u,integer ability_level,unit target returns nothing
                        Bolt_Spell的开始,takes就是刚刚给他传递的
            GetTriggerUnit()
            GetUnitAbilityLevel(GetTriggerUnit(),GetSpellAbilityId())
                        GetSpellTargetUnit()这些数据
local real damage = Bolt_GetDamage(u,ability_level,target)
                        声明一个 实数 类型的局部变量
            设置 这个变量 为 Bolt_GetDamage,并传递给了Bolt_GetDamage这些:
            u(GetTriggerUnit())
                        ability_level(GetUnitAbilityLevel(GetTriggerUnit(),GetSpellAbilityId()))
                        target(GetSpellTargetUnit()这些数据)
            最后获得了这个函数返回的数据
call UnitDamageTargetBJ( u, target, damage, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
                        翻译成触发器为:
            单位——伤害目标
            单位 - 命令 (u) 对 (target) 造成 damage 点伤害,攻击类型: 法术 伤害类型: 普通
call CreateTextTagUnitBJ( I2S(R2I(damage)), target, 4, 10, 100, 0, 0, 0 )
                        翻译成触发器为:
            漂浮文字——创建漂浮文字(普通单位)
            漂浮文字 - 创建漂浮文字:(转换 (转换 damage 为整数) 为字符串) 在 target 头顶Z轴偏移 4.00 处,字体大小: 10.00 ,颜色值:(100.00%, 0.00%, 0.00%) ,透明度: 0.00%
call SetTextTagVelocityBJ( bj_lastCreatedTextTag, 64, GetUnitFacing(u) )        //bj_lastCreateTextTag是 【最后创建的漂浮文字】
                        翻译成触发器为:
            漂浮文字——设置速率
            漂浮文字 - 设置 (最后创建的漂浮文字) 的移动速率为 64.00 ,方向为 ((u) 的面向角度) 度
call SetTextTagPermanent( bj_lastCreatedTextTag, false )
                        翻译成触发器为:
            漂浮文字——设置永久性
            漂浮文字 - 设置 (最后创建的漂浮文字) : 禁用 永久显示.
call SetTextTagLifespan( bj_lastCreatedTextTag, 5 )
                        翻译成触发器为:
            漂浮文字——设置生命周期
            漂浮文字 - 设置 (最后创建的漂浮文字) 的生命周期为 5.00 秒
call SetTextTagFadepoint( bj_lastCreatedTextTag, 4 )
                        翻译成触发器为:
            漂浮文字——设置消逝时间点
            漂浮文字 - 设置 (最后创建的漂浮文字) 的消逝时间点为 4.00 秒
endfunction
[/codes]
先消化一下~~~~~
……………………
……………………
……………………
……………………
……………………

我们来梳理一下:
1.单位释放 【风暴之锤】
2.调用Bolt_Spell函数
3.声明一个 实数 类型的局部变量damage并设置 这个变量 为 Bolt_GetDamage(这个暂且不谈)
4.命令 释放单位 对 技能释放目标 造成 damage 点伤害,攻击类型: 法术 伤害类型: 普通
5.创建漂浮文字并设置一些属性
请仔细的再看一遍
…………
…………
…………
…………














…………
那么,最后疑点——Bolt_GetDamage我们来看看吧
[codes=jass]
function Bolt_GetDamage takes unit u,integer ability_level,unit target returns real
                        Bolt_Spell的开始,takes就是刚刚给他传递的
            u(GetTriggerUnit())
            ability_level(GetUnitAbilityLevel(GetTriggerUnit(),GetSpellAbilityId()))
            target(GetSpellTargetUnit()这些数据)
            最后返回一个 实数 类型的值
local real damage = I2R(GetHeroStr(u,true))*ability_level
                        声明一个 实数 类型的局部变量damage
            设置damage为 转换 获得(u)的英雄力量 为实数 再乘以 单位的【风暴之锤】的技能
set damage = (damage*250)-(I2R(GetHeroStr(target,true))*15)
                        设置damage为 damage*250 再减去 (转换 获得(target)的英雄力量 为实数 再乘以 15)
set damage = damage*GetRandomReal(1,1.33)
                        设置damage为 damage*随机数1到1.33
return damage
                        返回damage
endfunction
[/codes]

这就是
“获得 【施法单位的 力量】
乘以 风暴之锤的等级
乘以 250
减去 【目标单位的 力量】*15的数值
乘以 随机数:1到1.33。”
这个伤害计算的公式了。


这个技能就完成了!!




怎么样,自己动手做一做?

作业:
把 霜冻闪电(伪·锤子)的伤害公式改成:
获得 【施法单位的 力量】+【施法单位的 敏捷】的和 除以2
乘以 霜冻闪电的等级
乘以 25
减去 【目标单位的 智力】* 随机数:2到3.33 的数值
并显示这个伤害。

好了…………总算写完了……………………

不要说我哦~~

PS:补发地图:

非常简单的JASS技能——改版风暴之锤.w3x

20 KB, 下载次数: 168

评分

参与人数 1威望 +22 收起 理由
天凌逸涉 + 22 感谢分享!

查看全部评分

发表于 2008-8-28 17:30:57 | 显示全部楼层
问下下,貌似这样会发动技能时直接造成伤害,而不是投射物到达后吧?
回复

使用道具 举报

 楼主| 发表于 2008-8-28 17:41:49 | 显示全部楼层
(被自己忍无可忍的和谐掉了)
回复

使用道具 举报

发表于 2008-8-28 17:53:36 | 显示全部楼层
恩恩,对了,lz以后代码注释可以用//注释符哦,一开始那个代码看了半天没搞清楚………………
回复

使用道具 举报

 楼主| 发表于 2008-8-28 17:56:22 | 显示全部楼层
………………………………
知道了……………………
谢谢指导。
回复

使用道具 举报

发表于 2008-8-28 18:10:27 | 显示全部楼层
引用第3楼zhuzeitou于2008-08-28 17:53发表的  :
一开始那个代码看了半天没搞清楚………………
猪头在打击别人~~~
技能重在技巧~~
会jass的人一般应该不用一步一步教. 
回复

使用道具 举报

发表于 2008-8-28 18:44:55 | 显示全部楼层
额,加个PollWait就能粗略的让人感觉在命中后造成伤害........
回复

使用道具 举报

发表于 2008-8-29 11:52:17 | 显示全部楼层
LZ 可以使用动态注册,让投射物到达后再造成伤害.
回复

使用道具 举报

发表于 2008-8-29 12:14:26 | 显示全部楼层
所以说这是给刚学Jass的同学们看的啊........一出来就叫动态注册,太早了吧.......
回复

使用道具 举报

发表于 2008-8-29 12:49:51 | 显示全部楼层
相当的乱啊
新人能看懂么
回复

使用道具 举报

发表于 2008-8-31 14:02:43 | 显示全部楼层
动态注册是什么东西 貌似T没有吧
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 22:50 , Processed in 0.172772 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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