《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开源游戏引擎:游戏起源,皆因有我!!!

 
posted @ 2014-01-01 18:44  Genesis-3D  阅读(590)  评论(0编辑  收藏  举报