《Genesis-3D開源遊戲引擎--橫版格鬥遊戲製做教程04:技能的輸入與檢測》

4.技能的輸入與檢測

概述:

技能系統的用戶體驗,制約着玩家對整個遊戲的體驗。遊戲角色的技能華麗度,連招的順利過渡,以及逼真的打擊感,都做爲一款遊戲的賣點吸引着玩家的注意。開發者在開發遊戲初期,會根據玩家對此類遊戲的慣性操做,設定技能控制按鍵。同時Genesis引擎爲開發者提供的衆多API接口,包含了按鍵過程、按鍵按下和擡起的識別功能。當玩家根據遊戲設定的按鍵操做,輸入後。系統會記錄按鍵操做的命令,而後程序經過對玩家當前輸入狀態,以及輸入的過程檢測,斷定技能輸入是否爲有效輸入。 c#

技能系統的用戶體驗,制約着玩家對整個遊戲的體驗。遊戲角色的技能華麗度,連招的順利過渡,以及逼真的打擊感,都做爲一款遊戲的賣點吸引着玩家的注意。開發者在開發遊戲初期,會根據玩家對此類遊戲的慣性操做,設定技能控制按鍵。同時Genesis-3D引擎爲開發者提供的衆多API接口,包含了按鍵過程、按鍵按下和擡起的識別功能。當玩家根據遊戲設定的按鍵操做,輸入後。系統會記錄按鍵操做的命令,而後程序經過對玩家當前輸入狀態,以及輸入的過程檢測,斷定技能輸入是否爲有效輸入。 緩存

原理:

按鍵定義->輸入->檢測輸入狀態->檢測輸入過程。函數


圖4-1動畫

技能輸入檢測的實現:

步驟1:網站

引擎提供了相應的API接口,供開發者使用,其中就包括三個與按鍵相關的接口,一個是按鍵過程當中、按鍵按下、按鍵擡起。在ScriptRuntime命名裏,有個Input類下,爲情提供了相應接口。開發者能夠直接定義按下當前操控間,所做的操做。以攻擊爲例,以下所示。ui

1 if (Input.KeyDown(Code.J))
2 {
3  Attack_N(Code.J);
4 }

步驟2:3d

檢測輸入條件,即玩家當前狀態的輸入權限。code

玩家根據開發者對遊戲的設定,進行相關按鍵操做。當玩家按下按鍵以後,程序記錄按鍵事件。以後按照開發者定義的檢測規則,斷定玩家輸入是否有效。因爲按鍵所屬的功能不一樣,相應篩選機制也是不一樣的。技能的輸入條件檢測,能夠經過動畫區間幀來控制。玩家權限的斷定,是否鍵輸有效。攻擊鍵J舉例,原理圖,如圖4-1-1所示。接口


圖4-2-1遊戲

橫向爲動畫幀,上面的A、B、C、D、E等表明所在時間軸上響應的幀數。斷定玩家連招輸入權限,程序逐幀檢測當前幀玩家所屬狀態。在A點輸入J攻擊鍵後,程序遍歷每幀玩家狀態。在A-B動畫區間幀內玩家爲無權限輸入,玩家即便有鍵入指令,程序也不認爲輸入狀態有效,進而不作後面的檢測。只有在B-C動畫區間內時,程序斷定玩家有輸入權限,玩家在該動畫區間內得到鍵入權限。如在該區間內有攻擊鍵J的輸入,程序即遍歷後面的動畫幀,若無有限鍵入,即中止這次連招技能的輸入狀態的檢測。

步驟3:

private PlayerRight m_eRight = PlayerRight.ReceiveKeyboard; //玩家權限,包含:接收按鍵操做、對怪物的有效碰撞傷害

步驟4:

動畫區間檢測輸入狀態,代碼以下所示。

