打造轻量级Windows Phone7 游戏引擎-Samurai 第二话(中) Inputs 问题解决篇一

本文主要是介绍打造轻量级Windows Phone7 游戏引擎-Samurai 第二话(中) Inputs 问题解决篇一,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

打造轻量级Windows Phone7 游戏引擎-Samurai 第二话(中) Inputs 问题解决篇一

1.如何让原本的“轮询”模式变成“事件响应”模式?
(当然了,这里的事件响应模式本质上还是轮询,并没有提高效率,仅仅是方便了编程,希望读者注意)
简要概括做法就是:
事先以“手势种类”为Key以及“响应方法”为Value进行注册,在游戏过程中,SAInput在更新后,根据监听到的手势决定是否调用相应方法。
我们先定义一个委托:

 public delegate void OnInputDelegate(GestureSample gestureSample);      //处理手势的委托定义

然后定义一个字典,用来存储手势和响应方法的映射关系:(对inputDictionary的管理就是最为重要的部分了~)

private static Dictionary<GestureType, OnInputDelegate> inputDictionary = new Dictionary<GestureType, OnInputDelegate>();       //手势与委托的字典


每次我们想要用到新的手势的时候,都要进行注册,调用如下的方法:
public static void EnableGesture(GestureType gestureType, OnInputDelegate onInput){if (!inputDictionary.ContainsKey(gestureType)){TouchPanel.EnabledGestures = TouchPanel.EnabledGestures | gestureType;inputDictionary.Add(gestureType, onInput);}}
(注意的是,同一个手势不要注册多个响应(当然,其实大家可以在这个基础上改进使之可以同一手势支持多个相应,想想用什么方法吧~))
然后就是真正处理部分的代码了,在贴下来该段代码之前还是不得不吐个槽:这也太简单太水了吧...

                    foreach (GestureType g in inputDictionary.Keys){if (gestureSample.GestureType == g){inputDictionary[g].Invoke(gestureSample);break;  //ATTENTION}}

就是这个样子的,只要检测到有相应的手势,直接触发相应的响应方法即可~
同理,我们可以对BackButton进行同样的处理:

设置委托:

public delegate void OnBackButtonDelegate();        //处理back键的委托定义

注册响应事件:

        public static void EnableBackButton(OnBackButtonDelegate onBackButton){//OnBackButton += onBackButton;OnBackButton = onBackButton;}

(同样的,这里也是只支持一个响应方法,不过如果使用注释掉的那个语句就可以注册多个方法了~不好意思哈,直接说出来了~不过因为注册了多个响应方法并不是必要的,而且这样做的话,会让代码比较凌乱,所以还是不要用注释掉的那一行了)
处理响应:

 if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed){if (OnBackButton != null){OnBackButton.Invoke();}}

2.如何既能用Gesture,又能用底层的TouchCollection?
虽然在书上见到了提醒不要既用TouchCollection又用Gesture,但是经过尝试似乎没有问题,大家如果用的时候遇见了问题,一定要告我一声。 在这里多说一句,XNA的Gesture本来就是加工 TouchCollection中的信息得到的。也就是说如果我们自己心情好的话,可以直接无视掉Gesture,自己利用TouchCollection实现自定义的Gesture,不过比较惭愧,笔者有些懒惰啊~
代码如下:
设置委托:        

public delegate void OnTouchCollectionDelegate(TouchCollection touchCollection);

注册响应事件:

        public static void EnableTouchCollection(OnTouchCollectionDelegate temp){OnTouchCollection = temp;}
处理响应:(好吧,这已经简单到无力吐槽了)注意,我将TouchCollection的处理放在了Gesture的前面,这个时候是没问题的,欢迎大家尝试将Gesture放在前面的情况~
                if (OnTouchCollection != null){OnTouchCollection.Invoke(touchCollection);}


3.如何整合Button到SAInput以及整合SAInput到页面管理系统?
在介绍完页面管理系统后再进行详述。


另外,这篇博客中的代码仅仅是用于讲解的一部分,要达到实际应用以及可以和其他部分进行整合的程度,还需要做一些其他控制开关啦,注销啦等等之类的工作。所以,在晚些时候SAInput这部分写完的时候我会附上较为完整的代码。



这篇关于打造轻量级Windows Phone7 游戏引擎-Samurai 第二话(中) Inputs 问题解决篇一的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1025196

相关文章

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

在Ubuntu上打不开GitHub的完整解决方法

《在Ubuntu上打不开GitHub的完整解决方法》当你满心欢喜打开Ubuntu准备推送代码时,突然发现终端里的gitpush卡成狗,浏览器里的GitHub页面直接变成Whoathere!警告页面... 目录一、那些年我们遇到的"红色惊叹号"二、三大症状快速诊断症状1:浏览器直接无法访问症状2:终端操作异常

mybatis直接执行完整sql及踩坑解决

《mybatis直接执行完整sql及踩坑解决》MyBatis可通过select标签执行动态SQL,DQL用ListLinkedHashMap接收结果,DML用int处理,注意防御SQL注入,优先使用#... 目录myBATiFBNZQs直接执行完整sql及踩坑select语句采用count、insert、u