zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    ORA-28000: the account is locked-的解决办法
    j对ava序列化的学习理解
    Oracle数据库中的时间格式和java中时间格式的转换
    抽象类和接口的区别
    glVertexAttribPointer
    运算符重载
    lua回调时把函数当参数传递时需注意的事项
    visual studio 编译文件生成路径
    UITableView自定义Cell中,纯代码编程动态获取高度
    ASP.NET发送邮件(QQ发送)
  • 原文地址:https://www.cnblogs.com/SanMaoSpace/p/2140490.html
Copyright © 2011-2022 走看看