博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WP7基础学习---第十五讲
阅读量:6951 次
发布时间:2019-06-27

本文共 5702 字,大约阅读时间需要 19 分钟。

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;
}

转载于:https://www.cnblogs.com/SanMaoSpace/archive/2011/08/16/2140490.html

你可能感兴趣的文章
POJ 3020, Antenna Placement
查看>>
PHP+jQuery实现翻板抽奖
查看>>
service 03 iis之服务器无访问权限
查看>>
如何高效编写可维护代码?
查看>>
jQuery基础之二(操作标签)
查看>>
关于swift语言中导入OC三方类找不到头文件的解决方法
查看>>
ALV中处理过滤掉的行
查看>>
PHP通过url下载远程图片到本地
查看>>
测试RESTful API利器-Postman
查看>>
十步完全理解 SQL(转载)
查看>>
windows 8 rtm installation key
查看>>
(一) request
查看>>
C#多线程间的同步问题
查看>>
[深度学习大讲堂]文化、进化与局部最小值
查看>>
Nginx
查看>>
【Error】IOError: [Errno 22] invalid mode
查看>>
repmgr学习记录(搭建主从复制)
查看>>
BinaryFormatter探讨
查看>>
用keras 和 tensorflow 构建手写字识别神经网路
查看>>
HDU 4101 Ali and Baba
查看>>