说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

创建一个Windows Phone 7推箱子益智游戏

HTML文档下载 WORD文档下载 PDF文档下载
现在我们用Windows Phone 7创造一个益智游戏,使用Silverlight和XNA框架音频API的功能。

 

作者:Daniel Vaughan

 

下载源代码

 

介绍

 现在我们用Windows Phone 7创造一个益智游戏,使用Silverlight和XNA框架音频API的功能。

 

入门

 

安装WP7的工具

安装vs 2010 

安装程序将自动下载并安装所需的组件。

如果你想使用的Expression Blend 4 WP7的拓展,下载并安装Expression Blend 。

一旦安装过程完成后,重新启动Visual Studio 2010中。

 

游戏界面

这是主要的用户界面 PhoneApplicationPage。当你创建一个新的 Windows Phone 应用程序这是默认的代码。

 

PageOrientation

Windows Phone应用程式中一个重要的问题是与之匹配的布局方向,特别是检测到方向变化时,如何使我们的UI与之匹配。 PhoneApplicationPage有一个可设置的属性命名SupportedOrientations。该枚举值可以是横排(PORTRAIT)或竖排(LANDSCAPE),或者是PortraitOrLandscape的。分配给它一个值,无论是在XAML或代码中,我们可以控制应用程序如何能变换。我们采用PortraitOrLandscape,因为我希望用户根据自己的意愿自由选择。

一个值得注意的是,从用户代码设置方向是不可能的,因为它被标记为SecurityCritical。

 

SecurityCritical是大多数Silverlight开发人员熟悉的属性。 

请注意,这是Silverlight的安全,并没有具体到 Windows Phone。 

 

从反射,我们可以观察到Page.Orientation不是一个依赖项属性,(也不会引发Page.Orientation PropertyChanged事件),绑定到PhoneApplicationPage属性不会带到其它地方。

 

方向转换

我们可以简单地在OrientationChanged事件中处理,但我没有简单地这样做,而是在MainPage里创建依赖属性,当OrientationChanged事件发生时被调用。我创建了一个IValueConverter,当Page.Orientation属性改变,改变TextBlock的Visibility。

 

 

<TextBlock Visibility="{Binding ElementName=Page, Path=PageOrientation,     Converter={StaticResource OrientationToVisibilityConverter}, 				ConverterParameter= Landscape}" .../>
以下代码从OrientationToVisibilityConverter中摘录,展示了转换器改变PageOrientation来改变Visibility的值。

 

 

