一、遊戲框架完善
- using System;
- using System.Threading;
- using System.Runtime.InteropServices;
- using CGraphics;
- namespace CEngine
- {
- /// <summary>
- /// 通用遊戲類
- /// </summary>
- public abstract class CGame : ICGame
- {
- #region Api函數
- [DllImport("User32.dll")]
- private static extern IntPtr FindWindow(String lpClassName, String lpWindowName);
- #endregion
- #region 字段
- //略...
- /// <summary>
- /// 繪圖
- /// </summary>
- private CDraw m_draw;
- /// <summary>
- /// 重繪事件委託
- /// </summary>
- /// <typeparam name="TEventArgs"></typeparam>
- /// <param name="e"></param>
- public delegate void PaintEventHandler<TEventArgs>(TEventArgs e);
- /// <summary>
- /// 重繪事件
- /// </summary>
- private event PaintEventHandler<CPaintEventArgs> m_paint;
- #endregion
- #region 構造函數
- /// <summary>
- /// 構造函數
- /// </summary>
- public CGame()
- {
- //略...
- m_draw = new CDraw();
- //略...
- //添加遊戲重繪事件
- m_paint += new PaintEventHandler<CPaintEventArgs>(onRedraw);
- }
- #endregion
- #region 遊戲運行函數
- /// <summary>
- /// 遊戲初始化
- /// </summary>
- protected abstract void gameInit();
- /// <summary>
- /// 遊戲輸入
- /// </summary>
- private void gameInput()
- {
- //處理鼠標事件
- this.getMouseDevice().mouseEventsHandler();
- //處理鍵盤事件
- this.getKeyboardDevice().keyboardEventsHandler();
- }
- /// <summary>
- /// 遊戲重繪,只在顯式更新時才發生
- /// </summary>
- /// <param name="e"></param>
- protected virtual void onRedraw(CPaintEventArgs e)
- {
- //缺省是用背景顏色擦除指定區域
- m_draw.setDrawSymbol(CSymbol.DEFAULT);
- m_draw.fillRect(e.getClientRect(), Console.BackgroundColor);
- }
- /// <summary>
- /// 遊戲渲染
- /// </summary>
- /// <param name="draw"></param>
- protected abstract void gameDraw(CDraw draw);
- /// <summary>
- /// 遊戲邏輯
- /// </summary>
- protected abstract void gameLoop();
- /// <summary>
- /// 遊戲結束
- /// </summary>
- protected abstract void gameExit();
- #endregion
- //略...
- /// <summary>
- /// 獲取控制檯區域
- /// </summary>
- /// <returns></returns>
- protected CRect getClientRect()
- {
- return new CRect(Console.WindowLeft, Console.WindowTop, (Console.WindowWidth >>1) - 1, Console.WindowHeight);
- }
- /// <summary>
- /// 獲取繪圖對象
- /// </summary>
- /// <returns></returns>
- protected CDraw getDraw()
- {
- return this.m_draw;
- }
- /// <summary>
- /// 響應重繪事件
- /// </summary>
- /// <param name="e"></param>
- private void onPaint(CPaintEventArgs e)
- {
- PaintEventHandler<CPaintEventArgs> temp = m_paint;
- if (temp != null)
- {
- temp(e);
- }
- }
- /// <summary>
- /// 更新操作導致重繪整個工作區
- /// </summary>
- protected void update()
- {
- CPaintEventArgs e = new CPaintEventArgs(getClientRect(), getDraw());
- this.onPaint(e);
- }
- /// <summary>
- /// 更新操作導致重繪指定區域
- /// </summary>
- protected void update(CRect rect)
- {
- CPaintEventArgs e = new CPaintEventArgs(rect, getDraw());
- this.onPaint(e);
- }
- //略...
- #region 遊戲啓動接口
- /// <summary>
- /// 遊戲運行
- /// </summary>
- public void run()
- {
- //遊戲初始化
- this.gameInit();
- Int32 startTime = 0;
- while (!this.isGameOver())
- {
- //啓動計時
- startTime = Environment.TickCount;
- //計算fps
- this.setFPS();
- //遊戲輸入
- this.gameInput();
- //遊戲邏輯
- this.gameLoop();
- //遊戲渲染
- this.gameDraw(m_draw);
- //保持一定的FPS
- while (Environment.TickCount - startTime < this.m_updateRate)
- {
- this.delay();
- }
- }
- //遊戲退出
- this.gameExit();
- //釋放遊戲資源
- this.close();
- }
- #endregion
- //略...
- }
- }
重繪事件參數類實現爲:
///CPaintEventArgs類實現
- using System;
- using CGraphics;
- namespace CEngine
- {
- /// <summary>
- /// 重繪事件參數
- /// </summary>
- public sealed class CPaintEventArgs : EventArgs
- {
- private CRect m_rect;
- private CDraw m_draw;
- public CPaintEventArgs(CRect rect, CDraw draw)
- {
- this.m_rect = rect;
- this.m_draw = draw;
- }
- public CRect getClientRect()
- {
- return this.m_rect;
- }
- public void setClientRect(CRect rect)
- {
- this.m_rect = rect;
- }
- public CDraw getDraw()
- {
- return this.m_draw;
- }
- public void setDraw(CDraw draw)
- {
- this.m_draw = draw;
- }
- }
- }
至此,遊戲框架類已基本完成,至於聲音模塊目前就不實現。接下來的幾章我們將會使用這個框架實現幾個小遊戲,以熟悉這個框架的使用方法,並在必要的情況下進行優化,從而更符合使用需求。