8.虚拟键盘实现

概述:

硬键盘就是物理键盘,平时敲的那种。软键盘是虚拟的键盘,不是在键盘上,而是在"屏幕"上。虚拟按键就是虚拟键盘的一部分,根据功能需求,提供部分按键效果的UI可操控按钮,尤其是在平板电脑、触控手机上,虚拟按键得到了更多的应用。在触控平台上的游戏,一部分通过手指在屏幕上相应的滑动产生相应的指令;还有一部分增设虚拟按键,完成对游戏的操控。

实现原理:

UI基本制作->功能实现

实现方法:

步骤1:

按照7UI的制作方法,完成UI的制作,最终效果图,如8-1-1所示。左侧为摇杆按钮,为双侧的BUTTON,一层做摇杆的底部按钮背景,一层与用户交互发生相应事件。右侧围控制攻击和跳跃的按钮。


图8-1-1

步骤2:

脚本实现按钮功能。

初始化虚拟按键UI。

public void Init()

{

 //注册攻击按钮layout文件

 GUI.RegisterLayout(_attackWindowName, @"Layout\AttackButton.layout", false, true);

 //注册按钮点击事件 1.layout名字 2.控件名字 3.回调函数 4.事件控制类型

 GUI.UIWidget.SetEventMouseButtonClick(_attackWindowName, "AttackBtn",  OnAttackBtnClick, EventControl.Add);

 //注册跳跃按钮layout文件

 GUI.RegisterLayout(_jumpWindowName, @"Layout\JumpButton.layout", false, true);

 //注册按钮点击事件 1.layout名字 2.控件名字 3.回调函数 4.事件控制类型

 GUI.UIWidget.SetEventMouseButtonClick(_jumpWindowName, "JumpBtn", OnJumpBtnClick, EventControl.Add);

 //根据屏幕尺寸设定按钮位置

 IntSize screenSize = GUI.GetScreenSize();

 IntPoint AtkBtnUIpos = new IntPoint((int)(screenSize.width - GUI.UIWidget.GetSize(_attackWindowName, "_Main").width * 2.5f),

                             (int)(screenSize.height - GUI.UIWidget.GetSize(_attackWindowName, "_Main").height * 1.2f));

 IntPoint JumpBtnUIpos = new IntPoint((int)(screenSize.width - GUI.UIWidget.GetSize(_attackWindowName, "_Main").width * 1.2f),

                             (int)(screenSize.height - GUI.UIWidget.GetSize(_attackWindowName, "_Main").height * 1.2f));

 GUI.UIWidget.SetPosition(_attackWindowName, "_Main", AtkBtnUIpos);

 GUI.UIWidget.SetPosition(_jumpWindowName, "_Main", JumpBtnUIpos);

}

//攻击点击回调函数

private void OnAttackBtnClick(FString sender)

{

 Logic.IputMgr.Instance.Attack_N(Code.J);

}

//跳跃点击回调函数

private void OnJumpBtnClick(FString sender)

{

 Logic.IputMgr.Instance.Jump();

}

