疯人¢衰人 发表于 2009-6-20 14:32:26

格斗类按键系统

这个系统就是格斗类游戏的按键系统
它的功能是辨识摇招
比如KOF97中的↓→A这类招数的辨识

globals
timer array udg_KeepTimer
integer array udg_ValueNum
constant real udg_KeepTime = 0.5 //这个是保持时间,也就是当这些时间内没有按键输入,那么前面的按键不算连续输入的内容。
boolean array udg_HoldKey
endglobals
function ClearValue takes nothing returns nothing
//计时清空按键记录
    local integer i = 1
    loop
      if GetExpiredTimer() == udg_KeepTimer then
            if udg_HoldKey then
                set udg_HoldKey = false
                set udg_ValueNum = ModuloInteger(udg_ValueNum * 10, 100000000)
                call TimerStart(udg_KeepTimer,udg_KeepTime,false,function ClearValue)
                return
            endif
            set udg_ValueNum = 0
            return
      endif
    endloop
endfunction
function ChangeValue takes player p,integer key returns nothing
//按键存储函数,用于存储按键顺序
    local integer i = GetConvertedPlayerId(p)
    set udg_ValueNum = ModuloInteger(udg_ValueNum * 10+ key, 100000000)
    call PauseTimer(udg_KeepTimer)
    call TimerStart(udg_KeepTimer,udg_KeepTime,false,function ClearValue)
endfunction
function JudgeAction takes player p returns nothing
//中心处理函数,用于控制各种出招,要注意每个动作触发的顺序,比如 ↓←↓←A一定要写在↓←A前面,否则↓←↓←A无法响应,总之就是代码长的在前面。
    local integer i = GetConvertedPlayerId(p)
    if (ModuloInteger(udg_ValueNum,1000000) == 313157) or (ModuloInteger(udg_ValueNum,1000000) == 313175) then
      call BJDebugMsg("↓←↓←A+B")
      set udg_ValueNum = 0
      return
    endif         
    if (ModuloInteger(udg_ValueNum,1000000) == 323257) or (ModuloInteger(udg_ValueNum,1000000) == 323275) then
      call BJDebugMsg("↓→↓→A+B")
      set udg_ValueNum = 0
      return
    endif   
    if ModuloInteger(udg_ValueNum,10000) == 1025 then
      call BJDebugMsg("←→A")
      set udg_ValueNum = 0
      return
    endif            
    if ModuloInteger(udg_ValueNum,10000) == 2015 then
      call BJDebugMsg("→←A")
      set udg_ValueNum = 0
      return
    endif            
    if ModuloInteger(udg_ValueNum,1000) == 315 then
      call BJDebugMsg("↓←A")
      set udg_ValueNum = 0
      return
    endif      
    if ModuloInteger(udg_ValueNum,1000) == 325 then
      call BJDebugMsg("↓→A")
      set udg_ValueNum = 0
      return
    endif            
    if ModuloInteger(udg_ValueNum,100) == 11 then
      call BJDebugMsg("←←")
      set udg_ValueNum = 0
      return
    endif   
    if ModuloInteger(udg_ValueNum,100) == 22 then
      call BJDebugMsg("→→")
      set udg_ValueNum = 0
      return
    endif   
endfunction

代码如上
另外一些其他的触发请参考演示
用法也很简单
参考演示即可(演示很简单,甚至连单位的移动都没模拟,只是进行出招判断)
注意系统最多支持8个按键的招数(如←↓→←↓→A+B)

需要注意的是对于每个英雄的出招设置,
比如↓→A和↓→A+B(AB一起按)这两个不要同时出现,
这个无法判断
当然实际的格斗中也是不会有同时出现的情况的
另外如果招数使用了同时按键(如A+B)
要把所有的可能都写在条件里(57和75)

按键记录保持时间是0.5秒(constant real udg_KeepTime = 0.5)可以自行更改

已经添加了蓄力部分(方向键的蓄力)
按住超过保持时间(默认0.5)后才算蓄力完成
蓄力招数要在蓄力键后+0
比如→蓄←A的判断码是2015而不是215
蓄力后的记录保持时间还是原来的保持时间

eff 发表于 2009-6-20 18:29:57

oooo,搓招呢

sevenΝight 发表于 2009-6-20 19:35:57

缺少C、D键~~恩恩~~要四键的~~ 

疯人¢衰人 发表于 2009-6-20 20:13:29

支持4键
演示中VCXZ为ABCD

alexries 发表于 2009-6-20 21:45:48

孔明的创意无限阿……
这个丢给某人做键盘控制地图很合适罢~

疯人¢衰人 发表于 2009-6-20 22:35:42

原打算自己做的
结果因为某个模型弄的我崩溃了
就是魔兽最开始启动时的背景

做成地形装饰物后一选择就报错……

alexries 发表于 2009-6-20 23:59:43

那能不能放弃这东西。要是这个系统出来加上很棒的动作应该会很赞

morriss 发表于 2009-6-21 08:05:40

很有创意

疯人¢衰人 发表于 2009-6-21 08:06:17

需要模型支持呢
……
自己完成不了
我不会做模型

sevenΝight 发表于 2009-6-21 08:55:04

sxlrose有模型~~八神和草雉~~

sxlrose 发表于 2009-6-21 09:37:15

收藏了~~~

用的着~~

我有 八神 草薙 神乐 和 大蛇

本来要做个 KOF前传之三神器

搁浅了

alexries 发表于 2009-6-21 10:20:01

鬼一大人的动作技能很华丽……合作罢。

疯人¢衰人 发表于 2009-6-21 11:22:51

合作?
用不着
一切都交给鬼一大人

巧樂滋聖代 发表于 2009-6-21 12:08:43

半年后的鬼一大不知道jass学得怎么样了~

alexries 发表于 2009-6-21 12:09:42

都是在我们这些虫蟊面前,都是牛人

疯人¢衰人 发表于 2009-6-21 12:14:09

引用第13楼巧樂滋聖代于2009-06-21 12:08发表的:
半年后的鬼一大不知道jass学得怎么样了~ http://bbs.islga.org/images/back.gif

当年的鬼一大人也不回J么?

巧樂滋聖代 发表于 2009-6-21 12:17:55

当初我离开时鬼一大开始学J~忘了跟谁学了~好像是卡卡~

疯人¢衰人 发表于 2009-6-21 12:22:06

我是在你回来时学的……

你走的时候我还不会呢……
忽然想起来还有很多骗了分缺没完成的技能呢……

alexries 发表于 2009-6-21 13:37:10

感觉这帖里面有两个用t高手阿……

seicx 发表于 2009-6-25 14:27:44

侃侃
页: [1] 2
查看完整版本: 格斗类按键系统