设为首页 收藏本站
查看: 812|回复: 0

未雨绸缪,Win8 Metro开发实例分享

[复制链接]

尚未签到

发表于 2015-5-20 11:06:57 | 显示全部楼层 |阅读模式
      着手win8 metro的东西有一段时间了,在这里用一个实实在在的小游戏设计分享给大家。
我使用的开发环境是官方9月份公开的Windows Developer Preview(含VS11 P版),不过某些厂商内部可以拿到Developer Preview Update和Win8 Beta。目前开发语言可以选择C++,C#,Js,vb和其他.NET语言。基础API和.NET BCL几乎差不多,做了很多删减(比如socket),去掉了所有阻塞性的同步api,IO上只有异步api供使用(不过由于c#4.5的await和async,异步代码写起来和同步代码差不多,开发体验灰常不错哦),一些资源路径和使用方式有所变化(比如代码里使用的话是ms-resource:/Image/Logo.png,或者ResourceLoader.GetFile(……)),运行时某些特殊权限需要声明(contract,protocol,网络,媒体库等等),程序间通讯需要使用特别的机制( Protocol)等等。
  
  
     用.net语言开发的Metro程序实际上是一个.net core的程序。编译后为的appx+xaml文件和资源文件(位置在C:\Users\{你的用户名}\AppxLayouts\下),运行时部分托管执行&部分通过winrt执行(实际上底层大部分已经是winrt来跑了)。
DSC0000.jpg
  
  

  这个实例游戏是给小孩纸玩的游戏合集之一,这里给大家演示的是其中一个猜数字的游戏,游戏内容是:一辆公交车从蘑菇后面跑过去时会随机隐藏掉几个动物,公交车离开屏幕后让小孩纸猜猜有几个动物消失(下面有0-5的数字供选择,选对就播放笑的动画,选错就播放哭的动画)。
  
  之前做过一个wpf版,当时的动画都是叫美工用Blend画出来的(都是path动画,非常细腻),可是目前metro不支持path动画,所以公交车和蘑菇、动物都是用图片序列帧来替换(吐血~~)。
  
  

  
      PS:蛋疼的dp版win8,输入法、焦点经常出问题,调试metro app时也常出现触控操作失灵(Tap、PointerXXX等事件不触发),用了一段时间后vs designer就再也不能用。(同仁们如有好的办法请告诉我)。
  这个metro项目的代码下载 (需要在开发环境下编译后执行)

  Win8 Metro联盟群:148462643
  技术交流 商务合作 猎头咨询 盈利分享。抓住移动平台(Win8,wp7,android,ios)为开发者带来的丰富机遇与财富!
  
  本文重点讲里面针对目前的metro api设计一套简化版精灵机制,方便调用。设计之初的定位是
  性能高效。虽然用这套类似于wpf/sl的GUI机制本身并不是特别适合做游戏,但是作一般的2D游戏还是木有问题的。这里强调亮点:
  A.精灵的驱动方式:我使用一个不可重入的timer来驱动所有精灵,每个精灵都实现由OnFrame方法,每次onUpdate的时候遍历这些精灵,依次调用OnFrame。
  B.精灵的移除操作:由于GameLoop的update频率很高,很可能当需要移除精灵时候正在便利这个集合从而引发一些麻烦(不管你用线程安全的集合还是不安全的)。,我的GameLoop中提供移除精灵的方法(RemoteSprite),实现原理是调用需要remote一个sprite时会将这个sprite的id放到一个队列中,当GameLoop下次onUpdate的时候先从这个队列中依次将要移除的精灵id取出,移除所有需要移除的精灵后再对集合进行遍历。
  
  帧数可调
  每个精灵的帧速单独可控
  每个精灵的每两帧之间的帧速可控
  这几个功能的设计很有用,实现起来也简单,FrameInfo里可以记录每一帧到下一帧的时间(一个TImeSpan),Sprite本身会保留自己上次OnFrame的时间,在ISprite.OnFrame里判断时间间隔即可。
DSC0001.jpg

DSC0002.png

  方便其他开发者使用,友好易用的api
  用起来很简单,根上继承的是Canvas,可以直接放到布局里去。另外像坐标,中心点偏移、旋转角度、伸缩量也都在Sprite里实现了:),你可以播放一遍,也可以播放n遍,也可以在播放若干次后callback一个事件……
DSC0003.png

DSC0004.png

  可扩展,方便定制
  比如我这个实例里面的BusSprite和MushSprite,他们都有特别之初,只需要继承,重载你需要的方法即可。
DSC0005.png

  
  SpritesLoop:用于驱动精灵的组件,上面提到过。
DSC0006.png

DSC0007.png

  FrameInfo:每一帧的数据,包括帧图信息,帧序号,每一帧速的帧速等
DSC0008.png

  SpriteResource:帧信息集合,当前帧数,所有帧数等
DSC0009.png

  ISprite:精灵实体抽象,直接或间接继承自UIElement,可以直接放到metro布局里去。
DSC00010.png

  
  
  辅助:
  ResourceMaker:系按照约定方式根据图片为精灵生成SpriteResource对象。
  
  整体的Sprites系统是这样的:
  
DSC00011.jpg

  
  创造我们的公交车(Bus Sprite)
  公交车有个特点,他上面还要装载5个能动的动物(5个AnimalSprite),这就需要我们在基本的Sprite之上进行扩展,我们做一个字类,通过继承来创造这个bus。
  

  同时创建5个AnimalSprite,他同样是继承在Sprite(这个很简单,只是为了调整动物每一帧在公交车上的位置才做的,具体请看代码。)
  在BusSprite的初始化时将5只动物以及他们的位置准备好。
DSC00012.png

  加到BusSprite身体上:
DSC00013.png

  OK,这样Bus就能够动起来了。
DSC00014.png

  这个metro项目的代码下载 (需要在开发环境下编译后执行)
  Win8 Metro联盟群:148462643

技术交流 商务合作 猎头咨询 盈利分享。抓住移动平台(Win8,wp7,android,ios)为开发者带来的丰富机遇与财富!  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-68845-1-1.html 上篇帖子: 手把手玩转win8开发系列课程(28) 下篇帖子: 手把手玩转win8开发系列课程(4)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表