WPF游戏开发——小鸡快跑

简介: 鉴于上一篇文章代码过多,被版主从首页删除了,本文只提取部分代码展示。 同上一篇文章一样,游戏还是小鸡快跑,不同的是,这次的小鸡不在是跳大坑,而是躲子弹了。 关于做游戏,还是那两样要点,对象和屏幕。不过,由于WPF不同Winform,它没有paint方法,所以使用WPF做游戏,只能考虑用别的方法来进行移动小鸡。

鉴于上一篇文章代码过多,被版主从首页删除了,本文只提取部分代码展示。

同上一篇文章一样,游戏还是小鸡快跑,不同的是,这次的小鸡不在是跳大坑,而是躲子弹了。

关于做游戏,还是那两样要点,对象和屏幕。不过,由于WPF不同Winform,它没有paint方法,所以使用WPF做游戏,只能考虑用别的方法来进行移动小鸡。本文中使用INotifyPropertyChanged来实现。闲话少说进入正题。

首先定义一个元素类Element,这里包含X坐标,Y坐标,小鸡显示图像,是否移动,是否加速,是否跳跃等等属性。如下为部分代码:

View Code
class Element : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        //public EventHandler PropertyChangedX;//移动X坐标改变触发事件
        //public EventHandler PropertyChangedY;
        private Double _x;

        public Double X
        {
            get { return _x; }
            set 
            { 
                _x = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("X"));
                   
                }
            }
        }

看了代码大家应该理解了,当修改小鸡的X坐标时,对象的属性也一起变更。

有了小鸡类后,就可以定义对象了,然后将小鸡添加进屏幕。同WINFORM一样,进行按键事件编写,上为跳跃,左右移动,空格加速。

在WINFORM里,有TIMER可以进行模拟帧,可是在wpf里没有timer这个类,于是我们使用System.Windows.Threading.DispatcherTimer。如下:

View Code
 dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
            dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
            dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 30);
            dispatcherTimer.Start();

在DispatcherTimer的事件里进行判断和移动操作。

关于移动,由于WPF 每个可以显示的控件,可以对其进行动画操作,因此,本文采用TranslateTransform。如下:

View Code
    <Rectangle Height="26" Name="Road" Stroke="White" Width="1200" VerticalAlignment="Bottom" Margin="0,0,0,0">
                <Rectangle.RenderTransform>
                    <TranslateTransform x:Name="TranslateTransformRoad" X="0" Y="0"></TranslateTransform>
                </Rectangle.RenderTransform>
                <Rectangle.Fill>
                    <ImageBrush ImageSource="D:\TestMyProduct\WPF_Chicken\WPF_Chicken\Resources\Road.jpg" Stretch="Fill"></ImageBrush>
                </Rectangle.Fill>
            </Rectangle>

看了上面的代码,可以理解,我先定义了一个矩形,然后对矩形给予变换,(我习惯把render翻译成给予~~)初始值,都是X=0,Y=0,当我想移动他时,就改变他的X的值,加1,或加2就可以了。

在然后就是定义子弹,子弹有四个属性,X,Y,LIFE,BulletImg,定义好子弹类后,将子弹添加进屏幕。文中使用Image来添加子弹。如下:

 

View Code
  Bullet Bullet = new Bullet();
                Bullet.BulletImg = new BitmapImage(new Uri(@"D:\TestMyProduct\WPF_Chicken\WPF_Chicken\Resources\BirdBack.GIF"));
                System.Windows.Controls.Image Img = new System.Windows.Controls.Image();
                Img.Source = Bullet.BulletImg;
                Img.Width = 10;
                Img.Height = 10;
                Img.Stretch = Stretch.Fill;
                Img.Margin = new Thickness(0, 0, 0 , 0);
                 
                Img.VerticalAlignment = VerticalAlignment.Bottom;
                Img.HorizontalAlignment = HorizontalAlignment.Right;
                Img.RenderTransform = new TranslateTransform(0, -30);
               //添加进集合
                ImgList.Add(Img);
                BulletList.Add(Bullet);
                //添加进屏幕
                Root.Children.Add(Img);

