Silverlight C# 遊戲開發:Flyer07做一個有開始的遊戲

來源:互聯網
上載者:User

一直到現在,咱們做的都是一個沒有開始的遊戲,全部都是直接進入到遊戲迴圈當中,那麼今天,我們一起搞一個介面實現一個有開始過程的遊戲,在後面的附件中提供了原始碼,以及圖片資源,先看看最終的實現效果:

點擊【開始遊戲】按鈕以後,才進入到遊戲,我們首先要實現這個介面,建立一個ClassStartInterface類,用來處理開始介面,並且了方便控制,在MainPage中加入一個MainPage類的靜態變數,方便全域訪問,比如這樣寫public static MainPage stMainPage,這樣我們就能很方便在MainPage中進行GameStart操作,為了達到這個目的,需要做一些重構修改,比如將遊戲初始化的工作放在GameStart()方法中,將初始介面放入一個專門GameInitial()方法,內部將事件處理。

細心的人會發現開始介面擁有獨立的邏輯,如果將其和MainPage結合,將產生複雜的判斷操作,所以我們在這裡用上一個經典的設計模式--單例,所以,類應寫成這樣:

 

public class ClassStartInterface : Canvas
{
private ClassStartInterface()
{

}
private static ClassStartInterface _StartInterface = null;
/// <summary>
/// 獲得單例
/// </summary>
/// <returns></returns>
public static ClassStartInterface GetStartInterface()
{
if (_StartInterface == null)
{
_StartInterface = new ClassStartInterface();

}
return _StartInterface;
}
}

請注意,建構函式是私人的,所以只能通過GetStartInterface方法獲得,這樣的設計將使開始介面永遠保持只有一個(除了特意銷毀),而且直接可以通過ClassStartInterface類的靜態方法直接獲得,不用刻意的去建立它,由於我們前面為MainPage提供了靜態存取方法,也可以通過MainPage.stMainPage直接調用MainPage類中的方法,所以我們可以直接在內部實現顯示和隱形操作。比如這樣:

        /// <summary>
/// 顯示這個介面
/// </summary>
public void Show()
{
if(MainPage.stMainPage.GameMainWindow.Children.Contains(_StartInterface) == false)
MainPage.stMainPage.GameMainWindow.Children.Add(_StartInterface);
}
/// <summary>
/// 隱蔽這個介面
/// </summary>
public void Hide()
{
if (MainPage.stMainPage.GameMainWindow.Children.Contains(_StartInterface) == true)
MainPage.stMainPage.GameMainWindow.Children.Remove(_StartInterface);
}

建構函式中將背景圖以及按鈕實現,節選代碼如下:

 

        private Image _Image = null;
//建立一個按鈕
private Button _btStartGame = new Button() { Content = "開始遊戲",Width = 80,Height=32 };
private ClassStartInterface()
{
_Image = new Image();
_Image.Source = new BitmapImage(new Uri(@"Src/StartBack.jpg", UriKind.Relative));
this.Children.Add(_Image);
Children.Add(_btStartGame);
Canvas.SetLeft(_btStartGame, 160);
Canvas.SetTop(_btStartGame, 300);
_btStartGame.Click += new RoutedEventHandler(_btStartGame_Click);
}

void _btStartGame_Click(object sender, RoutedEventArgs e)
{
MainPage.stMainPage.GameStart();
}

為此,我們需要為MainPage實現兩個重要的函數:

 

        public void GameInitial()
{
ClassStartInterface.GetStartInterface().Show();
}
public void GameStart()
{
ClassStartInterface.GetStartInterface().Hide(); ;
backgroup = new ClassBackGroup();
GameMainWindow.Children.Add(backgroup);
cloudgroup = new ClassCloudGroup(20);
GameMainWindow.Children.Add(cloudgroup);
solidgroup = new ClassSolidGroup(20);
GameMainWindow.Children.Add(solidgroup);
foodgroup = new ClassFoodGroup(10);
GameMainWindow.Children.Add(foodgroup);
flyerlife = new ClassFlyerLife();
GameMainWindow.Children.Add(flyerlife);
GameMainWindow.Children.Add(Hero);
this.KeyDown += new KeyEventHandler(MainPage_KeyDown);
this.KeyUp += new KeyEventHandler(MainPage_KeyUp);

//一個時間迴圈,用來控制迴圈動畫
if (dispatcherTimer == null)
{
dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += new EventHandler(TickGameFrameLoop);
dispatcherTimer.Interval = TimeSpan.FromMilliseconds(40); //重複間隔
dispatcherTimer.Start();
}
}

最終,達到我們需要遊戲,本篇基本算是結束了,詳細代碼在這裡下載

本文的目的主要在拋磚引玉,和大家共同分享,使用c#直接用代碼開發出一個簡單的遊戲,在實際開發過程中,使用其他的協助工具功能可能會使得開發更加容易、快捷,但是如果學好代碼的話,那不是能夠很好的控制遊戲了嗎?期望大家共同進步:)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.