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,但我不太確定,就是是否移動到快到終點的時候,就不在出現子彈了?有解決的一定告訴我方法啊~

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

注:此文章為原創,任何形式的轉載都請聯系作者獲得授權並注明出處!
若您覺得這篇文章還不錯,請點擊下方的推薦】,非常感謝!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM