WEB开发网
开发学院软件开发C语言 C#开发WPF/Silverlight动画及游戏系列教程(Game C... 阅读

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十三)自适应性窗口化与全屏化(WPF Only)

 2010-09-30 20:48:58 来源:WEB开发网   
核心提示: 第二种方式我称之为按比例缩放模式,顾名思义,C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十三)自适应性窗口化与全屏化(WPF Only)(3),使用此模式进行切换时,所有的对象包括人物,这才是价值两个字的深层体现,本节没有诗情画意的知识描述,地图,障碍

第二种方式我称之为按比例缩放模式,顾名思义,使用此模式进行切换时,所有的对象包括人物,地图,障碍物等东西均进行等比例的放大/缩小。实现此方法,首要任务是进行需求分析:在切换时,什么属性在发生变化了?当然是游戏中的一切内容它们自身及子内容的尺寸在改变。这里要特别说明的是,在前面的章节中,障碍物均为正方形,只用一个GridSize来定义它的边长;但是要是用户电脑是宽屏的,那么缩放时必须以使用矩形作为基础单元格,因此将GridSize拆分成GridSizeX与GridSizeY两个变量分别代表单元格的宽与高,惟有这样才能胜任按比例缩放窗口的工作。那么根据此原理,我进行如下编写实现该模式下的窗口模式切换方法:

        double ratioX, ratioY; //定义X,Y方向上的缩放比例

        /// <summary>

        /// 改变游戏窗口尺寸(缩放窗口)

        /// </summary>

        /// <param name="currentWidth">当前窗口宽</param>

        /// <param name="currentHeight">当前窗口高</param>

        /// <param name="newWidth">新窗口宽</param>

        /// <param name="newHeight">新窗口高</param>

        private void ChangeWindowSize(double currentWidth, double currentHeight, double newWidth, double newHeight) {

            //主角的Storyboard停止(这很重要)

            Leader.Action = Actions.Stop;

            Leader.Direction = 4;

            if (storyboard != null) { storyboard.Stop(); }

            //计算缩放比例

            ratioX = newWidth / currentWidth;

            ratioY = newHeight / currentHeight;

            //缩放障碍物

            GridSizeX *= ratioX;

            GridSizeY *= ratioY;

            Carrier.Width = ActualWidth * ratioX;

            Carrier.Height = ActualHeight * ratioY;

            //所有精灵、地图等对象进行象素缩放

            for (int i = 0; i < Carrier.Children.Count; i++) {

                if (Carrier.Children[i] is QXObject) {

                    QXObject Obj = Carrier.Children[i] as QXObject;

                    Obj.X *= ratioX;

                    Obj.Y *= ratioY;

                    Obj.Width_ *= ratioX;

                    Obj.Height_ *= ratioY;

                    Obj.CenterX *= ratioX;

                    Obj.CenterY *= ratioY;

                    if (Obj is QXSpirit) {

                        QXSpirit Spirit = Obj as QXSpirit;

                        //缩放文字

                        Spirit.Describtion.Height *= ratioY;

                        Spirit.Describtion.SetValue(Canvas.TopProperty, (double)Spirit.Describtion.GetValue(Canvas.TopProperty) * ratioY);

                        Spirit.Faction.FontSize *= ratioX;

                        Spirit.Clan.FontSize *= ratioX;

                        Spirit.SName.FontSize *= ratioX;

                    }

                }

            }

        }

首先计算出X、Y方向的缩放比例ratioX与ratioY,然后遍历所有对象物体与尺寸有关的属性进行“乘以”缩放比例操作。这样仅仅二十来行代码,即实现了对窗口中的所有对象物体的按比例缩放。大家不妨在不同的分辨率下或不同尺寸的显示器上进行此缩放操作测试,结果都是很完美的:

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十三)自适应性窗口化与全屏化(WPF Only)

这里需要特别说明的是,WPF是基于矢量的图形引擎,但是如果您使用的是像素图片,例如本例中的角色与地图,那么它同样会被基于像素进行拉伸,因为它并未被转换成矢量图。

本节内容很简单,但是简单的背后是不为人知的烦琐与枯燥的调试。大家或许会因自觉本节内容毫无价值而十分恼火,但是我想告诉大家的是,不要小看了这不起眼的功能与调试,它不仅仅是对系统架构的一次有力考验(如果架构存在缺陷,就算勉强实现了表面上的窗口切换,角色一旦移动起来将会导致系统及画面漏洞百出);同时,就好比现在的网站需要符合W3C标准,需要同时兼容IE与FIREFOX一样,软件是做给客户用的,一款软件能够满足各种各样不同客户的使用需求,这才是价值两个字的深层体现。本节没有诗情画意的知识描述,只为一下节的华丽登场做好铺垫:帅气的主角将不再孤单:怪物们都出来吧!敬请关注。

出处:http://alamiye010.cnblogs.com/

上一页  1 2 3 

Tags:开发 WPF Silverlight

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接