Windows Phone 7 学习流水攻略(一)
学而不思则罔,思而不学则殆。
从上周开始看Charles Petzold的《Programming Windows Phone 7》。书中的内容颇为丰富,受益匪浅。
但也因为书中涵盖内容太多,需要做的笔记也很多,所以索性写博客按章节把内容总结出来。
目的有两个:
第一,对所学知识做一个总结。
第二,便于以后按章节查找具体内容,毕竟书是英文版,如果要找相应内容面对长得差不多的英文还是要翻一阵的。
好了,从前言开始吧!
前言,大体介绍了安装开发环境需求(Windows 7系统,VS2010),书中的内容,一些资源的索引,本书针对的人群(对C#和.NET有经验)等。
其中作者针对那些没有学习过C#和.Net的C++程序员(like me),推荐了他的一本书《.NET第0章:C或C++程序员必须知道的C#和.NET Framework》(.NET Book Zero: What the C or C++ Programmer Needs to Know about C# and the .NET Framework),我还真是好好看了一遍他推荐的这本书,从C/C++的程序员角度入手解释C#和.NET,算是启蒙书。
书分三个部分:第一部分(1-6章)介绍Silverlight和XNA的共同部分,第二(7-18章)、第三(19-23章)部分分别介绍Silverlight和XNA下的开发。
(国外的朋友写书喜欢留伏笔,前面大概说说,后面扩展,所以有些章节只是知识的索引大头在后面,中间的跨度可能有好几章)
第一章,Hello, Windows Phone 7。
一,介绍Silverlight和XNA上两个框架的异同。
Silverlight偏流程,由事件触发流程。XNA偏游戏开发,主要是玩循环的。
个人理解,XNA就是类似于纯的Windows API开发,当然也封装过了,为了省你的事给你架了一套处理图像处理机制。不然双缓冲,事件处理啥的就还得你做。
Silverlight就是高级版的MFC(其实更像Flash),利用XAML布局,C#写后台。
二,介绍硬件按键
告诉你屏幕上那几个难看的按键都是干嘛用的。在后面的开发中,你会发现其实这几个按键具体触发的事件等。
还有告诉你现在手机有可能出现的分辨率会是啥样的。另外告诉你屏幕的特性——屏幕Theme颜色越暗越省电。
三,介绍硬件传感器和服务
什么Wifi,摄像头,加速度传感器,位置服务(GPS),FM收音机,Push同步(Push Notifications,减少网络交互用的,必要时才做连接的服务)
四,破处之旅
告诉你VS里面怎么找到建立工程的入口。
五,第一次和Silverlight搞
告诉你怎么改程序标题,怎么运行(调试)程序,怎么在模拟器上玩的爽(调整模拟器屏幕大小)。
六,一个Silverlight程序中包含的基本文件
两对配对的开发文件:
App.xaml和App.xmal.cs
还有
Main.xaml和Main.xmal.cs
.xmal是前台文件.cs是对应的后台文件。
App那一对是程序运行的入口文件和全局的配置文件。
Main那一对是第一“夜”的服务内容。
其中说到xaml生成的中间文件.g.cs(其实也是个cs文件)在obj/Debug目录下,这个文件可了不起了,是你xaml编译后生成的cs文件,其中包含了你在.cs文件中用到的变量声明。然后,利用了C#可以利用Partial将类份文件编译的语言特性,将声明和.cs文件揉起来。但是这个文件是自动生成的,不要做修改,因为如果你修改了下次重编的时候还会变回去,要是想修改就看看你的xaml文件有没写错吧!!
接着,分别介绍了xaml基本标签的含义,如<phone:PhoneApplicationPage ….>,<Grid…>,<TextBlock…>等等
最后告诉你怎么通过修改xaml改标题和添加一个TextBlock,并且介绍了TextBlock的HorizontalAlignment和VerticalAlignment属性。
七,颜色主题
介绍如何换主题,还有通过TextBlock的Foreground属性变换字体颜色。
八,教你怎么算字体大小和字体的实际大小
九,告诉你WP7程序打包的秘密
XAP程序包文件其实是个zip文件,你把后缀xap文件改成后缀zip,可以用Winzip打开查看其中的资源。
我发现资源是散着的,而程序是个dll。
十,第一个XNA程序
一个新的XNA工程的结构:一个新开的XNA项目,有两个工程,一个是资源工程,一个是逻辑工程。
介绍了如何向资源工程里添加字体,如何编辑SpriteFont文件,里面的标签是干啥的,如:FoneName,Size,CharacterRegions等等。
介绍了在逻辑工程Game1.cs文件中添加一个自定义字体的方法:
要建立N个变量……
在Game1()构造函数里生成对象,
运行Initialize()函数初始化,
在LoadContent()载入字体资源(如果有可能在这里做画图的初始化工作,计算坐标等,因为在这里载入字体资源后才能得到字体的大小,才能够算出字符串所占像素数。)
-----------------
Tips:
1. this.Content.Load<SpriteFont>(“spriteFontName”)
Content是ContentManager的引用,用于Load资源。
2. Vector2 SpriteFont.MeatureString(string str)
可以得到字符串像素大小。
3. this.GraphicsDevice.Viewport
可以得到屏幕可操作的区域大小,及起始点(0,0),另外屏幕左上角是(0,0)点
-----------------
然后程序会运行Update,Draw,Update,Draw…两个函数循环执行。
因此在Update的时候做逻辑运算,在Draw的时候画图。
------------------
Tips:
1. 由于垃圾回收会占用资源,影响效率,因此在XNA程序中struct会被更频繁的用到(C#中sruct是栈分配内存且做内存拷贝)
2. 处于对第一点的考虑,在Update函数中尽量不要调用new来在堆上构造class.
3. Draw的时候利用SpriteBatch做画图操作。具体的画图语句应该包含在SpriteBatch.Begin()和SpriteBatch.End()之间
如:
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Navy);
spriteBatch.Begin();
spriteBatch.DrawString(segoe14, text, textPosition, Color.White);
spriteBatch.End();
base.Draw(gameTime);
}
------------------
最后,作者为下一章做了铺垫。
在Silverlight中屏幕的默认方向是Portrait,XNA方向是LandscapeRight的。
下一章将介绍屏幕方向的问题。