zoukankan      html  css  js  c++  java
  • 基于Silverlight的Windows Phone 推箱子程序开发

    概述:
          最近初学Windows Phone 开发,计划开发一个完整的应用练练手。因为以前写过一个基于桌面的推箱子程序,所以计划把它移植到Windows Phone 平台上来。移植过程比较顺利,业务代码及寻路算法基本没有改动,直接可以使用。

    开发环境:
        VS2010UltimTrialCHS SP1
        WPSDK v7.1_chs
        Silverlight for Windows Phone Toolkit
        测试机型:撸妹(Nokia 800C )

    下载:
         应用:快乐推箱子.xap

         商城下载:http://windowsphone.com/s?appid=b3692810-374b-4327-bd46-837e60949771

         二维码:
                             

    分享:
          代码没有必要一一贴出来分析了,就开发过程中碰到的一些问题做一些简单介绍。
    1. 应用的部署
    刚拿到机器的时候不知道如何安装xap文件,VS也无法使用真机调试。正规途径要缴纳600大洋年费,非正规途径就是注册学生开发者账号,但教育邮箱老难搞了,搞了两天都没有搞到,后来上淘宝9快钱买一个,很好用。

    2. 获取手势
    采用toolkit:GestureService的手势服务获取手势信息
                <Canvas x:Name="canvas1">
                    <toolkit:GestureService.GestureListener>
                        <toolkit:GestureListener  Flick="GestureListener_Flick" Tap="GestureListener_Tap"/>
                    </toolkit:GestureService.GestureListener>                  
                </Canvas>
    划动:
            private void GestureListener_Flick(object sender, FlickGestureEventArgs e)
            {
                if (e.Direction == System.Windows.Controls.Orientation.Horizontal)
                {
                    if (e.HorizontalVelocity < -15.0)
                    {
                        Left();
                    }
                    else
                    {
                        Right();
                    }
                }
                else
                {
                    if (e.VerticalVelocity < -15.0)
                    {
                        Up();
                    }
                    else
                    {
                        Down();
                    }
                }
            }

    轻击:
            private void GestureListener_Tap(object sender, Microsoft.Phone.Controls.GestureEventArgs e)
            {
                Point p = e.GetPosition(sender as UIElement);
            }

    3. 自动跑路
    轻击一处可以跑得到得方格,搬运工会自己跑过去。
    思路:
    (1) 启动BackgroundWorker;
    (2) 计算路径;
    (3) 每走一步通过ReportProgress通知主线程重绘用户界面

    4. 页面导航及相互传值
    新开页面传参数过去比较容易,如果是选择页面,获取返回值就相对麻烦一点,因为页面之间交互都是异步进行的,主页面不可能等待选择页面返回。具体处理办法:
    (1) 在App.xaml中创建全局变量来传递参数;
    public partial class App : Application
     {
            public static bool _Selected = false;
            public static int _Level = 0;
    }
    (2) 主页面启动选择页面;
    private void ApplicationBarMenuItem_Select_Click(object sender, EventArgs e)
    {
         NavigationService.Navigate(new Uri("/PageSelectLevel.xaml", UriKind.RelativeOrAbsolute));           
     }
    (3) 选择页面返回;
    private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
                App._Level = selectlevel;
                App._Selected = true;

                NavigationService.GoBack();
      }
    (4) 主页面激活时查询全局变量
    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
                base.OnNavigatedTo(e);
                     
                if (App._Selected)
                {
                    CurrentLevel = App._Level;
                    LoadData();
                    App._Selected = false;
                }
    }

    5. 地图文件的制作和读取
    地图编辑器采用XML文件保存地图文件,项目将XML导入作为字符串资源。
    (1) 保存地图
                    List<MapState> ms = new List<MapState>();          
                    FileStream file = new FileStream(FileName, FileMode.Create);
                    XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
                    xmlWriterSettings.Indent = true;

                    XmlSerializer serializer = new XmlSerializer(typeof(List<MapState>));
                    using (XmlWriter xmlWriter = XmlWriter.Create(file, xmlWriterSettings))
                    {
                        serializer.Serialize(xmlWriter, ms);
                    }
                    file.Close();

    (2) 读取字符串
                XmlSerializer serializer = new XmlSerializer(typeof(List<MapState>));
                String mapxml = ResourceMaps.ResourceManager.GetString("_1");
                Stream sr = new MemoryStream(Encoding.UTF8.GetBytes(mapxml));
                List<MapState> data = (List<MapState>)serializer.Deserialize(sr);

    界面:

         
     

    其他:
    1. 界面效果一般,仅实现功能。
    2. 不能保证所有地图都正确呀,没有严格测试。
    3. 用XNA设计此类程序会更合适一点吧。

  • 相关阅读:
    Window上编译最新版libCef(Branch 2704)(转载)
    在hue 使用oozie sqoop 从mysql 导入hive 失败
    hive 支持更新
    基于Hadoop生态圈的数据仓库实践 —— 环境搭建(三)笔记
    修改CENTOS7的网卡名(将网卡ens33修改为我们在centos6中常见的eth0)
    config network name
    Java服务部署规范(内部使用)
    MongoDB干货系列1-定期巡检之Mtools
    mongodb validation--像关系型数据库表去使用mongodb
    ntp 服务导致kudu集群不可用
  • 原文地址:https://www.cnblogs.com/seabluescn/p/2722118.html
Copyright © 2011-2022 走看看