虚拟摇杆类

  public class AndroidJoystick

  {

   public void Init()

   {

    GUI.RegisterLayout(_joystickWindowName, @"Layout\JoyStickBtn.layout", false, true);

    //注册按钮按下事件

    GUI.UIWidget.SetEventMouseButtonPressed(_joystickWindowName, "JoystickBtn", OnJSBtnPressed, EventControl.Add);

    //注册按钮抬起事件

    GUI.UIWidget.SetEventMouseButtonReleased(_joystickWindowName, "JoystickBtn", OnJSBtnReleased, EventControl.Add);

    //注册按钮的拖拽事件

    GUI.UIWidget.SetEventMouseDrag(_joystickWindowName, "JoystickBtn", OnJSBtnDrag, EventControl.Add);

    //注册按钮的Tick事件

    GUI.UIWidget.SetEventTick(_joystickWindowName, "JoystickBtn", Tick, EventControl.Add);

    IntSize screenSize = GUI.GetScreenSize();

    IntPoint JoystickBtnUIpos = new IntPoint((int)(GUI.UIWidget.GetSize(_joystickWindowName, "_Main").width * 0.2f),

                                     (int)(screenSize.height - GUI.UIWidget.GetSize(_joystickWindowName, "_Main").height * 1.5f));

    GUI.UIWidget.SetPosition(_joystickWindowName, "_Main", JoystickBtnUIpos);

    GUI.SetLayoutVisible(_joystickWindowName, true);

    jsBtnPos = GUI.UIWidget.GetPosition(_joystickWindowName, "JoystickBtn");

    _isCtrl = false;

   }

   private void OnJSBtnDrag(FString sender, int value, int value2, MouseButton btn)

   {

    if (lastX == -)

    {

     lastX = value;

    }

    //跟上一帧作比较,大于0为右移,小于0为左移

    int xOffset = value - lastX;

    if (xOffset > )

    {

     Debug.Dbgout("IsRightSlide");

     IntPoint JoystickBtnUIpos = new IntPoint(, jsBtnPos.top);

     //移动按钮位置

     GUI.UIWidget.SetPosition(_joystickWindowName, "JoystickBtn", JoystickBtnUIpos);

     Logic.LogicMgr.Instance.SetDirection(Logic.Direction.Forward);

     Logic.LogicMgr.Instance.CurPlayer.State = Logic.CharacterState.Running;

    }

    else if (xOffset < )

    {

     Debug.Dbgout("IsLeftSlide");

     IntPoint JoystickBtnUIpos = new IntPoint(, jsBtnPos.top);

     //移动按钮位置

     GUI.UIWidget.SetPosition(_joystickWindowName, "JoystickBtn", JoystickBtnUIpos);

     Logic.LogicMgr.Instance.SetDirection(Logic.Direction.Backward);

     Logic.LogicMgr.Instance.CurPlayer.State = Logic.CharacterState.Running;

    }

   lastX = value;

   lastY = value2;

  }

private void OnJSBtnPressed(FString sender, int value, int value2, MouseButton btn)

{

//控制控件是否被操作

_isCtrl = true;

Debug.Dbgout("isCtrl");

}

private void OnJSBtnReleased(FString sender, int value, int value2, MouseButton btn)

{

//控制控件是否被操作

_isCtrl = false;

Debug.Dbgout("Released");

}

private void Tick(FString sender, float gameTime, float frameTickTime)

{

if (!_isCtrl)

{

//在非操作状态,设置为初始状态

GUI.UIWidget.SetPosition(_joystickWindowName, "JoystickBtn", jsBtnPos);

if (Logic.LogicMgr.Instance.CurPlayer.State == Logic.CharacterState.Running)

{

Logic.LogicMgr.Instance.CurPlayer.State = Logic.CharacterState.Idle;

}

}

}

引擎官方网站:http://www.genesis-3d.com.cn/

官方论坛:http://bbs.9tech.cn/genesis-3d/

官方千人大群:59113309   135439306

YY频道-游戏开发大讲堂(完全免费,定期开课):51735288

Genesis-3D开源游戏引擎:游戏起源,皆因有我!!!

 

《Genesis-3D开源游戏引擎--横版格斗游戏制作教程08:虚拟键盘实现》--本系列完结的更多相关文章

  1. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程:简介及目录》(附上完整工程文件)

    介绍:讲述如何使用Genesis-3D来制作一个横版格斗游戏,涉及如何制作连招系统,如何使用包围盒实现碰撞检测,软键盘的制作,场景切换,技能读表,简单怪物AI等等,并为您提供这个框架的全套资源,源码以 ...

  2. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程04:技能的输入与检测》

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

  3. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程01: 资源导入》

    1. 资源导入 概述: 制作一款游戏需要用到很多资源,比如:模型.纹理.声音和脚本等.通常都是用其它相关制作资源软件,完成前期资源的收集工作.比如通常用的三维美术资源,会在Max.MAYA等相应软件中 ...

  4. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程07:UI》

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

  5. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程06:技能播放的逻辑关系》

    6.技能播放的逻辑关系 技能播放概述: 当完成对技能输入与检测之后,程序就该对输入在缓存器中的按键操作与程序读取的技能表信息进行匹配,根据匹配结果播放相应的连招技能. 技能播放原理: 按键缓存器中内容 ...

  6. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程05:技能读表》

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

  7. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程03:碰撞检测》

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

  8. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程02:关键帧动画导入与切割》

    2. 关键帧动画导入与切割 动画的分割与导入概述: 在游戏当中,游戏角色在不同状态下会有不同的动作,这些动作在引擎里相当于一段段的动画片段.当导入模型资源的时候,连同模型动画都会一并导入到引擎中.开发 ...

  9. Beat &#39;Em Up Game Starter Kit (横版格斗游戏) cocos2d-x游戏源代码

    浓缩精华.专注战斗! 游戏的本质是什么?界面?养成?NoNo!    游戏来源于对实战和比赛的模拟,所以它的本源就是对抗.就是战斗! 是挥洒热血的一种方式! 一个游戏最复杂最难做的是什么?UI?商城? ...

随机推荐

  1. 《c程序设计语言》读书笔记--首次输入不能是空符;最多10个字符

    #include <stdio.h> #define Num 10 int main() { int wor = 0; int arr[Num] = {0}; int c,count = ...

  2. AOJ - 2224 Save your cat(最小生成树)

    http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=45524 NY在自己的花园里养了很多猫.有一天,一个巫婆在N个点设置了魔法,然 ...

  3. IO(二)

    package com.bjsxt.io.buffered; import java.io.BufferedInputStream; import java.io.BufferedOutputStre ...

  4. Oracle EBS 寄售业务总结

    总述: 须通过一揽子采购协议(BPA)明确采购方与供应商之间的寄售关系,及各种协议条款: 通过来源补充规则(Sourcing Rules)明确物料的供应商以及分配规则: 通过合格供应商列表(ASL)明 ...

  5. 《OD大数据实战》Sqoop入门实例

    官网地址: http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.5-cdh5.3.6/SqoopUserGuide.html 一.环境搭建 1. 下载 s ...

  6. 使用JAVA直观感受快速排序与冒泡排序的性能差异

    初学算法,肯定会编写排序算法 其中两个最为有名的就是冒泡排序和快速排序 理论上冒泡排序的时间复杂度为O(N^2),快速排序的时间复杂度为O(NlogN) 下面本门使用JAVA,分别编写三段排序程序 对 ...

  7. 查看mysql存储引擎

    一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看: 看你的mysql现在已提供什么存储引擎:mysql> show engines; 看你的mysql当前默认的存储引擎:mys ...

  8. HDU 1072 (不一样的入队条件) Nightmare

    之前的BFS都是需要一个标记数组,但这个题不一样,因为可能一个格子不止走一次. 那么我们就要寻找新的入队条件:left比上次经过的时候大才入队(left表示上次经过该点时剩余的时间). 为什么呢?我们 ...

  9. LA 3905 Meteor

    给出一些点的初始位置(x, y)及速度(a, b)和一个矩形框,求能同时出现在矩形框内部的点数的最大值. 把每个点进出矩形的时刻分别看做一个事件,则每个点可能对应两个事件,进入事件和离开事件. 按这些 ...

  10. scala学习笔记(8): 列表的map,flatMap,zip和reduce

    map,flatMap,zip和reduce函数可以让我们更容易处理列表函数. 1 map函数map将一个函数应用于列表的每一个元素并且将其作为一个新的列表返回.我们可以这样对列表的元素进行平方: s ...