• 《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, @"LayoutAttackButton.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, @"LayoutJumpButton.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, @"LayoutJoyStickBtn.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开源游戏引擎:游戏起源,皆因有我!!!

     
  • 相关阅读:
    struts2简介
    HDU 2842 Chinese Rings(矩阵高速功率+递归)
    Cocos2d-X中国象棋的发展《五岁以下儿童》摆棋
    【Python注意事项】如何理解python中间generator functions和yield表情
    [CSS] Design for Mobile First with Tachyons
    [Angular] Configurable NgModules
    [Angular] Using useExisting provider
    [Angular] Providers and useFactory
    [Angular] Using InjectionToken
    [Angular] Test Directive
  • 原文地址:https://www.cnblogs.com/G-3D/p/3500810.html
Copyright © 2020-2023  润新知