《Genesis-3D开源游戏引擎--横版格斗游戏制作教程08:虚拟键盘实现》--本系列完结
8.虚拟键盘实现
概述:
硬键盘就是物理键盘,平时敲的那种。软键盘是虚拟的键盘,不是在键盘上,而是在"屏幕"上。虚拟按键就是虚拟键盘的一部分,根据功能需求,提供部分按键效果的UI可操控按钮,尤其是在平板电脑、触控手机上,虚拟按键得到了更多的应用。在触控平台上的游戏,一部分通过手指在屏幕上相应的滑动产生相应的指令;还有一部分增设虚拟按键,完成对游戏的操控。
实现原理:
UI基本制作->功能实现
实现方法:
步骤1:
按照7UI的制作方法,完成UI的制作,最终效果图,如8-1-1所示。左侧为摇杆按钮,为双侧的BUTTON,一层做摇杆的底部按钮背景,一层与用户交互发生相应事件。右侧围控制攻击和跳跃的按钮。
图8-1-1
步骤2:
脚本实现按钮功能。
初始化虚拟按键UI。
01 public void Init() 02 { 03 //注册攻击按钮layout文件 04 GUI.RegisterLayout(_attackWindowName, @"Layout\AttackButton.layout", false, true); 05 //注册按钮点击事件 1.layout名字 2.控件名字 3.回调函数 4.事件控制类型 06 GUI.UIWidget.SetEventMouseButtonClick(_attackWindowName, "AttackBtn", OnAttackBtnClick, EventControl.Add); 07 08 //注册跳跃按钮layout文件 09 GUI.RegisterLayout(_jumpWindowName, @"Layout\JumpButton.layout", false, true); 10 //注册按钮点击事件 1.layout名字 2.控件名字 3.回调函数 4.事件控制类型 11 GUI.UIWidget.SetEventMouseButtonClick(_jumpWindowName, "JumpBtn", OnJumpBtnClick, EventControl.Add); 12 13 14 //根据屏幕尺寸设定按钮位置 15 IntSize screenSize = GUI.GetScreenSize(); 16 IntPoint AtkBtnUIpos = new IntPoint((int)(screenSize.width - GUI.UIWidget.GetSize(_attackWindowName, "_Main").width * 2.5f), 17 (int)(screenSize.height - GUI.UIWidget.GetSize(_attackWindowName, "_Main").height * 1.2f)); 18 19 IntPoint JumpBtnUIpos = new IntPoint((int)(screenSize.width - GUI.UIWidget.GetSize(_attackWindowName, "_Main").width * 1.2f), 20 (int)(screenSize.height - GUI.UIWidget.GetSize(_attackWindowName, "_Main").height * 1.2f)); 21 GUI.UIWidget.SetPosition(_attackWindowName, "_Main", AtkBtnUIpos); 22 GUI.UIWidget.SetPosition(_jumpWindowName, "_Main", JumpBtnUIpos); 23 } 24 25 //攻击点击回调函数 26 private void OnAttackBtnClick(FString sender) 27 { 28 Logic.IputMgr.Instance.Attack_N(Code.J); 29 } 30 //跳跃点击回调函数 31 private void OnJumpBtnClick(FString sender) 32 { 33 Logic.IputMgr.Instance.Jump(); 34 }
虚拟摇杆类
01 public class AndroidJoystick 02 { 03 public void Init() 04 { 05 GUI.RegisterLayout(_joystickWindowName, @"Layout\JoyStickBtn.layout", false, true); 06 //注册按钮按下事件 07 GUI.UIWidget.SetEventMouseButtonPressed(_joystickWindowName, "JoystickBtn", OnJSBtnPressed, EventControl.Add); 08 //注册按钮抬起事件 09 GUI.UIWidget.SetEventMouseButtonReleased(_joystickWindowName, "JoystickBtn", OnJSBtnReleased, EventControl.Add); 10 //注册按钮的拖拽事件 11 GUI.UIWidget.SetEventMouseDrag(_joystickWindowName, "JoystickBtn", OnJSBtnDrag, EventControl.Add); 12 //注册按钮的Tick事件 13 GUI.UIWidget.SetEventTick(_joystickWindowName, "JoystickBtn", Tick, EventControl.Add); 14 IntSize screenSize = GUI.GetScreenSize(); 15 IntPoint JoystickBtnUIpos = new IntPoint((int)(GUI.UIWidget.GetSize(_joystickWindowName, "_Main").width * 0.2f), 16 (int)(screenSize.height - GUI.UIWidget.GetSize(_joystickWindowName, "_Main").height * 1.5f)); 17 GUI.UIWidget.SetPosition(_joystickWindowName, "_Main", JoystickBtnUIpos); 18 GUI.SetLayoutVisible(_joystickWindowName, true); 19 jsBtnPos = GUI.UIWidget.GetPosition(_joystickWindowName, "JoystickBtn"); 20 _isCtrl = false; 21 } 22 private void OnJSBtnDrag(FString sender, int value, int value2, MouseButton btn) 23 { 24 if (lastX == -1) 25 { 26 lastX = value; 27 } 28 //跟上一帧作比较,大于0为右移,小于0为左移 29 int xOffset = value - lastX; 30 if (xOffset > 0) 31 { 32 Debug.Dbgout("IsRightSlide"); 33 IntPoint JoystickBtnUIpos = new IntPoint(150, jsBtnPos.top); 34 //移动按钮位置 35 GUI.UIWidget.SetPosition(_joystickWindowName, "JoystickBtn", JoystickBtnUIpos); 36 Logic.LogicMgr.Instance.SetDirection(Logic.Direction.Forward); 37 Logic.LogicMgr.Instance.CurPlayer.State = Logic.CharacterState.Running; 38 } 39 else if (xOffset < 0) 40 { 41 Debug.Dbgout("IsLeftSlide"); 42 IntPoint JoystickBtnUIpos = new IntPoint(0, jsBtnPos.top); 43 //移动按钮位置 44 GUI.UIWidget.SetPosition(_joystickWindowName, "JoystickBtn", JoystickBtnUIpos); 45 Logic.LogicMgr.Instance.SetDirection(Logic.Direction.Backward); 46 Logic.LogicMgr.Instance.CurPlayer.State = Logic.CharacterState.Running; 47 } 48 lastX = value; 49 lastY = value2; 50 } 51 52 private void OnJSBtnPressed(FString sender, int value, int value2, MouseButton btn) 53 { 54 //控制控件是否被操作 55 _isCtrl = true; 56 Debug.Dbgout("isCtrl"); 57 } 58 59 private void OnJSBtnReleased(FString sender, int value, int value2, MouseButton btn) 60 { 61 //控制控件是否被操作 62 _isCtrl = false; 63 Debug.Dbgout("Released"); 64 } 65 66 private void Tick(FString sender, float gameTime, float frameTickTime) 67 { 68 if (!_isCtrl) 69 { 70 //在非操作状态,设置为初始状态 71 GUI.UIWidget.SetPosition(_joystickWindowName, "JoystickBtn", jsBtnPos); 72 if (Logic.LogicMgr.Instance.CurPlayer.State == Logic.CharacterState.Running) 73 { 74 Logic.LogicMgr.Instance.CurPlayer.State = Logic.CharacterState.Idle; 75 } 76 } 77 }
引擎官方网站:http://www.genesis-3d.com.cn/
官方论坛:http://bbs.9tech.cn/genesis-3d/
官方千人大群:59113309 135439306
YY频道-游戏开发大讲堂(完全免费,定期开课):51735288
Genesis-3D开源游戏引擎:游戏起源,皆因有我!!!