Nowpaper 十五英寸的世界

Rich Games Developer

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一直到现在,咱们做的都是一个没有开始的游戏,全部都是直接进入到游戏循环当中,那么今天,我们一起搞一个界面实现一个有开始过程的游戏,在后面的附件中提供了源代码,以及图片资源,先看看最终的实现效果:

点击【开始游戏】按钮以后,才进入到游戏,我们首先要实现这个界面,创建一个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#直接用代码开发出一个简单的游戏,在实际开发过程中,使用其他的辅助功能可能会使得开发更加容易、快捷,但是如果学好代码的话,那不是能够很好的控制游戏了吗?期望大家共同进步:)

posted on 2010-03-04 17:01  nowpaper  阅读(2101)  评论(2编辑  收藏  举报