[AI] AI的跳跃

到百度贴吧首页
新闻   网页   贴吧   知道   MP3   图片   视频   百科
    吧内搜索 | 帮助
  • 共有13篇贴子

[AI] AI的跳跃

1楼

AI的跳跃
本篇文章的大纲如下
1.AI跳跃的好处
2.视频展示
3.人物跳跃动作解析
4.如何禁止人物随意跳跃
5.控制人物大小跳跃的方法

为什么要让人物跳跃呢?因为跳跃可以加快攻击节奏,或在敌人起身时给予多择,以跳攻击破敌人蹲防;在掌握人物跳跃特性后,可以做出不同种类的攻击组合,主动的瓦解对手的防御或攻击。举几个简单的例子,牌佬中跳重拳后可以接烈火连段、八神小跳百合折打背、Adel大跳闪飞行道具,牙刀的跳跃组合更是五花八门。废话不多说,先进一段影片。

http://v.youku.com/v_show/id_XMzg2NjI4MzI=.html

克拉克对大门
影片最值得注意的是克拉克在大门起身时,原地小跳轻拳进连段造成的重伤害,还有前跳踢牵制大门空中进攻。

新迪奥对Geese
这是滥用跳跃的例子,好孩子千万别学…( ′-`)y=

2楼

想要让AI跳跃,必先从认识人物的跳跃开始,通常,人物会有[Statedef 40]这个起跳动作,跳跃参数如跳跃方向、速度、大小跳都在起跳动作预先判别好,再由[Statedef 50]这个跳跃浮空动作来实现,一般流程流程如后,[Statedef 40]判断玩家输入前大跳时,[Statedef 50]就实现前大跳的动作。

每一个作者都有习惯上的差异,代码不完全相同,但万变不离其中,本文以Beppu的Kyo99为例解说:

; JUMP_UP START
[Statedef 40]
type = S
physics = S
anim = 40
ctrl = 0
velset = 0,0
facep2 = 1

[State 40, NOTHITBY] ;KOF的起跳动作对投技无敌
type = nothitby
trigger1 = 1
value = , NT, ST, HT

;接下来Beppu用Var(8)这参数控制人物的跳跃方向
;var(8)=0,原地跳
;var(8)=1,前跳
;var(8)=-1,后跳
;var(8)=2,前大跳
;var(8)=-2,后大跳

[State 40, 4];Var(8)是控制人物跳跃方向的代码,须先归零
type = VarSet
trigger1 = Time = 0
var(8) = 0;代表原地跳跃

[State 40, 5];当按键输入「前」,就进行前跳
type = VarSet
triggerall = var(59) != 1;当AI开启时,这项代码不执行
trigger1 = Command = "holdfwd";玩家输入「前」
trigger1 = var(8) != 2;跟前大跳做区分
var(8) = 1;前跳

[State 40, 6]
type = VarSet
triggerall = var(59) != 1
trigger1 = Command = "holdback";玩家输入「后」
trigger1 = var(8) != -2
var(8) = -1;后跳

[State 40, 7]
type = VarSet
triggerall = var(59) != 1
triggerall = Time = 0
triggerall = Command = "holdfwd"
trigger1 = Command = "longjump";玩家输入大跳指令时
trigger2 = PrevStateNo = 100 ; 玩家再奔跑途中输入跳指令时
trigger3 = Prevstateno = [10,12];玩家在蹲动作输入跳指令时
var(8) = 2;让人物进行前大跳

[State 40, 8];后大跳可以前大跳类推
type = VarSet
triggerall = var(59) != 1
triggerall = Time = 0
triggerall = Command = "holdback"
trigger1 = Command = "longjump"
trigger2 = Prevstateno = [10,12]
var(8) = -2

[State 201, 1] ; Play sound when jumping (Light)
type = PlaySnd
trigger1 = AnimElem = 1;trigger1 = Time = 0
trigger1 = var(8) != -2
trigger1 = var(8) != 2
value = 5,7
volume = 0

;make sure running snd is off
[State 40, 9]
type = StopSnd
trigger1 = Time = 0
channel = 20;running snd

[State 40, 10];转入小跳动作,这是Beppu个人的写作习惯
type = ChangeState
triggerall = var(59) != 1
triggerall = AnimTime = 0 
;trigger1 = var(9) != 1
trigger1 = Command != "holdup" && prevstateno != 100
value = 99;44

[State 40, 11];设置人物跳跃速度,以Var(8)的数值判断
type = VelSet
trigger1 = AnimTime = 0
x = IfElse(var(8)= 0, Const(velocity.jump.neu.x), IfElse(var(8)>0, Const(velocity.jump.fwd.x), Const(velocity.jump.back.x)))
y = Const(velocity.jump.y)


[State 40, 13];转入普通的跳跃动作
type = ChangeState
trigger1 = AnimTime = 0
value = 50
ctrl = 1

3楼

;Beppu自设的小跳动作
; JUMP_LOW
[Statedef 99]
type = A
physics = N
anim = 99
velset = 0, -8.4
ctrl = 1

;Beppu的人物在空中受身时会进入本动作,他这边做限制
;但这项代码实际上不成立
[State 201, CTRL LIMITTER] ;Can't attack after recovery
type = ctrlset
trigger1 = Time = 0
trigger1 = prevstateno = 5040;轻攻击受身动作
trigger1 = prevstateno = 5210;重攻击受身动作
value = 0;表示不能操作

[State 201, 3];制造残影
type = Afterimage
triggerall = Time = 1
triggerall = vel x != 0
trigger1 = var(8) = -2
trigger2 = var(8) = 2
time = 10
PalBright = 0, 0, 0
PalContrast = 250,250,250
PalAdd = 0, 0, 0
PalMul = 1,1,1
Length = 7
FrameGap = 3

[State 201, 4] ; Shadows off
type = Afterimage
trigger1 = Time = 11
time = 0

[State 201, PUSH];表示跳跃时可以穿越敌人
type = playerpush
triggerall = anim = 41
triggerall = p2statetype != A
triggerall = animelem = 2, >= 0
triggerall = animelem = 5, <= 0
trigger1 = var(8) = -2
trigger2 = var(8) = 2
value = 0

[State 201, 6];前后速度设定
type = VelSet
trigger1 = Time = 0
trigger1 = Var(8) = 1
x = 3.31
;剩下的都可以类推
[State 201, 8]
type = VelSet
trigger1 = Time = 0
trigger1 = Var(8) = -1
x = -3.31

[State 2041, 2] ;
type = PlaySnd
triggerall = Time = 0
trigger1 = var(8) = 2
trigger2 = var(8) = -2
value = 5,26
volume = 30

[State 201, 7]
type = VelSet
trigger1 = Time = 0
trigger1 = Var(8) = 2
x = 4.965

[State 201, 9]
type = VelSet
trigger1 = Time = 0
trigger1 = Var(8) = -2
x = -4.965

[State 201, 9];重力加速度
type = Veladd
trigger1 = 1
y = .6375

[State 201, 15] ;Short;进入着地动作
type = Changestate
trigger1 = vel y > 0 && pos y >= -11
value = 52
ctrl = 0

4楼

;一般人物通用的[Statedef 50]如下,仅反应[Statedef 40]的跳跃参数设置,本文不多做说明
;---------------------------------------------------------------------------
; Jump Up
[Statedef 50]
type = A
physics = A

;Sysvar(1)是系统变量,控制人物的跳跃前后
[State 50, 1]
type = VarSet
trigger1 = Time = 0
sysvar(1) = 0

[State 50, 2];变换跳跃动作的代码
type = ChangeAnim
trigger1 = Time = 0
value = ifelse((vel x)=0, 41, ifelse((vel x)>0, 42, 43))

[State 50, 3] ;变换跳跃动作的代码
type = ChangeAnim
trigger1 = Vel y > -2
trigger1 = SelfAnimExist(anim + 3)
persistent = 0
value = Anim + 3

5楼

最后一段发不出来…

6楼

支持。

7楼

文章最后一段百度说要审核!?这状况我第一次看到。

8楼

技术帖 支持`

9楼

那限制了AI跳跃,AI就不能跳了该怎么办?以部分作者和笔者的做法是独立写一个AI专用的起跳动作,将[Statedef 40]复制,改写成[Statedef 39],把AI跳跃的参数写定,例如笔者写于N-Geese的范例码如下:

; Jump Start
[Statedef 39]
type = S
physics = S
anim = 40
ctrl = 0
sprpriority = 1

[State 40, 1];
type = VarSet
trigger1 = p2bodydist X >20
var(4) = 1;控制AI大小跳的参数

[State 40, 1]
type = VarSet
trigger1 = p2bodydist X <= 20
var(4) = 0

[State 40, 2]
type = VarSet
trigger1 = 1
sysvar(1) = 1

[State 40, 4]
type = VelSet
trigger1 = AnimTime = 0
trigger1 = Var(4) = 0
x = ifelse(sysvar(1)=0, const(velocity.jump.neu.x), ifelse(sysvar(1)=1, const(velocity.jump.fwd.x), const(velocity.jump.back.x)))
y = const(velocity.jump.y)

[State 40, 4]
type = VelSet
trigger1 = AnimTime = 0
trigger1 = Var(4) = 1
x = ifelse(sysvar(1)=0, const(velocity.jump.neu.x), ifelse(sysvar(1)=1, const(velocity.jump.fwd.x), const(velocity.jump.back.x)))
y = -6

[State 40, 6]
type = ChangeState
trigger1 = AnimTime = 0
value = 50
ctrl = 1

各位可以依实际定下各类参数,实现大小跳

差不多就这样,接下来你只要设置AI何时进行自订跳跃动作即可,例如笔者写于N-Geese的范例码如下:

[state -3]
type = ChangeState
value = 39
triggerall = roundstate = 2
triggerall = Var(59) = 1 
triggerall = (!enemynear,NumProj) && (!enemynear,NumHelper)
triggerall = enemynear,power < 1000
triggerall = frontedgebodydist > 60
trigger1 = (ctrl || stateno = 20) && (random = [370,620]) && p2stateno = [120,159]
trigger1 = facing != enemynear,facing &&statetype != A && p2bodydist X = [0,50]
trigger2 = (ctrl || stateno = 20) && (random = [670,790]) && p2stateno = [120,159]
trigger2 = facing != enemynear,facing &&statetype != A && p2bodydist X = [50,128]

本文视频克拉克作者OrochiKOF97的控制跳跃是另一种模式,他直接在[Statedef 40]内写入AI跳跃的控件,代码如下:

[State 40, AI]
type = VarSet
triggerall = var(33) = 1;AI开启时
trigger1 = !time && (p2bodydist x > 0)
var(1) = 2;前大跳

最后,什么时候要叫AI跳跃,请各位观众自行掌握人物的特性做出适当的选择,笔者不在此赘言,若有遗漏与缺失,请专家给予指正,谢谢大家。

10楼

9L前面补一段
上面解说了控制跳跃的动作后,接下来就要处理AI的跳跃了。

第一步先限制AI开启时,人物不能以按键输入「上」而跳跃,否则计算机随意输入跳跃指令会遭到对手反击,譬如说,对手是有AI的K9999,计算机在他有一颗气的情况下跳近他面前,很容易中「月」,为了避免这种状况,部分作者和笔者会在[Statedef 40]加入以下指令限制AI跳跃。

[state 40]
type = changestate
trigger1 = time = 0 && var(59) = 1;AI进入本动作时,自动转为站立动作
value = 0
ctrl = 1

11楼

上面解说了控制跳跃的动作后,接下来就要处理AI的跳跃了。

第一步先限制AI开启时,人物不能以按键输入「上」而跳跃,否则计算机随意输入跳跃指令会遭到对手反击,譬如说,对手是有AI的K9999,计算机在他有一颗气的情况下跳近他面前,很容易中「月」,为了避免这种状况,部分作者和笔者会在[Statedef 40]加入以下指令限制AI跳跃。

[state 40]
type = changestate
trigger1 = time = 0 && var(59) = 1;AI进入本动作时,自动转为站立动作
value = 0
ctrl = 1

那限制了AI跳跃,AI就不能跳了该怎么办?以部分作者和笔者的做法是独立写一个AI专用的起跳动作,将[Statedef 40]复制,改写成[Statedef 39],把AI跳跃的参数写定,例如笔者写于N-Geese的范例码如下:

; Jump Start
[Statedef 39]
type = S
physics = S
anim = 40
ctrl = 0
sprpriority = 1

[State 40, 1];
type = VarSet
trigger1 = p2bodydist X >20
var(4) = 1;控制AI大小跳的参数

[State 40, 1]
type = VarSet
trigger1 = p2bodydist X <= 20
var(4) = 0

[State 40, 2]
type = VarSet
trigger1 = 1
sysvar(1) = 1

[State 40, 4]
type = VelSet
trigger1 = AnimTime = 0
trigger1 = Var(4) = 0
x = ifelse(sysvar(1)=0, const(velocity.jump.neu.x), ifelse(sysvar(1)=1, const(velocity.jump.fwd.x), const(velocity.jump.back.x)))
y = const(velocity.jump.y)

[State 40, 4]
type = VelSet
trigger1 = AnimTime = 0
trigger1 = Var(4) = 1
x = ifelse(sysvar(1)=0, const(velocity.jump.neu.x), ifelse(sysvar(1)=1, const(velocity.jump.fwd.x), const(velocity.jump.back.x)))
y = -6

[State 40, 6]
type = ChangeState
trigger1 = AnimTime = 0
value = 50
ctrl = 1

12楼

终于发完了,但文章也被切的零零落落

13楼


发表回复

内 容:
用户名:
  
©2010 Baidu 贴吧协议  意见反馈