WP7基础学习---第十五讲

WP7--15

(注:本节主讲对XNA,游戏开发的简介,简单了解一些,不过课程中的Audio,input,也可用于其他的应用开发,有对应的命名空间!

 对于WP7基础的学习,就到此结束,如果你对WP7更感兴趣,可以去下载相关的书籍和视频,祝学习路途愉快!)

XNA在Silverlight中的应用:
1.XNA基本知识;2.Audio:Sound\Song;3.Microphone;4.input

1.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 7

3.基本架构
(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.Framework
using 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.Audio
SoundEffect 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;
}

posted @ 2011-08-16 13:14  SanMaoSpace  阅读(468)  评论(0编辑  收藏  举报