前言

想当年Team有无数人在玩大菠萝,我被忽悠进来做肉盾,选了蛮子,从1.0开始,经历了103、105、108、2.0、2.1。这个游戏对我最大的帮助是学习了不同的技术,比如XAML、比如xcode开发、比如WP的开发。

这篇文章不会step by step的介绍如何从0开始做WP开发,我会重点记录开发过程中要注意的坑,以及一些发布上架时的注意事项。

文中大部分内容对于熟悉XAML的人来讲,可能过于简单。放在这里,希望对初学者有个帮助,尤其是如我这样做winform开发的人。

先上几张图,

官方API

玻璃渣现在有两套API在并行运行,官方文档老版本的地址:https://github.com/blizzard/d3-api-docs,新版本的地址:https://dev.battle.net/io-docs。

两者的区别是,前者不包含诸如坚韧、圣教军等资料片中出现的内容,当然也不包括天梯、附魔等内容。后者不包含每个装备的item tooltip html。同时,后者必须要注册一个开发者账号(免费的)。

XAML绑定

Appbar的写法

<phone:PhoneApplicationPage.ApplicationBar><shell:ApplicationBar BackgroundColor="Black" ForegroundColor="White" Mode="Default" Opacity="1.0" IsMenuEnabled="True" IsVisible="True"> <shell:ApplicationBar.MenuItems> <shell:ApplicationBarMenuItem Text="Feedback" Click="Email_Click"/> <shell:ApplicationBarMenuItem Text="Share" Click="Share_Click"/> <shell:ApplicationBarMenuItem Text="Score" Click="Score_Click"/> <shell:ApplicationBarMenuItem Text="Clear Cache" Click="ClearCache_Click"/> <!--<shell:ApplicationBarMenuItem Text="Server Status" Click="ServerStatus_Click"/>--> </shell:ApplicationBar.MenuItems> <shell:ApplicationBarIconButton IconUri="/assets/appbar/search.png" Text="Search Friend" Click="AppbarAddFriend_Click"/> </shell:ApplicationBar> </phone:PhoneApplicationPage.ApplicationBar>

View Code

这里分为两部分,MenuItems是右下角三个点对应的菜单项,IconButton对应的是图标按钮。前者无对应图标,如果是英文,则全部小写字母;后者可以指定是否只显示图标,或者同时显示图标与文字。

画线

<Line X2="300" Stroke="White" Height="1" StrokeThickness="3"></Line>

这段XAML画一条白色的线,注意颜色及线宽都是用Stroke***属性指定的。

指定格式绑定数字

<TextBlock HorizontalAlignment="Right" Text="{Binding Toughness, Converter={StaticResource IntConverter}}">Toughness</TextBlock>

这个文本框绑定资料片中英雄的坚韧属性,如果想按照千分位(或者你自己别的格式显示),则再指定Converter的class信息。

如,千分位的Convert代码如下:

public class IntConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return String.Format("{0:N0}", value); }

而如果显示小数点后两位的浮点数,则对应代码为:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return String.Format("{0:f2}", value); }

属性的嵌套绑定

<Border BorderThickness="1" Height="130" Canvas.Left="72" Canvas.Top="515" Width="68" BorderBrush="{Binding ItemList[mainhand].BorderBrush]}" Tap="MainHand_Tap"> <Border.Background> <ImageBrush ImageSource="{Binding ItemList[mainhand].BorderBackGround}"/> </Border.Background> <Image Source="{Binding ItemList[mainhand].ItemImage}" Stretch="None" Height="128" Width="64" Margin="0,0,0,0"/> </Border>

这个page的DataContext是Hero hero,而Hero的部分结构如下:

