文档章节

《Genesis-3D开源游戏引擎--横版格斗游戏制作教程08:虚拟键盘实现》完结

Genesis-3D
 Genesis-3D
发布于 2014/01/14 15:07
字数 1087
阅读 365
收藏 9

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

 


© 著作权归作者所有

Genesis-3D
粉丝 12
博文 34
码字总数 33360
作品 0
佛山
私信 提问
《Genesis-3D开源游戏引擎--横版格斗游戏制作教程07:UI》

概述: UI即User Interface(用户界面)的简称。UI设计是指对软件的燃机交互、操作逻辑、界面美观的整体设计。好的UI设计不仅可以让游戏变得更有品位,更吸引玩家,还能充分体现开发者对游戏...

Genesis-3D
2014/01/14
1K
0
《Genesis-3D开源游戏引擎--横版格斗游戏制作教程03:碰撞检测》

3.碰撞检测 碰撞检测的概述: 碰撞在物理学中表现为两粒子或物体间极端的相互作用。而在游戏世界中,游戏对象在游戏世界自身并不受物理左右,为了模拟真实世界的效果,需要开发者为其添加属性...

Genesis-3D
2014/01/14
229
0
《Genesis-3D开源游戏引擎完整实例教程-跑酷游戏篇:简介及目录》(附上完整工程文件)

跑酷游戏制作 游戏类型: 此游戏Demo,为跑酷类游戏。 框架简介: 游戏通常由程序代码和资源组成。如果说模型、贴图、声音之类的可以给游戏环境提供一个物理描述和设置,那么脚本和代码块会给...

Genesis-3D
2014/01/15
322
0
《Genesis-3D开源游戏引擎--横版格斗游戏制作教程04:技能的输入与检测》

4.技能的输入与检测 概述: 技能系统的用户体验,制约着玩家对整个游戏的体验。游戏角色的技能华丽度,连招的顺利过渡,以及逼真的打击感,都作为一款游戏的卖点吸引着玩家的注意。开发者在开...

Genesis-3D
2014/01/14
305
0
《Genesis-3D开源游戏引擎--横版格斗游戏制作教程05:技能读表》

5.技能读表 技能读表概述: 技能读表,作为实现技能系统更为快捷的一种方式,被广泛应用到游戏开发中。技能配表,作为桥梁连接着游戏策划者和开发者在技能实现上的关系。在游戏技能开发中,开...

Genesis-3D
2014/01/14
129
0

没有更多内容

加载失败,请刷新页面

加载更多

移动开发中的 Web:WebView、WebKit、JSCore、Web 优化、热修复、跨平台、Native、Hybrid……

移动开发领域近年来已经逐渐告别了野蛮生长的时期,进入了相对成熟的时代。而一直以来 Native 和 Web 的争论从未停止,通过开发者孜孜不倦的努力,Web 的效率和 Native 的体验也一直在寻求着...

编辑部的故事
13分钟前
9
0
MySQL8.0.17 - Multi-Valued Indexes 简述

本文主要简单介绍下8.0.17新引入的功能multi-valued index, 顾名思义,索引上对于同一个Primary key, 可以建立多个二级索引项,实际上已经对array类型的基础功能做了支持 (感觉官方未来一定...

阿里云官方博客
59分钟前
10
0
make4.1降级 make-3.81、2错误

在编译 make-3.82 的时候出现如下错误提示 glob/glob.c:xxx: undefined reference to `__alloca'` 修改 /glob/glob.c // #if !defined __alloca && !defined __GNU_LIBRARY__ # ifdef __GNUC......

Domineering
今天
14
0
Rainbond集群的安装和运维的原理

本文将解读Rainbond集群的安装和运维的原理,使用户基本了解Rainbond的安装机制和运维重点,便于用户搭建大型Rainbond集群。 1.Rainbond集群节点概述 1.1 节点分类 属性 类型 说明 manage 管...

好雨云帮
今天
10
0
好程序员大数据学习路线分享UDF函数

1.为什么需要UDF? 1)、因为内部函数没法满足需求。 2)、hive它本身就是一个灵活框架,允许用自定义模块功能,如可以自定义UDF、serde、输入输出等。 2.UDF是什么? UDF:user difine fun...

好程序员官方
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部