8.虚拟键盘实现 
 
 概述: 
 
 硬键盘就是物理键盘,平时敲的那种。软键盘是虚拟的键盘,不是在键盘上,而是在"屏幕"上。虚拟按键就是虚拟键盘的一部分,根据功能需求,提供部分按键效果的UI可操控按钮,尤其是在平板电脑、触控手机上,虚拟按键得到了更多的应用。在触控平台上的游戏,一部分通过手指在屏幕上相应的滑动产生相应的指令;还有一部分增设虚拟按键,完成对游戏的操控。 
 
 实现原理: 
 
 UI基本制作->功能实现 
 
 实现方法: 
 
 步骤1: 
 
 按照7UI的制作方法,完成UI的制作,最终效果图,如8-1-1所示。左侧为摇杆按钮,为双侧的BUTTON,一层做摇杆的底部按钮背景,一层与用户交互发生相应事件。右侧围控制攻击和跳跃的按钮。 
 
 
 
 图8-1-1 
  
 步骤2: 
 
 脚本实现按钮功能。 
 
 初始化虚拟按键UI。 
 
 
  
   
   
   
   
   |  04  |  
        GUI.RegisterLayout(_attackWindowName, @"Layout\AttackButton.layout", false, true);  |  
     
  
   
   |  05  |  
        //注册按钮点击事件 1.layout名字 2.控件名字 3.回调函数 4.事件控制类型  |  
     
  
   
   |  06  |  
        GUI.UIWidget.SetEventMouseButtonClick(_attackWindowName, "AttackBtn",  OnAttackBtnClick, EventControl.Add);  |  
     
  
   
   
   
   |  09  |  
        GUI.RegisterLayout(_jumpWindowName, @"Layout\JumpButton.layout", false, true);  |  
     
  
   
   |  10  |  
        //注册按钮点击事件 1.layout名字 2.控件名字 3.回调函数 4.事件控制类型  |  
     
  
   
   |  11  |  
        GUI.UIWidget.SetEventMouseButtonClick(_jumpWindowName, "JumpBtn", OnJumpBtnClick, EventControl.Add);  |  
     
  
   
   
   
   
   |  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));  |  
     
  
   
   
   |  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);  |  
     
  
   
   
   
   
   |  26  |  
       private void OnAttackBtnClick(FString sender)  |  
     
  
   
   
   |  28  |  
        Logic.IputMgr.Instance.Attack_N(Code.J);  |  
     
  
   
   
   
   |  31  |  
       private void OnJumpBtnClick(FString sender)  |  
     
  
   
   
   |  33  |  
        Logic.IputMgr.Instance.Jump();  |  
     
  
   
   
  
 虚拟摇杆类 
 
 
  
   
   |  01  |  
         public class AndroidJoystick  |  
     
  
   
   
   
   
   |  05  |  
           GUI.RegisterLayout(_joystickWindowName, @"Layout\JoyStickBtn.layout", false, true);  |  
     
  
   
   
   |  07  |  
           GUI.UIWidget.SetEventMouseButtonPressed(_joystickWindowName, "JoystickBtn", OnJSBtnPressed, EventControl.Add);  |  
     
  
   
   
   |  09  |  
           GUI.UIWidget.SetEventMouseButtonReleased(_joystickWindowName, "JoystickBtn", OnJSBtnReleased, EventControl.Add);  |  
     
  
   
   
   |  11  |  
           GUI.UIWidget.SetEventMouseDrag(_joystickWindowName, "JoystickBtn", OnJSBtnDrag, EventControl.Add);  |  
     
  
   
   
   |  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");  |  
     
  
   
   
   
   |  22  |  
          private void OnJSBtnDrag(FString sender, int value, int value2, MouseButton btn)  |  
     
  
   
   
   
   
   
   
   |  28  |  
           //跟上一帧作比较,大于0为右移,小于0为左移  |  
     
  
   
   |  29  |  
           int xOffset = value - lastX;  |  
     
  
   
   
   
   |  32  |  
            Debug.Dbgout("IsRightSlide");  |  
     
  
   
   |  33  |  
            IntPoint JoystickBtnUIpos = new IntPoint(150, jsBtnPos.top);  |  
     
  
   
   
   |  35  |  
            GUI.UIWidget.SetPosition(_joystickWindowName, "JoystickBtn", JoystickBtnUIpos);  |  
     
  
   
   |  36  |  
            Logic.LogicMgr.Instance.SetDirection(Logic.Direction.Forward);  |  
     
  
   
   |  37  |  
            Logic.LogicMgr.Instance.CurPlayer.State = Logic.CharacterState.Running;  |  
     
  
   
   
   
   
   |  41  |  
            Debug.Dbgout("IsLeftSlide");  |  
     
  
   
   |  42  |  
            IntPoint JoystickBtnUIpos = new IntPoint(0, jsBtnPos.top);  |  
     
  
   
   
   |  44  |  
            GUI.UIWidget.SetPosition(_joystickWindowName, "JoystickBtn", JoystickBtnUIpos);  |  
     
  
   
   |  45  |  
            Logic.LogicMgr.Instance.SetDirection(Logic.Direction.Backward);  |  
     
  
   
   |  46  |  
            Logic.LogicMgr.Instance.CurPlayer.State = Logic.CharacterState.Running;  |  
     
  
   
   
   
   
   
   
   |  52  |  
       private void OnJSBtnPressed(FString sender, int value, int value2, MouseButton btn)  |  
     
  
   
   
   
   
   |  56  |  
       Debug.Dbgout("isCtrl");  |  
     
  
   
   
   
   |  59  |  
       private void OnJSBtnReleased(FString sender, int value, int value2, MouseButton btn)  |  
     
  
   
   
   
   
   |  63  |  
       Debug.Dbgout("Released");  |  
     
  
   
   
   
   |  66  |  
       private void Tick(FString sender, float gameTime, float frameTickTime)  |  
     
  
   
   
   
   
   
   |  71  |  
       GUI.UIWidget.SetPosition(_joystickWindowName, "JoystickBtn", jsBtnPos);  |  
     
  
   
   |  72  |  
       if (Logic.LogicMgr.Instance.CurPlayer.State == Logic.CharacterState.Running)  |  
     
  
   
   
   |  74  |  
       Logic.LogicMgr.Instance.CurPlayer.State = Logic.CharacterState.Idle;  |  
     
  
   
   
   
   
  
                                                    
                                            来源:oschina
链接:https://my.oschina.net/u/1432254/blog/192917