zoukankan      html  css  js  c++  java
  • XNA基础(01) —— 游戏循环

         当安装好了VS 2008和XNA GameStudio 3.0后,我们就可以开始学习XNA了。

         首先,在VS 2008中新建一个XNA GameStudio 3.0项目(选择Windows Game类型),会生成一个最简单的、可运行的游戏模板。

         接下来我们将注意力转移到我们要剖析的重点 —— 从Microsoft.Xna.Framework.Game继承的Game1类,其代码如下:          

     public class Game1 : Microsoft.Xna.Framework.Game
        {
            GraphicsDeviceManager graphics;
            SpriteBatch spriteBatch;

            
    public Game1()
            {
                graphics 
    = new GraphicsDeviceManager(this);
                Content.RootDirectory 
    = "Content";
            }
           
            
    protected override void Initialize()
            {            
                
    base.Initialize();
            }
           
            
    protected override void LoadContent()
            {            
                spriteBatch 
    = new SpriteBatch(GraphicsDevice);           
            }
            
            
    protected override void UnloadContent()
            {           
            }
          
            
    protected override void Update(GameTime gameTime)
            {           
                
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                    
    this.Exit();

                
    base.Update(gameTime);
            }
          
            
    protected override void Draw(GameTime gameTime)
            {
                GraphicsDevice.Clear(Color.CornflowerBlue);

                
    base.Draw(gameTime);
            }
        }

            我们简单解释一下该类中所用到的重要类型。

    GraphicsDeviceManager 图形设备管理器,用于访问图形设备的通道。

    GraphicsDevice 图形设备。

    Sprite 精灵,绘制在屏幕上的的2D3D图像,比如游戏场景中的一个怪兽就是一个Sprite

    SpriteBatch 它使用同样的方法来渲染一组Sprite对象。

            而Microsoft.Xna.Framework.Game 这个基类就像是一个基础框架,它把整个游戏流程串联了起来,即,整个游戏会按如下流程运转。

                 

            该图中的五个方法正好对应着Game1类中的五个方法,它们的作用解释如下。

         Initialize方法用于初始化与游戏相关的对象,比如初始化图形设备、游戏环境设置等。

         LoadContent方法在Initialize方法之后调用,它用于加载游戏所需要的图形或其它素材,比如模型、图片、声音等。

         UpdateDraw方法构成了游戏循环

         Update方法用于改变和控制游戏的状态,主导着游戏逻辑的进行。

         Draw方法用于在屏幕上绘制我们的场景、Sprite。要注意的是,我们应该尽可能少的在Draw方法中处理游戏逻辑——它们应该在Update方法中被处理。Draw方法仅仅负责绘制。

         UpdateDraw方法都接受一个GameTime类型的参数,GameTime有什么作用了?这个参数可以帮助我们依据实际的游戏时间而不是处理器的速度来决定动画或其它事件的发生时刻。

          在这个最简单的例子中,游戏将以默认的60fpsFrame/Second)运行。

         UnloadContent方法在游戏结束时被调用,该方法用于卸载在LoadContent方法中所加载的素材和那些需你要进行特别处理的善后事宜。

         状态轮询与事件监听

         写过Windows应用程序的朋友都知道,当用鼠标点击Form上的一个Button时,会触发一个Click事件,而我们的应用程序通过监听到事件的发生进而来处理事件。

         而在游戏开发中,我们需要将我们的这种“事件”思维切换到“轮询”思维。也就是说,游戏中,用户的鼠标、键盘操作并不会触发相关的事件。如果是这样的话,那我们该如何知道用户是否按下了鼠标了?答案是我们需要在游戏循环中(确切的说是在Update方法中)不断地检测输入设备(比如鼠标)的状态来进行判断。

           这就是轮询机制与事件机制的区别,也是游戏开发和普通windows应用开发需要转换思路的地方。

           归根到底,windows事件机制也是对轮询机制(即Windows消息循环)的一个封装

           

           今天的介绍就到这里,下一节我们将介绍与渲染相关的基础知识。   

           最后,附上XNA GameStudio 3.0的下载地址:http://creators.xna.com/en-us/xnags_islive

  • 相关阅读:
    Dev C++ 工程没有调试信息 解决办法
    写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。
    oracle10g登录em后,提示“java.lang.Exception: Exception in sending Request :: null”
    网站登录的破解
    sql 日志恢复
    Oracle expdp/impdp 使用示例
    Oracle数据库备份和恢复的基本命令
    检索 COM 类工厂中 CLSID 为 {{10020200-E260-11CF-AE68-00AA004A34D5}} 的组件时失败解决办法
    win7访问部分win2003速度慢
    公交车路线查询系统后台数据库设计--换乘算法改进与优化
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/1403298.html
Copyright © 2011-2022 走看看