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

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(九) 2D游戏角色在地图上的移动

 2009-06-22 08:32:43 来源:WEB开发网   
核心提示: 上一节有说到关于两个不同坐标系同时存在的问题,上面的代码就是对它们的定义并且实现它们之间相互转换,C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(九) 2D游戏角色在地图上的移动(4),设置好以后,就可以根据情况的需要来分别调用不同坐标系下主角的X,

 上一节有说到关于两个不同坐标系同时存在的问题,上面的代码就是对它们的定义并且实现它们之间相互转换,设置好以后,就可以根据情况的需要来分别调用不同坐标系下主角的X,Y坐标了。

定义好地图、障碍物和主角的坐标系以后,接着需要对主角和地图初始化:

        public Window9() {
            InitializeComponent();
            ResetMatrix(); //初始化二维矩阵
            InitPlayer(); //初始化目标对象
            InitMap(); //初始化地图

            DispatcherTimer dispatcherTimer = new DispatcherTimer();
            dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
            dispatcherTimer.Interval = TimeSpan.FromMilliseconds(150);
            dispatcherTimer.Start();
        }

可以看到后面4行代码那么的眼熟?其实就是第三节所讲到的知识。最后就是本节的重头戏,实现鼠标点击事件:

        private void Carrier_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
            Point p = e.GetPosition(Carrier);
            //进行坐标系缩小
            int start_x = SpiritGameX;
            int start_y = SpiritGameY;
            Start = new System.Drawing.Point(start_x, start_y); //设置起点坐标
            int end_x = (int)p.X / GridSize;
            int end_y = (int)p.Y / GridSize;
            End = new System.Drawing.Point(end_x, end_y); //设置终点坐标
……
            if (path == null) {
                MessageBox.Show("路径不存在!");
            } else {
……
                for (int i = 0; i < framePosition.Count(); i++) {
                    //加入X轴方向的匀速关键帧
                    LinearDoubleKeyFrame keyFrame = new LinearDoubleKeyFrame();
                    //平滑衔接动画
                    keyFrame.Value = i == 0 ? Canvas.GetLeft(Spirit) : (framePosition[i].X - SpiritCenterX * GridSize);
                    keyFrame.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(cost * i));
                    keyFramesAnimationX.KeyFrames.Add(keyFrame);
                    //加入X轴方向的匀速关键帧
                    keyFrame = new LinearDoubleKeyFrame();
                    keyFrame.Value = i == 0 ? Canvas.GetTop(Spirit): (framePosition[i].Y - SpiritCenterY * GridSize);
                    keyFrame.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(cost * i));
                    keyFramesAnimationY.KeyFrames.Add(keyFrame);
                }
                ……
            }
        }

代码和上一节里的没有多大的区别,改动为我用黄色背景色描绘的区域(…….号表示该段代码与上一节不变)。主要就是针对如何进行主角真实脚底坐标在两个坐标系中的换算问题进行了布局修改,大家可以与上一节里的示例代码进行比较,非常容易就可以进行分析理解,这里我就不再累述了。大功告成啦,我将障碍物的表现去掉,然后国际惯例Ctrl+F5测试一下我们的成果吧:

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(九) 2D游戏角色在地图上的移动

图片看不清楚?请点击这里查看原图(大图)。

至此,我们就实现了2D游戏人物在地图中的移动。大家再回头看看或许会发现:本节地图中的障碍物均是由正方形块组成,也就是说地图是基于直角坐标系的。但是在实际的游戏制作中,特别是SLG走格子回合制等类型的游戏中,基本都采用斜度的地图构造。那么下一节我将就如何构造斜度坐标系地图进行讲解,敬请关注。

上一页  1 2 3 4 

Tags:开发 WPF Silverlight

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