技能系統的用戶體驗,制約着玩家對整個遊戲的體驗。遊戲角色的技能華麗度,連招的順利過渡,以及逼真的打擊感,都做爲一款遊戲的賣點吸引着玩家的注意。開發者在開發遊戲初期,會根據玩家對此類遊戲的慣性操做,設定技能控制按鍵。同時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開源遊戲引擎:遊戲起源,皆因有我!!!