子弹添加进去后,就是让他自己移动,这里采用改变子弹的MARGIN属性来控制。上面的代码有个小问题,我也没解决,就是图片添加进去后的位置我固定不了,所以我就对子弹进给予了变换 Img.RenderTransform = new TranslateTransform(0, -30)

最后就是死亡定义了,这个死亡定义还是比较讨厌的, 可能是我的基础不太好,没有找到更好的办法,于是我采用了本方法,即如果子弹的X 在小鸡的图片之间 并且 小鸡跳起的高度 小于10,那就死亡了。

 

由于写的比较匆忙,有一些没用到的对象忘记删除了就上传了,还有就是图片全部使用的是绝对路径,由于实在是WPF还不熟。。所以。。还请见谅。

开发环境:vs2008

源码下载地址:http://download.csdn.net/detail/kiba518/4372786

补充:我没有对子弹进行释放,想扩展的朋友在扩展时需要在子弹打到屏幕外时,将子弹移除。

另外,程序似乎有个BUG,但我不太确定,就是是否移动到快到终点的时候,就不在出现子弹了?有解决的一定告诉我方法啊~

 

目录
相关文章
|
7月前
|
C# C++ Windows
2000条你应知的WPF小姿势 基础篇<28-33 WPF启动故事>
2000条你应知的WPF小姿势 基础篇<28-33 WPF启动故事>
34 0
|
C# 开发者 Windows
Silverlight与WPF开发人员入门应该知道的十件事
【CSDN 陈秋歌编译】微软开发者社区部门项目经理Pete Brown在纳什维尔DevLink 2010会议上做了一个名为“10件事”的演讲。这个演讲包含了Silverlight与WPF开发人员入门时应该了解的十件事。
1068 0
|
C# 前端开发
silverlight,WPF动画终极攻略之阳光灿烂篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之阳光灿烂篇(Blend 4开发) 前面我们画了一只会飞动的小鸟,今天我们在目标是一个会发光的太阳。本章节的动画虽然简单,但是实现的效果可是一点也不打折。
1151 0
|
C#
silverlight,WPF动画终极攻略之迟来的第三章 动画整合篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之迟来的第三章 动画整合篇(Blend 4开发) 有个问题想请教下大家,我仿了腾讯的SL版QQ,相似度95%以上。我想写成教程教大家怎么开发出来,会不会有版权什么问题的。
1067 0
|
前端开发 C# iOS开发
WPF触控程序开发(二)——整理的一些问题
原文:WPF触控程序开发(二)——整理的一些问题   上一篇(WPF触控程序开发)介绍了几个比较不错的资源,比较基础。等到自己真正使用它们时,问题就来了,现把我遇到的几个问题罗列下,大家如有遇到其他问题或者有什么好的方法还望赐教。
1023 0
|
算法 C# 容器
WPF实战俄罗斯方块
原文:WPF实战俄罗斯方块 概述 本文试图通过经典的游戏-俄罗斯方块,来演示WPF强大的图形界面编程功能。 涉及的图形方面有这几个方面: 1、不规则界面的设置 2、布局系统的使用 3、2D图形的应用 4、输入事件的响应 5、风格样式的使用 6、跨线程的调用 7、自定义控件 我们先截两张成品的图片,获取一点感性的认识。
1409 0
|
C#
WPF编游戏系列 之六 动画效果(1)
原文:WPF编游戏系列 之六 动画效果(1)        本篇主要针对界面进行动画效果处理。首先在打开或关闭界面时,使其产生动态效果而不是生硬的显示或消失(如下图)。其次在鼠标放到关闭窗口图标上时,使其出现闪动效果。
667 0
|
C# 前端开发
WPF编游戏系列 之七 动画效果(2)
原文:WPF编游戏系列 之七 动画效果(2)        上一篇已经对关闭窗口图标进行了动画效果处理,本篇将对窗口界面的显示和关闭效果进行处理。由于所有的动画效果都是针对窗口界面的Canvas,所以先要为它添加一些RenderTranform属性,这些属性不要填写任何效果,后面会由Storyboard和EventTrigger为其提供。
635 0