time 
设为首页】【收藏本站
当前位置: 主页 > 程序设计 > .net > WinForm > Winform游戏编程入门之游戏循环的演化探讨

Winform游戏编程入门之游戏循环的演化探讨

时间:2013-04-26 12:58 点击:3351次 字体:[ ]




本文来自codeprojct上一篇文章http://www.codeproject.com/Articles/25909/Game-Programming-One,可以说是翻译,但是只保留精髓部分。

Winform窗体是事件驱动的,但游戏不是。所以我们需要为游戏设计一个循环体(俗称游戏循环?)

  1. /// <summary>  
  2. /// 游戏通常不是事件驱动的。  
  3. /// <para>所以我们设计一个循环,在循环里面进行“获取输入”、“逻辑处理”和“绘图”操作。</para>  
  4. /// <para>缺点:电脑配置不同,场景复杂程度不同等都会导致游戏更新速度不同。</para>  
  5. /// <para>实际上,游戏通常会运行的过快,使得玩家反应不过来。</para>  
  6. /// </summary>  
  7. private static void GameLoop1()  
  8. {  
  9.     bool runGame = true;  
  10.     while (runGame)  
  11.     {  
  12.         GetInput();  
  13.         PerformLogic();  
  14.         DrawGraphics();  
  15.     }  

如注释所说,GameLoop1实现了获取输入、逻辑处理和绘图这三项基本功能,算是游戏的骨架。但是这个循环在99%的情况下会因为速度太快使得玩家无法反应过来。

于是出现了下面的改进版。

 

  1. static bool doStuff = false;  
  2. /// <summary>  
  3. /// 用计时器控制游戏更新的速度。客服了GameLoop1的缺点。  
  4. /// <para>实际上从这一版的游戏开始才是真正能玩的。</para>  
  5. /// <para>缺点:通常DrawGraphics是最慢的部分。若这部分太慢,整个游戏速度就会下降。</para>  
  6. /// <para>你可以想象DrawGraphics慢慢悠悠的进行着,而mainTimer已经滴答了好多次,doStuff已经多次被置为true,游戏输入和逻辑却无法更新。</para>  
  7. /// </summary>  
  8. private static void GameLoop2()  
  9. {  
  10.     Timer mainTimer = new Timer();  
  11.     mainTimer.Interval = 1000 / 60;  
  12.     mainTimer.Elapsed += new ElapsedEventHandler(mainTimer_Elapsed);  
  13.     bool runGame = true;  
  14.     while (runGame)  
  15.     {  
  16.         if (doStuff)  
  17.         {  
  18.             GetInput();  
  19.             PerformLogic();  
  20.             DrawGraphics();  
  21.             doStuff = false;  
  22.         }  
  23.     }  
  24. }  
  25.  
  26. static void mainTimer_Elapsed(object sender, ElapsedEventArgs e)  
  27. {  
  28.     doStuff = true;  



本文地址 : http://www.fengfly.com/plus/view-212540-1.html
标签: WinForm
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: