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

    ----------------------------------------------------------------------------------------------------

    注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!
    若您觉得这篇文章还不错,请点击下方的推荐】,非常感谢!

     

  • 相关阅读:
    JQuery实现Ajax应用
    访问本地json文件因跨域导致的问题
    python_控制台输出带颜色的文字方法
    查询数据量大时,你会选择关联表查询还是循环中依个查询? up
    自己动手写SQL字符串分解函数Split up
    关于Access数据库执行Update语句后,不报错,但影响行数总是返回0的问题...... up
    TCP和UDP的区别
    Linxu系统下怎么安装vim编辑器
    网络编程 委托
    学习POS的数据包分析
  • 原文地址:https://www.cnblogs.com/kiba/p/2549396.html
Copyright © 2011-2022 走看看