302 Found
《dota2地图编辑器》第三讲—代码
[MOBA论坛] [已跟帖条]2015-10-30 11:05:42 作者:Mace_Davis 来源:本站原创
想必对于各位初入门的作者们来说,最关心的既不是地形,也不是音效,或者别的什么,而是程序方面吧,那么本篇将对程序部分进行一定的教学。
d2wt的程序部分涵盖到了你游戏的方方面面,v社的官方是这么定义的:地图的脚本代码定义了游戏规则,这个游戏规则就包含你的单位,物品,技能,以及所有的事件(对于曾经war3的作者来说也可称为触发器)。
首先我要强调的是,也是之前说过的,d2wt的编程语言为lua,lua之所以能被称为编程语言,是因为......好吧其实我也不知道,但是其非常优越的易扩展性,简单小巧并且高效率,就足以让它活跃在各个领域,当然我所知道的也就是游戏领域了,但是你们或许想不到,wow功能极为强大的宏就是lua,还有你们每个人手机上的手游的大部分可见性功能均为lua编写,以及很多端游的部分功能,均可以使用lua编辑更新,它的强大功能暂不赘述,后面会提供lua的学习文档,前十章学完即可让你顺利的在d2wt里实现你的想法(本人只用了6个小时将前十章学完,即可上手),下面开始正文。
上文也说过,d2wt的程序部分分为单位,物品,技能,事件,那么将一一讲之:
单位:
V社为大家在制作单位时提供了很大的方便,使用kv(KeysValue(键值)),大家可以把kv理解成一张excel表,相信excel大家都不陌生,对,它就是一张表,作者们需要做的就是把对应的值填进去即可,很难吗?我都填了十几年的表了,一点都不难对不对~介绍下这个表:
点击下载常量表格:http://moba.uuu9.com/thread-4402210-1-1.html
无论是英雄也或者是单位,都需要KV表,只不过不在一个文本文档里面而已,分别是npc_heroes_custom,npc_units_custom,但是你只需要填你想更改的值,而不是必须全部都要填写,就像这样:
"npc_dota_hero_juggernaut"
{
"override_hero" "npc_dota_hero_juggernaut"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"Ability1" "juggernaut_slash"
"Ability2" "juggernaut_cleave"
"Ability3" ""
"Ability4" ""
"AttackDamageMin" "0"
"AttackDamageMax" "0"
"AttackRate" "1000"
"AttackAnimationPoint" "1000"
"MovementTurnRate" "4.0"
"StatusHealthRegen" "1.0"
"StatusManaRegen" "1.0"
"VisionDaytimeRange" "1200"
"VisionNighttimeRange" "700"
}
对了,大部分的0和1都是是否的意思,0为否,1为是
技能:
和上面的单位kv设置其实差不多,至于区别,大家可以在官方WIKI上查看
当然你也可以制作lua技能,lua技能会更为有趣好玩,因为它不是固定填表了,只是需要发挥你的想象力
物品:
其实我想说物品也是填表,真的区别也不大,不同的是有些常量不同以及填写的文件不同(npc_items_custom),在前面的内容写完后,后面填写键值的时候填上你需要定义的即可,下面附上物品常量表:
再来一发栗子:
"item_orb_of_passage"
{
"BaseClass" "item_branches"
"AbilityTextureName" "item_gem"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"Model" "models/props_gameplay/gem01.vmdl"
"ItemCost" "0"
"ItemShopTags" ""
"ItemQuality" "component"
"ItemAliases" ""
"ItemPurchasable" "0"
"ItemSellable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE"
"AbilitySpecial"
{
"01"
{
"var_type" "FIELD_INTEGER"
"bonus_all_stats" "0"
}
}
}
触发器(事件):
请各位在上文贴的官方wiki链接里自行食用,这里只举个基本栗子供大家参考:
function CRPGExample:GrantItemDrop( hDeadUnit )
if hDeadUnit.itemTable == nil then
return
end
local flMaxHeight = RandomFloat( 300, 450 )
if RandomFloat( 0, 1 ) > 0.6 then
local sItemName = GetRandomElement( hDeadUnit.itemTable )
self:LaunchWorldItemFromUnit(sItemName,flMaxHeight,0.5,hDeadUnit )
end
end
这个例子的意思是定义一个函数xxx,如果某个单位没死则返回,如果死亡了,则随机一个数,如果这个数字大于0.6,则掉落某个物品,对,就是这样。
看到这里你也许会茫然,因为你什么都还不知道,我便这么简单的讲完了,这里我只能很抱歉的说明一下,学过程序或者lua的作者们应该能看懂上面这些例子,这些只是简单的实现某个功能,而如何实现这些功能则需要大量调用官方api,至于api在哪,仍在上文贴的wiki链接中,所以如果你想实现酷炫的技能或者叼炸天的单位什么的,请去背所有的相关api,或者在做这些的时候打开那个网站,去找你需要的东西。
至于程序这方面的东西,如果真的要放开讲,我讲几天几夜也讲不完,最重要的是设计核心,而设计核心存在于你的作图灵感中,我无法获取,当然我也不可能把自己还没上线的地图的设计核心讲出来,所以如果需要熟悉这一点,只能自己去摸索,有什么问题欢迎提问,我可以抽时间解答,我曾经有一名老师这样讲过,学习最快的办法是问,你不问不实践只看书什么都不可能会。
lua学习文档
自动补全d2wt常量的lua编辑器(点击此处到论坛下载)
看大神和妹子直播 尽在游久网直播聚合中心:http://tv.uuu9.com/?game=dota2
最新最快最全主播直播预告,游久网直播导航:http://hao.uuu9.com/