public class Hero
{ private int id; private string name; //。。。 private Dictionary<string, Item> itemList = new Dictionary<string, Item>();

主手武器的图片,如果用code behind方式写,对应代码中的hero.ItemList[“mainhand”].ItemImage。XAML方式则对应为:"{Binding ItemList[mainhand].ItemImage}" 。注意mainhand属性在xaml中没有了双引号。

属性的嵌套绑定2

<Image Canvas.Left="254" Canvas.Top="38" Source="{Binding SkillList[1].SkillImage}" Stretch="None" Tap="Skill1_Tap"></Image>

这是Skill中的鼠标右键技能,大菠萝目前一共有2个鼠标技能,4个Action技能,4个被动技能(资料片之前是3个),代码中简单的用SkillList包含了这10个技能。所以对于鼠标右键技能,绑定的Xaml就变成了"{Binding SkillList[1].SkillImage}" ,同理,对于第一个被动技能,则对应的是="{Binding SkillList[6].SkillImage}"

代码相关

Unix时间的转换

D3中的last updated是Unix时间,是一个ulong类型的值,转换为DateTime的代码如下:

DateTime unix = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); DateTime last = unix.AddSeconds(lastUpdated);

文件名过长

为了提高效率,对于装备的图片,代码中进行了缓存,保存在该应用的IsolatedStorage目录下。D3中的tooltip名字都很长,Windows系统中,路径+文件名长度不能超过260个字节。所以简单的做法,是对文件名做了一个Hash,来作为缓存文件名称。(当然,会有偶尔的冲突,这个代码没有做处理)

localfile = Math.Abs(localfile.GetHashCode()).ToString();//localfile就是本地缓存的文件名。

手机可用空间

string free = String.Empty; long freeSize=IsolatedStorageFile.GetUserStoreForApplication().AvailableFreeSpace;if (freeSize >> 30 >= 1) free = String.Format("{0:N0}GB", (freeSize >> 30)); else if (freeSize >> 20 >= 1) free = String.Format("{0:N0}MB", (freeSize >> 20)); else if (freeSize >> 10 >= 1) free = String.Format("{0:N0}KB", (freeSize >> 10)); else free = String.Format("{0:N0}", freeSize);

读取本地资源

public BitmapImage BackGround { get { return new BitmapImage(new Uri("/assets/background/" + this._class.Replace("-", "").ToLower() + this.male + "_background.jpg", UriKind.Relative)); } }

注意Uri的路径写法。

展示适配WP屏幕的HTML信息

这是优化过的利用内置WebBrowser展示的我左手华戒的tooltip信息。如果直接用WebBrowser展示,该html会非常小,基本不可读。

对于这个问题,可以通过设置viewport来解决。官方很有价值的一篇文章,请戳这里:http://blogs.msdn.com/b/iemobile/archive/2011/01/21/managing-the-browser-viewport-in-windows-phone-7.aspx

放代码如下:

StringBuilder sb = new StringBuilder(); sb.AppendLine("<html>"); sb.AppendLine("<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en-us\">"); sb.AppendLine("<head xmlns:og=\"http://ogp.me/ns#\" xmlns:fb=\"http://ogp.me/ns/fb#\">"); sb.AppendLine("<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\" />");//这行很重要 sb.AppendLine("<meta name=\"viewport\" content=\"width=370,minimum-scale=1\" />");//这行也很重要  sb.AppendLine("</head>"); sb.AppendLine("<body style=\""); sb.AppendLine(lines); //这就是D3返回给我的华戒的html描述信息  sb.AppendLine("</body>"); sb.AppendLine("</html>");

并行获取数据

每个英雄有14个装备,每个装备的信息都要单独获取对应的图片及tooltip。如果采用await GetItemByKey的方式,则14个装备的图片全部读完,读取时间至少在8秒之上。

利用Task的并行处理方式,我们的处理效率则大大提高了。

性能差的方式

list.Add("head", await GetItemByKey(person, "head")); list.Add("torso", await GetItemByKey(person, "torso")); list.Add("feet", await GetItemByKey(person, "feet")); list.Add("hands", await GetItemByKey(person, "hands")); list.Add("shoulders", await GetItemByKey(person, "shoulders")); list.Add("legs", await GetItemByKey(person, "legs")); list.Add("bracers", await GetItemByKey(person, "bracers")); list.Add("mainhand", await GetItemByKey(person, "mainHand")); list.Add("offhand", await GetItemByKey(person, "offHand")); list.Add("waist", await GetItemByKey(person, "waist")); list.Add("rightfinger", await GetItemByKey(person, "rightFinger")); list.Add("leftfinger", await GetItemByKey(person, "leftFinger")); list.Add("neck", await GetItemByKey(person, "neck")); list.Add("special", await GetItemByKey(person, "special"));

