• Silverlight C# 游戏开发:Flyer07做一个有开始的游戏


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

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

  • 相关阅读:
    浏览网页的过程
    端口转发和端口映射
    代码审计入门之BlueCMS v1.6 sp1
    php伪协议总结
    phar反序列化
    iOS开发之GCD使用总结
    深入理解Android NDK日志符号化
    Android 开源项目源码解析之DynamicLoadApk 源码解析
    Gilt如何将微服务部署到AWS环境,介绍ION-Roller
    100分程序员的8个习惯
  • 原文地址:https://www.cnblogs.com/nowpaper/p/1678463.html
Copyright © 2020-2023  润新知