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,但我不太确定,就是是否移动到快到终点的时候,就不在出现子弹了?有解决的一定告诉我方法啊~

 

目录
相关文章
|
开发者 C# Windows
WPF与游戏开发:当桌面应用遇见游戏梦想——利用Windows Presentation Foundation打造属于你的2D游戏世界,从环境搭建到代码实践全面解析新兴开发路径
【8月更文挑战第31天】随着游戏开发技术的进步,WPF作为.NET Framework的一部分,凭借其图形渲染能力和灵活的UI设计,成为桌面游戏开发的新选择。本文通过技术综述和示例代码,介绍如何利用WPF进行游戏开发。首先确保安装最新版Visual Studio并创建WPF项目。接着,通过XAML设计游戏界面,并在C#中实现游戏逻辑,如玩家控制和障碍物碰撞检测。示例展示了创建基本2D游戏的过程,包括角色移动和碰撞处理。通过本文,WPF开发者可更好地理解并应用游戏开发技术,创造吸引人的桌面游戏。
1112 0
浅谈WPF之装饰器实现控件锚点
使用过visio的都知道,在绘制流程图时,当选择或鼠标移动到控件时,都会在控件的四周出现锚点,以便于修改大小,移动位置,或连接线等,那此功能是如何实现的呢?在WPF开发中,想要在控件四周实现锚点,可以通过装饰器来实现,今天通过一个简单的小例子,简述如何在WPF开发中,应用装饰器,仅供学习分享使用,如有不足之处,还请指正。
500 1
|
C# 开发者 Windows
基于Material Design风格开源、易用、强大的WPF UI控件库
基于Material Design风格开源、易用、强大的WPF UI控件库
1434 0
|
C# Windows
WPF技术之RichTextBox控件
WPF RichTextBox是Windows Presentation Foundation (WPF)中提供的一个强大的文本编辑控件,它可以显示富文本格式的文本,支持多种文本处理操作。
1118 0
|
前端开发 C# 容器
浅谈WPF之控件拖拽与拖动
使用过office的visio软件画图的小伙伴都知道,画图软件分为两部分,左侧图形库,存放各种图标,右侧是一个画布,将左侧图形库的图标控件拖拽到右侧画布,就会生成一个新的控件,并且可以自由拖动。那如何在WPF程序中,实现类似的功能呢?今天就以一个简单的小例子,简述如何在WPF中实现控件的拖拽和拖动,仅供学习分享使用,如有不足之处,还请指正。
650 2
|
开发框架 缓存 前端开发
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件
|
C# 开发者 Windows
一款基于Fluent设计风格、现代化的WPF UI控件库
一款基于Fluent设计风格、现代化的WPF UI控件库
811 1
|
C# Windows
WPF中如何使用HandyCotrol控件库
WPF中如何使用HandyCotrol控件库
2270 1
|
开发框架 前端开发 JavaScript
WPF应用开发之控件动态内容展示
WPF应用开发之控件动态内容展示
|
开发框架 前端开发 JavaScript
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(3)--自定义用户控件
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(3)--自定义用户控件