View Code

高性能的方式

Task<Item> head = GetItemByKey(person, "head");
Task<Item> torso = GetItemByKey(person, "torso"); Task<Item> feet = GetItemByKey(person, "feet"); Task<Item> hands = GetItemByKey(person, "hands"); Task<Item> shoulders = GetItemByKey(person, "shoulders"); Task<Item> legs = GetItemByKey(person, "legs"); Task<Item> bracers = GetItemByKey(person, "bracers"); Task<Item> mainhand = GetItemByKey(person, "mainHand"); Task<Item> offhand = GetItemByKey(person, "offHand"); Task<Item> waist = GetItemByKey(person, "waist"); Task<Item> rightfinger = GetItemByKey(person, "rightFinger"); Task<Item> leftfinger = GetItemByKey(person, "leftFinger"); Task<Item> neck = GetItemByKey(person, "neck"); Task<Item> special = GetItemByKey(person, "special");

View Code

//上面代码会立刻返回,只是定义了task而已。

await Task.WhenAll(head, torso, feet, hands, shoulders, legs, bracers, mainhand, offhand, waist, rightfinger, leftfinger, neck, special);

//这行代码会并行执行这14个任务,等待所有信息完成。

list.Add("head", head.Result);
list.Add("torso", torso.Result); list.Add("feet", feet.Result); list.Add("hands", hands.Result); list.Add("shoulders", shoulders.Result); list.Add("legs", legs.Result); list.Add("bracers", bracers.Result); list.Add("mainhand", mainhand.Result); list.Add("offhand", offhand.Result); list.Add("waist", waist.Result); list.Add("rightfinger", rightfinger.Result); list.Add("leftfinger", leftfinger.Result); list.Add("neck", neck.Result); list.Add("special", special.Result);

View Code

//14个任务的结果加入到list中。

判断Json片段是否为空

