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

由浅入深学Jass - 制作自己的技能

[复制链接]
发表于 2008-4-11 11:03:48 | 显示全部楼层 |阅读模式
在上一个帖子里我们已经有了自己的函数,现在我们看看如何把这个函数在游戏中用起来。

我们需要新建一张空白地图,并把默认的初始化触发关闭,然后新建一个自己的触发,命名为Rush,如下图:

01.JPG

为了方便,我们先用WE的普通语句写好事件部分和技能的条件,这是编写技能或其他RPG内容的最基本知识,因为在WE的世界里,所有的东西都需要一根“导火线”去点燃(“触发”),这根“导火线”就是“事件”,而事件是指魔兽游戏中发生的一些特定事情,如单位死亡或单位开始施放技能等等。如果你不了解这点,建议你停止阅读本文,先去查看相关教程。

触发的基本语句有了,然后我们点击菜单上的编辑-->转化为自定义文本,如图示:

02.JPG

然后我们会看到下面的触发部分变成了纯文本,如图:

03.JPG

我们还需要建立相应的变量:

05.JPG

现在我们的工作开始了,我们要做的,是改造以下部分:

[codes=jass]function Trig_Rush_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'ANcl' ) ) then
return false
endif
return true
endfunction

function Trig_Rush_Actions takes nothing returns nothing
endfunction

//===========================================================================
function InitTrig_Rush takes nothing returns nothing
set gg_trg_Rush = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Rush, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Rush, Condition( function Trig_Rush_Conditions ) )
call TriggerAddAction( gg_trg_Rush, function Trig_Rush_Actions )
endfunction [/codes]

首先我们简化一下触发的条件,让我们的程序看起来更简介:
[codes=jass] function Trig_Rush_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'ANcl'
endfunction [/codes]
接着我们把之前做的野蛮冲撞代码放置在触发的上面,于是:
[codes=jass] function UnitrushBuff takes unit whichUnit returns boolean
if GetUnitAbilityLevel( whichUnit, 'BPSE' ) > 0 or GetUnitAbilityLevel( whichUnit, 'BSTN' ) > 0 then
return false
endif
return true
endfunction

function UnitRush_Effects takes nothing returns nothing
local real dx = GetUnitX(udg_caster) + UnitrushSpeed()*Cos(udg_angle)
local real dy = GetUnitY(udg_caster) + UnitrushSpeed()*Sin(udg_angle)
if udg_bounces == 0 or GetUnitState( udg_caster, UNIT_STATE_LIFE ) == 0.0 or not(UnitrushBuff(udg_caster)) then
call PauseTimer( udg_unitrushtimer )
set udg_caster = null
else
call SetUnitPosition( udg_caster, dx, dy )
set udg_bounces = udg_bounces - 1
endif
endfunction

function UnitRush takes unit caster returns nothing
set udg_caster = caster
set udg_angle = GetUnitFacing( caster ) * bj_DEGTORAD
set udg_bounces = R2I(UnitrushDistance()/UnitrushSpeed())
call TimerStart( udg_unitrushtimer, 0.05, true, function UnitRush_Effects )
endfunction

function Trig_Rush_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'ANcl'
endfunction

function Trig_Rush_Actions takes nothing returns nothing
endfunction [/codes]
到现在为止,我们编写的自定义函数和触发仍然不存在任何联系,那么现在我们就要把它们联系起来,这是很关键的一步,作为一个初学者,你可以不理解自定义函数的内容,但必须清楚理解这一步骤才能学会制作技能:
[codes=jass] function Trig_Rush_Actions takes nothing returns nothing
call UnitRush( GetTriggerUnit())
endfunction [/codes]
原本空白的触发动作部分,加入了这么简单的一句,它是至关重要的,它的意思是,对施放“通魔”的单位处理一系列动作,而这些动作正是我们之前在自定义函数里预设好的。从这里我们可以看到无论是Jass还是一般的触发,都是以游戏中的事件开始的,必须有相应的事件去“触发”一系列动作,才能实现所有你希望的效果。

除了核心函数,我们还需要一些辅助函数,让这个技能更真实,比如当单位被打晕的时候,技能要能停下来,因此我们加入了UnitrushBuff函数,它的作用是检查某单位有没有被打晕。

最后,要让技能顺利执行,我们还要修改一下技能本身的设定,打开单位编辑器,如下图:

由于本文主要是叙述Jass的用法,技能修改的过程就不叙述了,实在不明白的,可以把地图下回去看。

整个过程均为文本操作,而且WE中对纯文本的支持很不好,因此建议下载一个叫TESH的工具,它能嵌入你的WE中,方便你的Jass编辑。
 楼主| 发表于 2008-4-11 11:13:12 | 显示全部楼层
地图在此下载.

sample.w3x

18 KB, 下载次数: 110

回复

使用道具 举报

发表于 2008-4-11 12:35:10 | 显示全部楼层
很好 很基础 估计又会很多人步入JASS大门
回复

使用道具 举报

发表于 2008-4-11 15:56:10 | 显示全部楼层
呃。。。。我是新手,感觉还是有点难看懂
回复

使用道具 举报

发表于 2008-4-12 16:00:08 | 显示全部楼层
不错!!!!
回复

使用道具 举报

发表于 2008-4-13 10:44:54 | 显示全部楼层
还是混乱着
回复

使用道具 举报

 楼主| 发表于 2008-4-14 11:32:13 | 显示全部楼层
我的帖子会着重讲制作技能的思路, 而不会逐字逐句分析, 如果遇到不懂的句子, 你需要到网上翻阅其用法或相关教程.
回复

使用道具 举报

发表于 2008-4-17 14:49:33 | 显示全部楼层
澄色加亮啊。。。我都不敢轻易去用。。
回复

使用道具 举报

发表于 2008-5-10 22:22:59 | 显示全部楼层
检测到有新教程 放入TXT放入学习机了 然后  》顶《
回复

使用道具 举报

发表于 2009-1-5 04:40:48 | 显示全部楼层
很好..我个人学会了.
回复

使用道具 举报

发表于 2009-1-21 11:44:53 | 显示全部楼层
好东西,顶了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 00:06 , Processed in 0.268310 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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