代码改变世界

[置顶]无疆_炎戎的博文导航

2011-05-26 10:44 by 姜 萌@cnblogs, 497 阅读, 0 推荐, 收藏, 编辑
摘要:姜萌,网名:无疆_炎戎(Contract Me:MSN:dokhell@live.cn;QQ:871644901)分布式平台研发,智能家电PCFocus onDistributed Connected SystemBased On ……==============不一般的分隔符===================MY OPEN SOURCEhttp://www.codeplex.com/site/users/view/dokhell曾经的创业时期(2010)高性能服务器架构之路-MongoDB(一):MongoDB快速入门(java版)团队Android小作品Chinchilla Guita 阅读全文

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

2012-02-10 17:01 by 姜 萌@cnblogs, 3529 阅读, 3 推荐, 收藏, 编辑

    着手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来跑了)。

 


这个实例游戏是给小孩纸玩的游戏合集之一,这里给大家演示的是其中一个猜数字的游戏,游戏内容是:一辆公交车从蘑菇后面跑过去时会随机隐藏掉几个动物,公交车离开屏幕后让小孩纸猜猜有几个动物消失(下面有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里判断时间间隔即可。



方便其他开发者使用,友好易用的api

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



可扩展,方便定制

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


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



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


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


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


辅助:

ResourceMaker系按照约定方式根据图片为精灵生成SpriteResource对象。

整体的Sprites系统是这样的:


创造我们的公交车(Bus Sprite)

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


同时创建5个AnimalSprite,他同样是继承在Sprite(这个很简单,只是为了调整动物每一帧在公交车上的位置才做的,具体请看代码。)

在BusSprite的初始化时将5只动物以及他们的位置准备好。


加到BusSprite身体上:


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


这个metro项目的代码下载 (需要在开发环境下编译后执行)

Win8 Metro联盟群:148462643

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

 

 

无疆_炎戎的2011跨年总结

2012-01-03 15:29 by 姜 萌@cnblogs, 2371 阅读, 4 推荐, 收藏, 编辑
摘要:2012是传说中的世界末日, 有幸在这个特殊的年份赶上自己的本命年:P 先简要介绍一下自己吧哈哈,07届入大学,11年准时毕业拿证摒除学生身份,虽然不太老,但大学期间非常依赖自主学习与实践,先后搞过native win32(不少已淡忘),java,.net,10年初就已经开始在叫北京工作,先后就职中游在线(先silverlight后java服务器),大头无线(分布式平台研发)和友好互动旗下的一支创业团队(wpf和metro app),业余搞android外快(副业快成事业了~~)。 第一次组团创业曲终人散(这是2010年末的事情,也一起写了) 源于2010年10月,我和两个铁杆同学准备... 阅读全文

史上最牛x---安卓系统监控王盛大发布

2011-09-30 13:56 by 姜 萌@cnblogs, 751 阅读, 0 推荐, 收藏, 编辑
摘要:哈哈,有些夸大其词了。看android市场火的一塌糊涂哥也蛋定不住了,最近一直在业余搞android弄弄外块,目前不接私活,所有app均自己策划,设计,编码,推广,盈利。这个安卓系统监控王是赶在国庆前赶出来的,个人觉得挺不错,废话不多说了,直接上介绍,上图:App介绍内置8大功能模块:进程管理,服务管理,程序包管理,性能测试,垃圾文件清理,硬件识别,智能装机,进程存储动态优化与一体。并且附带widget和通知栏工具,方便您快速了解手机状态并执行常用功能(一键清理、一键内存整理等)APK下载链接http://files.cnblogs.com/wJiang/SysMon.apkhttp://ww 阅读全文

谈CLR的装箱与拆箱

2010-12-29 11:53 by 姜 萌@cnblogs, 2384 阅读, 10 推荐, 收藏, 编辑
摘要:CLR类型系统有两种主要类型—Reference Type和ValueType。前者是在托管堆中被分配内存并接受管理,后者则有两种形态--装箱与未装箱,对于装箱形态的值对象是在托管堆中,未装箱形态的值对象是在栈上分配。 CLR堆上对象和栈上对象的差异 每一个堆上对象都有两个额外的字段,一个是类型引用表的指针,用于实现多态,类似于C++的多态机制,另一个字段是SyncBlockIndex,用于实现CLR线程同步机制。栈上对象则无这两个字段。 装箱的过程 装箱: 在堆上开辟内存,包括2个额外字段+值对象大小。 将值对象复制过去 3.返回新分配对象的地址。 拆箱的过程 1.如果为null, 阅读全文

浅谈缓存的设计与使用注意项(下)

2010-12-28 00:46 by 姜 萌@cnblogs, 1944 阅读, 9 推荐, 收藏, 编辑
摘要:缓存的加载策略--Proactive 和Reactive proactive的策略就是一开始就将所有backing store中的数据加载到进程内存中,这样做的好处是在数据量相对不大的时候会显得很有效率,无需频繁的访问backing store调出数据,并且也不用再代码中判断缓存中是否缓存有数据,是否要从backing store中加载。 reactive策略是“按需加载”,在程序初始化阶段仅加载必要的数据到内存缓存起来,其余数据只有在需要时才从数据库中调出再缓存。这种策略比较保守,缺点是在数据量比较大且频繁访问之初由于要多次频繁的向backing store获取数据,但通常我们使用这种的就 阅读全文

浅谈缓存的设计与使用注意项(上)

2010-12-28 00:13 by 姜 萌@cnblogs, 1773 阅读, 7 推荐, 收藏, 编辑
摘要:memory cache + backing store enterprise libiary中的caching block 在微软pattern&practise团队发布的enterprise library5版本中带有一个caching block,这个缓存块为我们提供了缓存数据大一些列方法。其架构如下图(这里再说明一下:caching block以后会被整合进.net framework之中,enterlib5的后续版本会将caching block剔除): caching block采用的是“内存缓存+backing store”结构(不过backing store是可选的),程序 阅读全文

silverlight游戏设计(四)角色/精灵篇之 -- 精灵的设计

2010-12-26 19:06 by 姜 萌@cnblogs, 1487 阅读, 10 推荐, 收藏, 编辑
摘要:精灵的呈现基础 silverlight的那套api并不是一个为游戏设计的,你找不到现成的”精灵”相关的类。 最简单的精灵用一个Image就可以充当,但游戏中总是存在各式各样的精灵,不同精灵又有不同的逻辑,为了方便设计我们有必要定义一些接口。 呈现器接口—IPresenter IPresenterCode highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--namespaceSopaco.Silverlight.GameFramewrok.Sprite{// 阅读全文

silverlight游戏设计(二)资源管理篇(补充)--图片帧序列资源包解析与图片资源处理

2010-12-26 17:05 by 姜 萌@cnblogs, 688 阅读, 8 推荐, 收藏, 编辑
摘要:通过在上篇文章中构建的资源管理器和应用的demo,我们已经能够将游戏资源高效的下载过来并进行缓存。那么在资源管理这一块剩下的就是我们定义自己的资源文件结构和解析资源了。本文像大家展示图片资源包的组织和解析,以及涉及一些有用技巧。 StreamResourceInfo 一个mmorp 游戏的资源是非常多且杂的。比如单说玩家职业就可能有5、6种,每种又分性别,对于一个精灵而言,至少要准备是5个方向的帧序列动画图片(比如上,下,左,左上,左下。对于右边,右上和右下用前几种直接翻转即可),而动作上还能细分出站立、跑、战斗、死亡……。所以我们需要对资源进行归并、打包。这样不仅便于项目文件管理,而且还能 阅读全文

silverlight游戏设计(二)资源管理篇(下)--资源的状态通知、管理与缓存

2010-12-24 19:18 by 姜 萌@cnblogs, 1249 阅读, 9 推荐, 收藏, 编辑
摘要:在上篇中,我们实现了一个带有池化、并发连接限制能力的资源下载器,虽然这个下载器能够使我们的游戏动态加载资源并在加载完毕/失败后调用回调方法。但是还是缺乏一些智能。比如我要加载一个game_role_petegg.zip的资源包,如我们有需求:1.对已经下载过的资源不再重复下载。2.下载过的资源要缓存,一方面存在内存中,一方面存在isolatedstorage中。实现这些功能会极大的提高用户体验,所我们有必要设计一个带有缓存控制能力的资源管理器。复用已有的DownloadDelegater搞开发的嘛,不可能每一个需求都单独写一片代码,这要将对象的职责分离清楚,复用还是很容易的。我们定义需求接口: 阅读全文
点击右上角即可分享
微信分享提示