一直到现在,咱们做的都是一个没有开始的游戏,全部都是直接进入到游戏循环当中,那么今天,我们一起搞一个界面实现一个有开始过程的游戏,在后面的附件中提供了源代码,以及图片资源,先看看最终的实现效果:
点击【开始游戏】按钮以后,才进入到游戏,我们首先要实现这个界面,创建一个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#直接用代码开发出一个简单的游戏,在实际开发过程中,使用其他的辅助功能可能会使得开发更加容易、快捷,但是如果学好代码的话,那不是能够很好的控制游戏了吗?期望大家共同进步:)