001
public class SkillAnimation
002
{
003
 public SkillAnimation()
004
 {
005
  m_vCallback = new Dictionary< UInt32, List<framecallback>>();
006
 }
007
  public delegate void FrameCallback(UInt32 iFrame);
008
  //幀回調函數容器< 幀數,<回調函數list>>
009
  private Dictionary< UInt32, List<framecallback>> m_vCallback;  
010
  //註冊幀回調函數
011
  public void RegisterFrameCallback(UInt32 iFrame, FrameCallback callback)
012
  {
013
   if (!m_vCallback.ContainsKey(iFrame))
014
   {
015
    List<framecallback> vCallback = new List<framecallback>();
016
    m_vCallback.Add(iFrame, vCallback);
017
   }
018
   m_vCallback[iFrame].Add(callback);
019
  }
020
  //清空註冊的幀回調函數
021
  public void Clear()
022
  {
023
   foreach (KeyValuePair< UInt32, List<framecallback>> pair in m_vCallback)
024
   {
025
    pair.Value.Clear();
026
   }
027
   m_vCallback.Clear();
028
  }
029
  //遍歷註冊的幀回調函數,根據播放的幀數觸發相應的函數
030
  public void Tick(UInt32 iCurrentFrame)
031
  {
032
   List<uint32> vPlayCompleted = new List<uint32>();
033
   //遍歷註冊的回調函數,並觸發相應的函數
034
   foreach (KeyValuePair< UInt32, List<framecallback>> pair in m_vCallback)
035
   {
036
    if (pair.Key <= iCurrentFrame)
037
    {
038
     foreach (FrameCallback callback in pair.Value)
039
     {
040
      callback(pair.Key);
041
     }
042
      vPlayCompleted.Add(pair.Key);
043
    }
044
   }
045
   //刪除已觸發的回調函數
046
   foreach (UInt32 iCompleted in vPlayCompleted)
047
   {
048
    m_vCallback[iCompleted].Clear();
049
    m_vCallback.Remove(iCompleted);
050
   }
051
  }
052
}
053
public class SkillAnimationMgr
054
{
055
 private SkillAnimationMgr()
056
 {
057
  m_vSkillAnimation = new Dictionary< string, SkillAnimation>();
058
 }
059
 private static SkillAnimationMgr s_Instance;
060
 private Dictionary< string, SkillAnimation> m_vSkillAnimation;
061
 public static SkillAnimationMgr Instance
062
 {
063
 get
064
 {
065
  if (null == s_Instance)
066
  {
067
   s_Instance = new SkillAnimationMgr();
068
  }
069
  return s_Instance;
070
 }
071
}
072
public void Init() { }
073
//添加動畫幀回調組件功能
074
public void AddSkillAnimation(string sAnimationName, SkillAnimation skillAnimation)
075
{
076
 if (!m_vSkillAnimation.ContainsKey(sAnimationName))
077
 {
078
  m_vSkillAnimation.Add(sAnimationName, skillAnimation);
079
 }
080
}
081
//刪除動畫幀回調組件功能
082
public void RemoveSkillAnimation(string sAnimationName)
083
{
084
 if (m_vSkillAnimation.ContainsKey(sAnimationName))
085
 {
086
  m_vSkillAnimation[sAnimationName].Clear();
087
  m_vSkillAnimation.Remove(sAnimationName);
088
 }
089
}
090
//Tick管理器中註冊的所有幀回調組件
091
public void Tick(float fElaspeTime)
092
{
093
 //未移除當前Tick時不在播放狀態的動畫SkillAnimation
094
 foreach (KeyValuePair < string, SkillAnimation > item in m_vSkillAnimation)
095
 {
096
  if (ViewMgr.Instance.CurPlayerView.IsSkillAnimationPlaying(item.Key))
097
  {
098
   UInt32 iFrame = (UInt32)ViewMgr.Instance.CurPlayerView.GetPlayingAnimationFrame();
099
   item.Value.Tick(iFrame);
100
  }
101
 }
102
}</framecallback></uint32></uint32></framecallback></framecallback></framecallback></framecallback></framecallback>
步驟5:
對輸入過程篩選,輸入成功的放入緩存器中,即完成了程序對技能輸入的檢測,以下所示。
view sourceprint?
01
public void Attack_N(Code code)//篩選過程,最後將篩選後的輸入,放入緩存器中。
02
{
03
 //技能輸入篩選條件
04
 if (LogicMgr.Instance.CurPlayer.CheckIdleState()
05
              || (LogicMgr.Instance.CurPlayer.CheckJumpState() && !LogicMgr.Instance.CurPlayer.CheckAttackIdleState()))
06
 {
07
  LogicMgr.Instance.AddInputKeyboard(code);
08
  LogicMgr.Instance.CurPlayer.Attack_N();
09
 }
10
  else if (LogicMgr.Instance.CurPlayer.CheckAttackState())
11
 {
12
  if (LogicMgr.Instance.CurPlayer.CheckRight(PlayerRight.ReceiveKeyboard))
13
  {
14
   LogicMgr.Instance.AddInputKeyboard(code);
15
  }
16
 }
17
}



引擎官方網站:http://www.genesis-3d.com.cn/

官方論壇:http://bbs.9tech.cn/genesis-3d/

官方千人大羣:59113309   135439306

YY頻道-遊戲開發大講堂(徹底免費,按期開課):51735288 

Genesis-3D開源遊戲引擎:遊戲起源,皆因有我!!!

相關文章
相關標籤/搜索