魔兽争霸地图编辑器3AI编辑器在编写AI的时候是用...

导读:为了控制AI我们使用了一个定时器(timer).我写了一个函数StartAI来获,这是演示地图中的空的AILoop函数和StartAI函数(这里给的只是一个框架,命令他移动到地图中心的生命泉水,然后命令英雄巡逻到地图的一个随机坐标,localstringh//Createalocalstringvariable//Paladin//Herewe’llinitialisethePaladin’s
local string h // Create a local string variable // Paladin // Here we’ll initialise the Paladin’s skills, repeat this for all other heroes
set h = UnitId2String('Hpal') // Store the returned value of UnitId2String(‘Hpal’) in the local
call StoreInteger(udg_GameCache, h, \'AHhb') // One of his base skills is Holy Light, store it as “BaseSkill1”
call StoreInteger(udg_GameCache, h, \Shield as “BaseSkill2”
call StoreInteger(udg_GameCache, h, \Aura as “BaseSkill3”
call StoreInteger(udg_GameCache, h, \'AHre') // Store Resurrection as his “UltimateSkill” ? // Repeat for each Hero. endfunction
接着是我的AI触发器的InitTrig部分: function InitTrig_AI takes nothing returns nothing
local integer i = 0
set gg_trg_AI = CreateTrigger(
exitwhen i > 11
call TriggerRegisterPlayerEventLeave( gg_trg_AI, Player(i) )
set i = i + 1
call TriggerAddAction( gg_trg_AI, function PlayerLeaves )
call ExecuteFunc(\endfunction
为英雄开启AI系统 为了控制AI我们使用了一个定时器(timer).我写了一个函数StartAI来获取一个单位的类型:英雄(请在演示地图中查看这个函数)。这个函数只是创建一个定时器,并且\绑定\在这个英雄身上,并且开启这个定时器。
这是演示地图中的空的AILoop函数和StartAI函数(这里给的只是一个框架,等下我们将展示一些动作函数,但是你起码必须先把function和endfunction写上去以保证WE不报错) :
function AILoop takes nothing returns nothing endfunction
function StartAI takes unit hero returns nothing
local timer m = CreateTimer()
call AttachObject(m, \
call TimerStart(m, 0, false, function AILoop)
set m = null endfunction
注意,我的这个StartAI函数通过将periodic参数设置为false来达到使定时器只执行一次的目的(以后我们还会来讨论它的).
现在,你就可以在你的英雄选择系统中当由电脑控制的玩家选择英雄时调用这个函数,并且在玩家离开游戏的时候执行这个函数。检测玩家是否拥有一个英雄,如果它拥有,调用这个函数来开启那个英雄的AI系统。例如:
function PlayerLeaves takes nothing returns nothing
local player p = GetTriggerPlayer()
call DisplayTextToForce(bj_FORCE_ALL_PLAYERS, GetPlayerName(p)+\has left the game.\
if udg_Hero[GetPlayerId(p)] != null then
call StartAI(udg_Hero[GetPlayerId(p)])
set p = null endfunction
注意:这个函数将使AI系统控制离开的玩家的英雄,但是这也不是必要的,你也可以做别的事情。
使这个AI做些什么
当定时器终止的时候我们希望它做了这些事情:
●如果英雄死亡,等待他复活。
●如果英雄将要死亡,命令他移动到地图中心的生命泉水。
●如果英雄状态良好,检测是否有敌人在附近。如果有,则命令英雄攻击它。
否则就检测是否有物品在附近,如果有的话,发送一个巧妙
的命令让英雄拣起它。然后命令英雄巡逻到地图的一个随机坐标。
●如果英雄是活着的而且有未使用的技能点,学习一个技能。
我们由变量的声明开始。注意在我函数里面的实变量\,它定义了在定时器再次启动前所经过的时间,这样我们就可以在英雄死亡的时候等待短一点的时间,而在他攻击的时候等待长一点的时间。这个变量初始化值为5。
局部变量的声明: function AILoop takes nothing returns nothing
local string a = GetAttachmentTable(GetExpiredTimer())
local unit h = GetTableUnit(a, \
local rect i
local location r
local real x = GetUnitX(h)
local real y = GetUnitY(h)
local group g
local boolexpr b
local boolexpr be
local unit f
local string o = OrderId2String(GetUnitCurrentOrder(h))
local real l = GetUnitState(h, UNIT_STATE_LIFE)
local real e = 5 ?
我们由检测英雄是否死亡开始,如果他死亡了,设置\为1.5(因为在复活以后等待5秒的时间太长了,我们并不想这样).
当英雄的生命值\为0时,设置\为1.5来使定时器更加频繁的检测英雄是否复活. ?
if l <= 0 then
set e = 1.5
接着我检测英雄的生命是否低于最大生命值的20%.如果是的,命令英雄移动到生命泉并且设置\为3. 当英雄的生命值少于最大生命值的20%时,命令英雄移动到生命泉的位置。 ?
if l < GetUnitState(h, UNIT_STATE_MAX_LIFE)/5 then
call IssuePointOrder(h, \GetUnitX(gg_unit_nfoh_0001), GetUnitY(gg_unit_nfoh_0001))
set e = 3 ?
如果英雄的状态良好,检测他是否处在一个普通命令中(防止它打断了通魔技能).如果是一个标准命令,我们再检测在500的半径内是否有敌人存在.如果存在敌人,简单的发出一个攻击命令(不要改变\的值,5秒对于这个情况刚刚好).
function AIFilterEnemyConditions takes nothing returns boolean
return GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), GetOwningPlayer(GetAttachedUnit(GetExpiredTimer(), \endfunction
if ((o == \or (o == \or (o == \or (o == \or (o == \
set g = CreateGroup()
set b = Condition(function AIFilterEnemyConditions)
call GroupEnumUnitsInRange(g, x, y, 500, b)
set f = FirstOfGroup(g)
if f == null then ?
call IssueTargetOrder(h, \
call DestroyGroup(g)
call DestroyBoolExpr(b)
如果没有敌人存在,再检测物品.如果发现物品,再检测是否为一个提升状态的物品.如果不是,检测英雄物品栏是否有空栏,有的话就命令英雄将它拣起来.
function AISetItem takes nothing returns nothing
set bj_lastRemovedItem=GetEnumItem() endfunction
function AIItemFilter takes nothing returns boolean
return IsItemVisible(GetFilterItem()) and GetWidgetLife(GetFilterItem()) > 0 endfunction
function AIHasEmptyInventorySlot takes unit u returns boolean
return UnitItemInSlot(u, 0) == null or UnitItemInSlot(u, 1) == null or UnitItemInSlot(u, 2) == null or UnitItemInSlot(u, 3) == null or UnitItemInSlot(u, 4) == null or UnitItemInSlot(u, 5) == null > 0 and endfunction
if f == null then
set i = Rect(x-800, y-800, x+800, y+800)
set be = Condition(function AIItemFilter)
set bj_lastRemovedItem=null
call EnumItemsInRect(i, be, function AISetItem)
if bj_lastRemovedItem != null (GetItemType(bj_lastRemovedItem) AIHasEmptyInventorySlot(h)) then
call bj_lastRemovedItem)
call RemoveRect(i)
call DestroyBoolExpr(be) ?
如果物品栏没有空位,或者没有发现物品,则命令英雄到一个随机地点寻找新的目标. ?
set r = GetRandomLocInRect(bj_mapInitialPlayableArea)
call IssuePointOrderLoc(h, \
call RemoveLocation(r) ?
linzefei 发短消息
linzefei (橙zi 174)当前离线
我从来没出现过
主题108 精华2 积分50383 阅读权限120 在线时间3947 小时 最后登录
IssueTargetOrder(h, \== ITEM_TYPE_POWERUP and or 包含总结汇报、文档下载、专业文献、IT计算机、资格考试、考试资料、旅游景点、word文档、应用文书以及魔兽争霸地图编辑器.AI制作等内容。本文共4页
相关内容搜索君,已阅读到文档的结尾了呢~~
魔兽争霸地图编辑器 魔兽争霸ai地图下载 魔兽争霸ai地图 魔兽争霸防守地图ai 魔兽争霸3编辑器 魔兽争霸编辑器 魔兽争霸模型编辑器 魔兽争霸3ai编辑器
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
魔兽争霸地图编辑器.AI制作
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

参考资料

 

随机推荐