private async Task<List<Skill>> GetSkillList(dynamic skills)
{ List<Skill> skillList = new List<Skill>(); foreach (var skill in skills) { if (skill.ToString()!="{}")//skill不是null,如果不存在,则对应{}

发布到商店

WebBrowser的权限

如果应用中用了WebBrowser,则需要指定相关权限。具体位置在:project-Properties-WMAppManifest.xml-Capabilities中,要check上ID_CAP_WEBBROWSERCOMPONENT

SL8.1版本的发布

对于SL8.1版本的WP应用,Package.appxmanifest文件的内容,要做修改。我这个程序是从8.0升级上来的,所以还是SL内核的版本,如果是一个新建的8.1WP应用,则无需做下面的修改。

  • <publisherDiaplsyName>与开发商名字一致
  • <Identity>下面的Name要与你在dev center中预留的名字一致
  • <Publisher>与dev center中的开发商GUID一致

Deploy error: Package could not be registered

官方论坛上有这个解答:https://social.msdn.microsoft.com/Forums/en-US/da89f2ee-03b6-43ed-aa21-97ef091798c9/deploy-error-package-could-not-be-registered?forum=WindowsPhonePreviewSDK

8.1的系列官方blog

http://blogs.msdn.com/b/thunbrynt/archive/2014/03/31/windows-phone-8-1-for-developers-overview.aspx

FQQ

转载于:https://www.cnblogs.com/symphonygcr/p/4058308.html

开发WP版本的大菠萝英雄榜相关推荐

  1. 干货100+ 最超全的web开发工具和资源大集合

    干货100+ 最超全的web开发工具和资源大集合   作为Web开发者,这是好的时代,也是坏的时代.Web开发技术也在不断变化.虽然很令人兴奋,但是这也意味着Web开发人员需要要积极主动的学习新技术和 ...

  2. 面向智能化软件开发的开源生态大数据

    点击上方蓝字关注我们 面向智能化软件开发的开源生态大数据 张洋1, 王涛1, 尹刚2,3, 余跃1, 黄井泉3 1 国防科技大学计算机学院,湖南 长沙 410073 2 绿色计算产业联盟,北京 100 ...

  3. 怎么能跳过苹果服务器降级系统,iPhone手机可以降级任意系统版本?大神有话说...

    原标题:iPhone手机可以降级任意系统版本?大神有话说 说到iPhone手机降级这话题,我相信每位果粉都是很激动的,为什么激动呢?因为iPhone5以上手机只要系统验证关闭了你已升级,意味着就永久不 ...

  4. 想转行做大数据开发,求各路大神给指条明路?

    其实想转大数据的最初原因很简单,就是想在收入上有所提升,其实现在越来越多人开始看中大数据开发这个岗位了,无非就是下面这些原因,如果你真的付出努力愿意去学习的话,相信也不会辜负你的努力~ 1.行业发展好 ...

  5. 周鸿祎产品秘笈:小版本成就大产品

    周鸿祎产品秘笈:小版本成就大产品 来源:360安全中心 发布日期:2009-09-22 已有67条评论    我要评论 近日,360公司董事长周鸿祎做客腾讯科技<新产品经理>系列访谈,期间 ...

  6. 大商创x支持mysql版本_大商创x全面升级2.0,匠心打造b2b2c多用户商城系统

    2018年大商创发布了全新的产品--大商创X,因为众多用户对大商创产品的期待,所以大商创X一经面世就引起大家的极大关注,这与其系统优势有着密不可分的联系. 如今距离第一代产品发布近2年时间,大商创X也 ...

  7. 雅虎微博产品Meme开放API 开发智能手机版本(10月13日)

    雅虎微博产品Meme开放API 开发智能手机版本 据国外媒体报道,雅虎已将其微博产品雅虎Meme的API向第三方开发者开放,用于开发用于智能手机的版本. 该第三方应用建立在雅虎知识堂(Yahoo Qu ...

  8. Android官方开发相关下载资源一揽子大汇总

    鉴于你懂得原因,google在中国访问受到了很大一部分的限制,更新SDK神马的都很费劲,本帖提供下载地址,对于无缘翻墙和稳定VPN的同学,可以不用访问google的Android开发者网站即可实现资源 ...

  9. 2018年最好的软件开发、云计算、大数据分析和机器学习工具

    InfoWorld编辑和评论家评选出今年最好的软件开发,云计算,大数据分析和机器学习工具. 欢迎来到InfoWorld的年度技术奖,这是我们对信息技术领域中最好,最具创新性,最重要的产品的年度庆典. ...

最新文章

  1. laravel和dingoapi的结合使用
  2. linux中设置程序开机自动启动
  3. 美国德州光伏装机可能拉低当地峰值电价
  4. 盘点海外动力电池巨头 细数日韩锂电设备企业
  5. C语言百度翻译API的使用,c语言怎么翻译? 程序怎么运行?
  6. 【机器学习】分类算法-K-近邻算法
  7. 86. 分隔链表 golang
  8. 安卓自定义View进阶-分类与流程
  9. 步步为营-49-视图
  10. 高人,不断地在营销, 有收入就是高人
  11. 手把手教你构建食物识别AI:小白轻易可上手,人气高赞有Demo | 资源
  12. pandas—pd.DataFrame.sample
  13. Pyston v2 发布:比 Python 快 20%
  14. 《Ansible权威指南 》一1.6 Ansible应用场景
  15. 开源渗透测试工具合集
  16. 使用Fragstats对栅格数据进行分析
  17. 三菱FX3U-485ADP-MB通讯三种变频器程序
  18. 内存及Cache带宽测试
  19. 为什么独立站卖家都在WhatsApp上进行销售?
  20. 超过2t硬盘分区_大于2T的磁盘怎么分区呢?

热门文章

  1. 液化气瓶口的二维码“身份证”
  2. 网络天才网页中文版_【在线猜谜类网页游戏】网络天才网页版在线玩
  3. Tomcat 学习笔记
  4. Python学习案例2——数独解题及出题程序
  5. java file.io的各种使用
  6. 支付宝余额提现收手续费了
  7. Html5实现的语音搜索功能
  8. Android 语音识别+语音搜索源码 Voice Search
  9. 必应词典软件案例分析
  10. 使用牛顿迭代法求根 一元三次方程的根