WP7--15
(注:本节主讲对XNA,游戏开发的简介,简单了解一些,不过课程中的Audio,input,也可用于其他的应用开发,有对应的命名空间!
对于WP7基础的学习,就到此结束,如果你对WP7更感兴趣,可以去下载相关的书籍和视频,祝学习路途愉快!)
XNA在Silverlight中的应用:
1.XNA基本知识;2.Audio:Sound\Song;3.Microphone;4.input1.XNA基本知识:
(1).XNA中的X表示能够在Windows Xbox和合作伙伴之间达到跨平台的强大的软件工具;N表示下一代(Next-generation);A表示架构(Architecture)(2).是基于DirectX的游戏开发环境,是微软对于Managed DirectX 的修正集扩充版本(3).帮助开发者在创建更加优秀快速和跨平台的游戏时能够减少费用(4).特点:<1>.监控和使用accelerometer数据,这样就可以开发出具有重力感应的游戏;<2>.只能保存数据到IsolatedStorage,而不能保存到其他介质上2.开发环境
(1).硬件:需要显卡最少支持DirectX10,Shader Mode2.0(2).操作系统要求:Windows Vista;Windows 73.基本架构
(1).Loading:用来加载保证游戏可以正常运行的所有资源等,这个状态在整个系统中只在游戏开始前运行,也就是说整个游戏的生命周期中运行一次;(2).Update:这个状态是由所设置的时间间隔来驱动的,在每个时间间隔里重新计算游戏中个角色的状态,以及游戏分值和各种游戏逻辑。一般默认为每秒30次(帧),如果设置时间间隔过大,游戏可能无法启动;(3).Draw:这个状态也是由所设置的时间间隔来驱动的,用来描绘各种变化到显示设备上4.模拟XNA架构
DispatcherTimer dt=new DispatcherTimer();dt.Interval=TimeSpan.FromMilliseconds(33);dt.Tick+=new EventHandler(dt_Tick);dt.Start();void dt_Tick(object sender,EventArgs e){ try {FrameworkDispatcher.Update();} catch { }}代码:
引用命名空间:Microsoft.Xna.Frameworkusing Microsoft.Xna.Framework;在构造函数中:
DispatcherTimer dt=new DispatcherTimer();dt.Interval=TimeSpan.FromMilliseconds(33);dt.Tick+=new EventHandler(dt_Tick);dt.Start();在dt_Tick方法中:void dt_Tick(object sender,EventArgs e){ try {FrameworkDispatcher.Update();} catch { } this.PageTitle.Text=DateTime.Now.ToString("HH:mm:ss");}5.Audio开发
(1).Sound<1>.用来播放一些很短的wav格式的音频,比如点击等声音效果<2>.命名空间Microsoft.Xna.Framework.AudioSoundEffect se;se.GreateInstance().Play();//播放se.GreateInstance().Stop();//停止se.GreateInstance().Pause();//暂停se.GreateInstance().Resume();//继续se.GraeteInstance().IsLooped=true;//循环播放//最好将音频做成资源,以资源的方式加载,读取资源流
SoundEffect sound=new SoundEffect(Stream.ToArray(),SampleRate,AudioChannels.Mono);SoundEffectInstance inst=sound.CreateInstance();inst.Play();代码:
按钮下代码:SoundEffectInstance SoundInst;StreamResourceInfo info=Application.GetResourceStream(new Uri("Deanel.component/Player_Hit.wav"));
byte[] buffer=new byte[info.Stream.Length];info.Stream.Read(buffer,0,buffer.Length);SoundEffect sound=new SoundEffect(buffer,8000,AudioChannels.Mono);SoundInst=sound.CreateInstance();soundInst.Play();(2).Song
可以播放mp3等格式的音乐,可以用来播放背景音乐;命名空间Microsoft.Xna.Framework.Media//Uri获取本地音乐或网络音乐Song song=Song.FromUri("MyMusic",new Uri("Media/TestMusic.mp3",UriKind.Relative));MediaPlayer.Play(song);//MediaPlayer的静态方法6.Microphone:调用麦克风录音;
命名空间Microsoft.Xna.Framework.Audio
Microphone.BufferReady+=new EventHandler<EventArgs>(_Microphone_BufferReady);
_Microphone.GetData(buffer);_Microphone.Start();_Microphone.Stop();代码:
定义:Microphone Microphone=Microphone.Default;//获取默认麦克风byte[]buffer;MemeryStream Stream=new MemeryStream();在构造函数中:_Microphone.BufferReady+=new EventHandler<EventArgs>(_Microphone_BufferReady);void _Microphone_BufferReady(object sender,EventArgs e)
{ _Microphone.GetData(buffer); Stream.Write(buffer,0,buffer.Length);}加一个录制按钮,按钮下的代码:
buffer=new byte[_Microphone.GetSampleSineInBytes(TimeSpar.FromMilliseconds(500))];Stream.SetLength(0);_Microphone.Start();加一个停止按钮,按钮下的代码:
_Microphone.Stop();加一个播放按钮代码:
if(Stream.Length>0){ Thread PlayThread=new Thread(PlayThreadCallback); PlayThread.Start();}private void PlayThreadCallback(object obj){ SoundEffect sound=new SoundEffect(Stream.ToArra(), _Microphone.SampleRate,AudioChannle.Mono); SoundEffectInstrance inst=sound.CreateInstance(); inst.Play();}7.input
与用户的交互方法主要 有三种:手势、按键、触控;命名空间:Microsoft.Xna.Framework.Input;Microsoft.Xna.Framework.Input.TouchPanel;(1).触控:状态只有Move\Press\Release
TouchCollection touchState=TouchPanel.GetState();
foreach(TouchLoaction location in touchState){ switch(location.State) { case TouchLocationState.Pressed:break; case TouchLocationState.Moved;break; case TouchLocationState.Released;break; }}代码:
在dt_Tick方法中:void dt_Tick(object sender,EventArgs e)
{ string title=string.Empty;TouchCollection touchState=TouchPanel.GetState();foreach(TouchLoaction location in touchState){ switch(location.State) { case TouchLocationState.Pressed:title="Press";break; case TouchLocationState.Moved;title="Move";break; case TouchLocationState.Released;title="Released";break; }}this.PageTitle.Text=title;}(2)手势:
可以通过手在屏幕上的不同动作来触发不同应用和触控很相似,但是比其状况要多很多,并且要指定//用来指定手势,必须要先设定,否则会报错TouchPanel.EnableCestures=GestureType.FreeDrag;if(TouchPanel.EnabledGesture!=GestureType.None){ switch(TouchPanel.ReadGesture()) { case GestureType.Tap:break; case GestureType.DoubleTap:break; case GestureType.FreeDrag:break; case GestureType.DragComplete:break; case GestureType.Flick:break; case GestureType.Hold:break; case GestureType.HoeizontalDrag:break; case GestureType.None:break; case GestureType.Pinch:break; case GestureType.PinchComplete:break; case GestureType.VerticalDrag:break; }}代码:
在构造函数中:TouchPanel.EnabledGestures=GestureType.Flick|GestureType.VerticalDrag;在dt_Tick方法中:
string title=string.Empty;void dt_Tick(object sender,EventArgs e){ if(TouchPanel.EnableGestures!=GestureType.None &&TouchPanel.InGestureAvailable) { switch(TouchPanel.ReadGesture().GestureType) { case GestureType.Tap:title="Tap";break; case GestureType.DoubleTap:title="DoubleTap";break; case GestureType.FreeDrag:title="FreeDrag";break; case GestureType.DragComplete:title="DragComple";break; case GestureType.Flick:title="Flick";break; case GestureType.Hold:title="Hold";break; case GestureType.HoeizontalDrag:title="Hoeizon";break; case GestureType.None:title="None";break; case GestureType.Pinch:title="Pinch";break; case GestureType.PinchComplete:title="PinchComp";break; case GestureType.VerticalDrag:title="Vertical";break; } }this.PageTitle.Text=title;}