日期:2014-05-18  浏览次数:21336 次

C#入门学习-----推箱子游戏(WPF技术实现)

欢迎大家提出意见,一起讨论!

转载请标明是引用于 http://blog.csdn.net/chenyujing1234

需要源码请与我联系。

 

 编译平台:VS2008 + .Net Framework 3.5

        语言: C#

使用工具:Expression Design 4

                    Expression Blend  (它们的获得请参考我的另一文章 http://write.blog.csdn.net/postedit/7659256)

 

3、实现游戏用户界面

尽管程序员可以使用VS编写XAML代码的方式来构造用户界面,但是对于有设计爱好的用户来说,使用类似Photoshop一样的Expression套件能将

软件美工最大化。对于怪物与目标块的图形显示,示例使用了Expression Design来设计图形,然后将其导入到Expression Blend中进行布局处理。

 

3、1 使用Expression Design设计图案

Expression Design 是一个专业的图表和图形设计工具。该工具提供了矢量图形的绘制能力,强大之处可以像PhotoShop一样设计好用户界面或是所需要量的图形,

使用其导出功能导出为XAML资源或代码。Expression Design主界面如下:

Design 通常是与Blend紧密相关的。美工人员使用Design强大的设计功能来设计界面元素,导出给Blend进行编辑。最后通过VS设计程序代码。

在示例中,使用Design设计了一个Cell图案,在其中添加了多个图层,每一层放置各自不同的图案,比如箱子、怪物、墙体。

然后使用Design的导出功能将这些图案导出为资源字典,以便于程序引用这些图形。导出窗口如下:

然后在App.xaml中的资源字典的定义中使用<ResourceDictionary.MergedDictionaries>指定Cell.xaml作为整个应用程序级别的资源。

3、2 实现用户主界面

在开始布局游戏区域前,主界面上需要一个Banner来显示游戏名称,为游戏主界面添加背景图片以增加界面的效果。

游戏创建了两个用户控件来实现这样的特效,位于游戏项目的Controls文件夹下。

BackgroundControl.xaml用户控件实现非常简单,通过使用Expression Design来设计背景图片,然后导出为独立的Xaml文件 

导出设置如下:

 

 

图形将被置于一个Canvas画布中,在MainWindow.xaml中通过引用这个控件来设置背景色。

Banner.xmal的实现与BackgroundControl.xaml的实现类似。

主界面的布局非常简单,主要分为四行:

(1) 第一行

主要放了一个Border、一个Rectangle、一个Viewbox(里面放Banner)

 

(2) 第二行

在一个Grid中加入一个Rectangle、显示关卡代码、关数、按钮

(3) 第三行

           只是一个间隔,没放东西

(4)  第四行

 

如上,位于Viewbox的Grid, x:Name为grid_Game在游戏启动时动态创建行和列定义,并在行列中放置多个Button按钮来实现游戏的方块

在MainWindow.xaml的声明中,为窗口关联了Loaded事件,当该事件触发时,将执行Window_Load代码。这段代码在游戏窗口打开时,开始游戏第一关。

Window_Loaded将调用在资源中实例化的Game类,在Window.Resource资源区,首先定义了Game类,代码如下:

   <!-- 用于整个游戏的Game实例. -->
		<Sokoban:Game x:Key="sokobanGame"/>

在MainWindow.xaml.cs中相应地定义了一个Game属性,该属性使用在资源中指定的x:Key键值查找Game对象实例。Game属性的声明如下:

/// <summary>
        /// 获取定义在Window资源中的Game对象的实例
		/// </summary>
		/// <value>游戏实例.</value>
		Game Game
		{
			get
			{
				return (Game)TryFindResource("sokobanGame");
			}
		}

Game属性的get获取器使用TryFindResource() 方法,传入指定的查找对象实例,并转换为Game对象。因为TryFindResource()方法返回object类型的实例。

 //
        // 摘要:
        //     搜索具有指定键的资源,如果找到,则返回该资源。
        //
        // 参数:
        //   resourceKey:
        //     要查找的资源的键标识符。
        //
        // 返回结果:
        //     找到的资源;如果未找