public object Convert(object value, Type targetType, 		object parameter, CultureInfo culture){	var orientation = (PageOrientation)value;	string showWhenOrientation = parameter.ToString().ToLower();	bool show = false;	switch (orientation)	{		case PageOrientation.Portrait:		case PageOrientation.PortraitDown:		case PageOrientation.PortraitUp:			show = showWhenOrientation == "vertical";			break;		case PageOrientation.Landscape:		case PageOrientation.LandscapeLeft:		case PageOrientation.LandscapeRight:			show = showWhenOrientation == "landscape";			break;	}	return show ? Visibility.Visible : Visibility.Collapsed;}
使用XNA Framework的音频API
我惊喜的是我们可以容易的使用XNA框架来播放音效。需要即时播放。被警告,但它有挑剔的格式。我发现,只有PCM格式的WAV文件提供了支持。我用GoldWave保存所有到PCM格式的音频。对于较长的片段,如果用MP3,更有意义,但你需要使用MediaElement控件。
所有的声音效果在MainPage.xaml.cs中的代码定义处,以下是代码演示:
readonly SoundEffect footStepSoundEffect = 	SoundEffect.FromStream(TitleContainer.OpenStream("Audio/Footstep.wav"));
然后我们可以向这样播放声音效果:
footStepSoundEffect.Play();
MainPage实例化过程中,有一个Game实例作为其指定DataContext。
主要是控制其所有活动数据绑定和游戏属性的变化。 MainPage如下所示:
<phoneNavigation:PhoneApplicationPage     x:Class="DanielVaughan.Sokoban.UI.MainPage"    x:Name="Page"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    xmlns:phoneNavigation="clr-namespace:Microsoft.Phone.Controls;		assembly=Microsoft.Phone.Controls.Navigation"    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"     xmlns:controls="clr-namespace:DanielVaughan.Sokoban.UI"     mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="800"    SupportedOrientations="PortraitOrLandscape"    FontFamily="{StaticResource PhoneFontFamilyNormal}"    FontSize="{StaticResource PhoneFontSizeNormal}"    Foreground="{StaticResource PhoneForegroundBrush}" Orientation="Landscape">    <phoneNavigation:PhoneApplicationPage.Resources>        <controls:OrientationToVisibilityConverter 		x:Key="OrientationToVisibilityConverter" />        <Style x:Key="CenterLabels" TargetType="TextBlock">            <Setter Property="Foreground" Value="White"/>            <Setter Property="FontSize" Value="18"/>            <Setter Property="VerticalAlignment" Value="Center"/>        </Style>        <Style x:Key="ToolBarWebdings" TargetType="Button">            <Setter Property="Background">                <Setter.Value>                    <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">                        <GradientStop Color="#FF9AFF95" Offset="0.21"/>                        <GradientStop Color="#FF5DD757" Offset="0.589"/>                        <GradientStop Color="#FF99FF93" Offset="1"/>                    </LinearGradientBrush>                </Setter.Value>            </Setter>            <Setter Property="FontFamily" Value="Webdings"/>            <Setter Property="Foreground" Value="White"/>            <Setter Property="Padding" Value="5 "/>        </Style>        <Style x:Key="OrdinaryButton" TargetType="Button">            <Setter Property="Background">                <Setter.Value>                    <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">                        <GradientStop Color="#FF9AFF95" Offset="0.21"/>                        <GradientStop Color="#FF5DD757" Offset="0.589"/>                        <GradientStop Color="#FF99FF93" Offset="1"/>                    </LinearGradientBrush>                </Setter.Value>            </Setter>            <Setter Property="Foreground" Value="White"/>            <Setter Property="Padding" Value="5 "/>        </Style>    </phoneNavigation:PhoneApplicationPage.Resources>    <Grid x:Name="LayoutRoot" Background="White">                <Grid.RowDefinitions>            <RowDefinition Height="Auto"/>            <RowDefinition Height="*"/>        </Grid.RowDefinitions>                       <controls:BackgroundControl Opacity=".3" />        <Border VerticalAlignment="Top" Grid.Row="0" Height="60"                  BorderBrush="#FFFFE63E" CornerRadius="10,10,10,10" 		BorderThickness="2,2,2,2" Margin="0,0,0,0">            <Border.Background>                <LinearGradientBrush EndPoint="0.5,-1.389" 		StartPoint="0.5,2.389" SpreadMethod="Pad">                    <GradientStop Color="#FFFF9900" Offset="1"/>                    <GradientStop Color="#FFFF9900" Offset="0.58"/>                    <GradientStop Color="#FFFFFFFF" Offset="0"/>                </LinearGradientBrush>            </Border.Background>            <Grid>                               <Rectangle Stroke="{x:Null}" Margin="5,3,5,18"                            RadiusX="10" RadiusY="10" Opacity="0.41">                    <Rectangle.Fill>                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">                            <GradientStop Color="#FFECECEC" Offset="0"/>                            <GradientStop Color="#FFFFFFFF" Offset="1"/>                        </LinearGradientBrush>                    </Rectangle.Fill>                </Rectangle>                <StackPanel Height="50" x:Name="stackPanel1" Margin="15,0,5,0"                             VerticalAlignment="Center" HorizontalAlignment="Stretch"                             Width="Auto"  Orientation="Horizontal">                    <TextBlock VerticalAlignment="Center" 			Foreground="White" Text="Code:" TextWrapping="Wrap"/>                                        <TextBox Text="{Binding Path=LevelCode, Mode=OneWay}"                             x:Name="textBox_LevelCode" MaxLength="5"                             Opacity="0.4" Width="110" TextAlignment="Center"                             VerticalAlignment="Center"                              HorizontalContentAlignment="Center"                              GotFocus="TextBox_LevelCode_GotFocus"                              LostFocus="TextBox_LevelCode_LostFocus"                              KeyUp="TextBox_LevelCode_KeyUp"                             Background="White" />                    <Button Style="{StaticResource ToolBarWebdings}" 			Margin="0,-10,0,0" Height="10" Content=""                            Click="Button_Undo_Click"/>                    <Button Style="{StaticResource ToolBarWebdings}" 			Margin="0,-10,0,0" Height="10" Content=""                            Click="Button_Redo_Click"/>                    <TextBlock Visibility="{Binding ElementName=Page, 			Path=PageOrientation,                             Converter={StaticResource OrientationToVisibilityConverter}, 			ConverterParameter=Landscape}"                        VerticalAlignment="Center" HorizontalAlignment="Center"                                TextAlignment="Center" Foreground="White" 				Text="Alien Sokoban"                                FontFamily="Tahoma" FontSize="36" Margin="45,0,0,0"/>                </StackPanel>                <Grid HorizontalAlignment="Right">                    <StackPanel Orientation="Horizontal">                        <StackPanel VerticalAlignment="Center">                            <StackPanel Orientation="Horizontal">                                <TextBlock Style="{StaticResource CenterLabels}" 				Text="Level "/>                                <TextBlock x:Name="label_LevelNumber"                                            Style="{StaticResource CenterLabels}"                                            Text="{Binding Path=Level.LevelNumber}"/>                                <TextBlock Style=				"{StaticResource CenterLabels}" Text="/"/>                                <TextBlock Style="{StaticResource CenterLabels}" 				Text="{Binding Path=LevelCount}"/>                            </StackPanel>                            <StackPanel Orientation="Horizontal">                                <TextBlock Style="{StaticResource CenterLabels}" 				Text="Moves "/>                                <TextBlock x:Name="label_Moves" 				Style="{StaticResource CenterLabels}"                                            Text="{Binding Path=Level.Actor.MoveCount}"/>                            </StackPanel>                        </StackPanel>                        <Button Style="{StaticResource ToolBarWebdings}" 				Margin="0,-8,0,0"                                 Height="10" x:Name="button_RestartLevel" Width="80"                                 Click="Button_RestartLevel_Click"                                 IsTabStop="False"  Content=""                                HorizontalAlignment="Right" >                            <ToolTipService.ToolTip>                                <ToolTip Content="Restart"></ToolTip>                            </ToolTipService.ToolTip>                        </Button>                    </StackPanel>                </Grid>            </Grid>        </Border>        <!-- The Game grid. -->        <Border Grid.Row="1" Padding="5" BorderBrush="#919292" CornerRadius="12"                 BorderThickness="0" Background="Transparent">            <Grid x:Name="grid_Game" />        </Border>        <Grid x:Name="textBlock_PressAnyKey"               Background="#006DCAC1"              HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.RowSpan="2">            <StackPanel VerticalAlignment="Center" HorizontalAlignment="Stretch"                         Background="#556DCAC1">                <TextBlock x:Name="feedbackControl"                            VerticalAlignment="Center"                           HorizontalAlignment="Center" Text="TextBlock" FontSize="32"/>                <Button Style="{StaticResource OrdinaryButton}" Content="Continue"                         VerticalAlignment="Center" HorizontalAlignment="Center"                        Click="Button_Continue_Click"/>                 </StackPanel>        </Grid>    </Grid>    </phoneNavigation:PhoneApplicationPage>
在MainPage的InitializeLevel方法中,每个网格用CellControl填充:
void InitialiseLevel(){	cellControls.Clear();	commandManager.Clear();	grid_Game.Children.Clear();	grid_Game.RowDefinitions.Clear();	grid_Game.ColumnDefinitions.Clear();	for (int i = 0; i < Game.Level.RowCount; i++)	{		grid_Game.RowDefinitions.Add(new RowDefinition());	}	for (int i = 0; i < Game.Level.ColumnCount; i++)	{		grid_Game.ColumnDefinitions.Add(new ColumnDefinition());	}	var cellSize = CalculateCellSize();		for (int row = 0; row < Game.Level.RowCount; row++)	{		for (int column = 0; column < Game.Level.ColumnCount; column++)		{			Cell cell = Game.Level[row, column];			cell.PropertyChanged += cell_PropertyChanged;			CellControl cellControl = new CellControl(cell);			cellControl.MaxHeight = cellControl.MaxWidth = cellSize;			cellControl.Click += Cell_Click;			Grid.SetColumn(cellControl, column);			Grid.SetRow(cellControl, row);			grid_Game.Children.Add(cellControl);			cellControls.Add(cellControl);		}	}	/* Play the intro audio clip. */	PlayAudioClip(introSoundEffect);	/* Listen for actor property changes. */	//Game.Level.Actor.PropertyChanged += Actor_PropertyChanged;	RefreshGameGrid();}
通常,我不会建议把这样的UI逻辑代码放在代码的旁边,因为我更喜欢使用MVVM方法。 然而权宜之计,我就用这个方法。
该CellControl被分配给一个游戏网格,显示效果由单元格的状态而定。 如果它被认为是一堵墙,它显示一个灰色正方形等。
Phone屏幕键盘
Windows Phone 7允许开发者在用户打开屏幕键盘时指定数据类型。这也是上下文敏感的,TextBox获得焦点时,TextBox将被放大。使用InputScope使键盘更适合于正在输入的数据。
例如,要指定一个默认的屏幕键盘,需应用InputScope到该TextBox 。
<TextBox>   <TextBox.InputScope>     <InputScope>       <InputScope.Names>         <InputScopeName NameValue="EmailNameOrAddress"/>       </InputScope.Names>     </InputScope>   </TextBox.InputScope> </TextBox>
通过使用EmailNameOrAddress NameValue,键盘包含了.com 和 @等字符。
以下是一些有效取值:
SIP 布局XAML 或枚举值SIP 描述
DefaultDefault, and other standard input scope values标准 QWERTY 键盘
TextText带特性的text,如自动更正和单词建议。
WebUrl URL
E-mail addressEmailSmtpAddress e-mail 地址
E-mail name or addressEmailNameOrAddress 电子邮件名称或地址
MapsMaps搜索在地图上的位置
Phone numberTelephoneNumber电话号码
SearchSearch搜索查询
SMS contactNameOrPhoneNumber短信
ChatChat文字输入,使用智能功能,如缩写

 

 

结论

 

在这篇文章中,我们已经看到了如何使用Silverlight 3创建一个Windows Phone益智游戏。 我们看到了PageOrientation和如何将其应用于控制布局。 我们根据上下文可以选择不同的键盘,我们还简要接触了XNA Framework的音频API,它可以用来播放声音效果。

 

这个平台的未来,我很兴奋。 花费了一个短暂的时间后,我已经有宾至如归的感觉。 我希望这个项目对你非常有用。 如果是的话,那么我会很感激,如果你能反馈一下,这会帮助我,使我的下一篇文章更好。

 

 

将真彩色图像变为256色灰度(BIG5码):-VB资料 VB利用Image控件实现图形浏览程序 利用VB捕捉并保存屏幕图象 切割一个Container中的图片 -VB资料 VB如何改变桌面的图片? VB如何实现“百叶窗”的图形特效? VB如何实现霓虹灯效果 VB如何在VB中用API获得EXE文件图标并显示在Picture控件里 VB如何在VB中直接显示无格式256灰度级图像 VB如何在窗体中平铺图片? 三维字的实现 -VB资料 闪动窗口标题 -VB资料 闪烁的标题栏 -VB资料 实现画面的各种切换方法-VB资料 实现屏幕变暗的效果 -VB资料 实现图像切换效果 -VB资料 提取Win9x拷贝的动画-VB资料 一个图像滤光处理程序-VB资料 一个用VB5.0 实现的鼠标绘图程序 用VB6.0制作画图板 用VB6设计有趣的动画场景 用VB编程绘制网格图像 用VB绘制抛物线动画曲线 用VB绘制正弦动画曲线 用VB实现“百叶窗”的图形特效 用VB实现托盘动画图标 用Visual Basic 定制BMP文件 用Visual Basic的Move方法实现动画效果 用Visual Basic与MS-Draw开发通用作图软件 在VB中获取可执行文件及Windows 95快捷方式的图标 在VB中进行各种图形切换的方法 graphicspath.transform(matrix)是怎么变换的? 请问关于列表框中的滚动条 老婆的父母太....,请大家出注意呀 tomcat问题 胃病难受,各位有什么良药??? 两个简单的问题(perl) 两个小问题。 高分求TurboPower Apro4.0 for bcb5的注册码 急件:怎样动态加载或引用DLL文件 我的SERVLET为何不能响应? 在两个表连接查询时为什么总报错:“Table is read only”? *************小问题,在线等待************** 关于更改程序名字的问题! 关于计算机远程终端控制问题 关于onload ASP的参考手册是什么? 更新数据库的日期时间问题!!! 为什么用insert 语句插入数据,数据长度只有4k左右? exchange 出现的怪问题 入门 菜问题 连接服务器的问题 我这是怎么了? 非常着急,关于bean的问题 在单元格中插入html? 关于两个大表连接和索引的问题 灌水、抢分 echo命令的具体使用方法? 在BIOS密码之后,系统引导之前加密计算机的软件有哪些?请帮忙呀 请问 如何获得mysql的原码 关于onload VB中如何使用资源文件?急!急!急! 关于思路,高分求教!分数不够在添 不得不提问了: 怎样防止用户重复登陆!???? **请问Kylix3在红帽7上如何安装? TEST 求php的win98下开发环境,大家帮帮忙。 我想做一个类似于邮件系统中附件功能的程序,请问用的是什么协议,那里有源码? 为什么输出结果不正确呢??? 急救!用ADO在98下与2K下不能同时运行! 主板的认识! 如何删除相同的两条记录 有关Blob造型成oracle.sql.BLOB的问题。 急死我了!!!RS485通讯的奇怪问题,请高手帮忙! 怎样在delete记录时不往log文件中写东西? 签名支持JK10000行动,同意签名者,进来跟贴!到时候咱们的真名或ID会被复印在传单背面,抵制日货,保卫钓鱼岛!!!!!!!!!!!! 迷惑!!!!!高手指点,值得讨论,谢谢! char型怎么转换成String型?(答对结帖) 请问 哪位大侠有loadrunner的中文测试资料提供一下,非常感谢! JS和ASP的问题????? 高手指点 这样划分vlan可不可以???? 数据库超时 宁波赴台个人游15个窗口可就近申请宁波8名快递哥同伸援手接住两岁坠楼女李华任衢州市委常委 不再任常山县委书李锋任衢州市委常委(图)杭甬高铁开通在即 记者实地探访绍兴北李锋简历(图)宁杭甬高铁运行图出炉 4小时以内车程32家农贸市场拿到活禽交易通行证宁杭甬高铁精确运行时刻表公布浙江财经大学在浙新增5个一本招生专业杭城首批11家农贸市场昨起重启活禽交宁杭甬高铁运行时刻表全部出炉 高铁出浙江省11市4套班子一览表(附名单)这三个女生都是高考顶尖高手文科第一名施丹旖从小到大没参加过培训理科第一名周晨又在镇海中学富阳女生喻鹏阳文科725分 每天睡足杭州各界人士畅谈最美现象杭州市区公办小学昨天报名 没有出现排杭帮菜中小贝最爱叫化鸡 吃完一份再来宁海市民看望英雄快递哥 顺丰速运奖励阿里巴巴敲响开市钟求军援落空股指缩量反弹泰格·伍兹不打算聘请挥杆教练了浙江发布“新高考方案”凯里评选“十佳最美小区”置业海南 无需过多担心台风马铃薯淀粉、马铃薯胶……建筑公司被列入“不良记录”定安“实”字当头转作风金阳医院开设“记忆门诊”美军官员:六架俄罗斯战机闯入美防空识吴楠时隔两年获自由身加盟四川 体育局当阿里巴巴遭遇法式“神回复”:只知“阿里巴巴上市 外国人问:“淘宝上能买前奥运冠军见证阿里巴巴上市 劳丽诗纽日选手送韩球迷旭日旗礼物引争议 日网西安警察扮嫖客抓获4名“站街女” 口“铁老大”争当“快递哥”葛兰素史克中国公司被罚30亿元关怀更在细节中
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