青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

桃源谷

心靈的旅行

人生就是一場旅行,不在乎旅行的目的地,在乎的是沿途的風景和看風景的心情 !
posts - 32, comments - 42, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

使用C++設(shè)計游戲引擎的框架

Posted on 2009-12-22 14:57 lymons 閱讀(2001) 評論(1)  編輯 收藏 引用 所屬分類: C++設(shè)計模式足球游戲

使用C++設(shè)計游戲引擎的框架
http://www.codeproject.com/KB/game/GameEngine_Design.aspx

By nalla
翻譯:Lymons


本文使用C++來描述我的作品---給范型游戲引擎創(chuàng)建一個框架

·                     Download design strategy - 122 KB

·                     Download sample game engine - 129 KB

簡介

我拿到了一個任務(wù),就是寫一篇關(guān)于游戲引擎設(shè)計的報告。為此,我開始用C++來實現(xiàn)一個框架,它包含了一些設(shè)計模式(Design Patterns)的基本實現(xiàn)以及類似于基于原則設(shè)計(Policy based design)的一些C++概念。而本文就是談?wù)撐业脑O(shè)計,并且里面也包括一些可編譯的代碼片斷。

背景

本文描述的框架中使用了一些著名的設(shè)計范式(design paradigms),如基于原則的設(shè)計(Policy based design),裝飾者(Decorator)和策略(Strategy)模式,以及相應(yīng)的C++的代碼實現(xiàn)。

代碼的功能說明

基于原則的設(shè)計是用于游戲的設(shè)置

在進入到足球游戲引擎設(shè)計的細節(jié)之前,先討論一下游戲中的設(shè)置。在任何游戲中都允許用戶在游戲開始期間來選擇游戲的難度。我假設(shè)這里有三種難度級別,即:低級,中級,高級。因為這些級別允許在開始的時候被選擇,這就給了我們一個機會可以利用模板類來使用基于原則的設(shè)計(基于Andrei Alexandrescu的書《Modern C++ Design》)。因此,這些難度級別在這兒可以被當做一個原則(Policy)。而且我為設(shè)置游戲模式也新添加一個原則,這些游戲模式可以是自動模式(你可以和機器對戰(zhàn))或者多人模式(你可以和朋友一起玩)。

基于原則的設(shè)計可以被當作策略模式在編譯期間的一個變體。

 Collapse

template <typename T>

struct DifficultyLevel_High

{

    static void setDifficultyLevel(T&) { cout << "Setting to High difficulty level" <<endl; }

};

template <typename T>

struct DifficultyLevel_Med

{

    static void setDifficultyLevel(T&)

    { cout << "Setting to Medium difficulty level" <<endl; }

};

template <typename T>

struct DifficultyLevel_Low

{

    static void setDifficultyLevel(T&)

    {cout << "Setting to Low difficulty level" <<endl; }

};

template <typename T>

struct Playmode_policy_auto

{

    static void setPlaymodepolicy(T&)

    { cout << "Setting to auto Playmode" <<endl; }

};

template <typename T>

struct Playmode_policy_multi

{

    static void setPlaymodepolicy(T&)

    { cout << "Setting to multi Playmode" <<endl; }

};

 

class FootballEngineType

{

public:

    FootballEngineType()

    { cout << "Engine set as Football " << endl;

    }

};

 

//---------------------Usage of Policy based design----------------//

template< typename T,

template <typename> class DifficultyLevel_policy,

template <typename> class Playmode_policy >

class GamingEngine

{

public:

    void Run()

    {

        DifficultyLevel_policy<T>::setDifficultyLevel(engineType);

        Playmode_policy<T> ::setPlaymodepolicy(engineType);

        start();

    }

private:

    T engineType;

};

接下來要實現(xiàn)的事情是讓球隊在游戲的運行期內(nèi)可以改變它的邏輯和策略。例如,用戶能夠選擇防守策略而不是進攻, 使用策略模式使之成為可能。我們能夠為防守或者進攻等的策略定制一套算法,以便用戶能在運行期選擇球隊的策略。那我們在這里就使用策略模式 Strategy pattern,在這兒我定義了三種策略,以及能夠通過 GameLogic 類來設(shè)置這些策略。

 Collapse

class Strategy

{

public:

    Strategy() {}

    virtual void Apply()=0;

    virtual ~Strategy() {}

};

class DefendStrategy : public Strategy{

public:

    DefendStrategy():Strategy() { cout << "Defend strategy set" << endl; }

    void Apply() { cout << "Defend strategy applied" << endl; }

    virtual ~DefendStrategy() {}

};

 

class AttackStrategy: public Strategy

{

public:

    AttackStrategy():Strategy() { cout << "Attack strategy set" << endl; }

    void Apply() { cout << "Attack strategy applied" << endl; }

    virtual ~AttackStrategy() {}

};

 

class MediumStrategy: public Strategy

{

public:

    MediumStrategy() :Strategy(){ cout << "Medium strategy set" << endl; }

    void Apply() { cout << "Medium strategy applied" << endl; }

    virtual ~MediumStrategy() {}

};

class GameLogic

{

public:

    StratType StrategyType;

    GameLogic()

    {

        m_Strategy = NULL;

    }

    void SetStrategy(StratType type)

    {

        if (m_Strategy) delete m_Strategy;

        if (type == Med)

            m_Strategy = new MediumStrategy();

        else if (type == Defend)

            m_Strategy = new DefendStrategy();

        else if (type == Attack)

            m_Strategy = new AttackStrategy();

    }

    void Exec() { m_Strategy->Apply(); }

    ~GameLogic() { if (m_Strategy) delete m_Strategy; }

private:

    Strategy *m_Strategy;

};

然后考慮的是每個實體能夠執(zhí)行的不同的角色。 每個球隊都有很多的球員,教練,體能教練,經(jīng)理,還有裁判和球隊的CEO等。在球隊中的每個人都能執(zhí)行一個或者多個角色,并且這些角色能夠通過一些參數(shù)在運行期間被分配出來,另外,作為一個球員本身也有不同的職責,像前鋒,后衛(wèi),中場,和守門員等。不通過子類化(sub classing)這些都應(yīng)該能夠被做出來

我們使用裝飾者模式Decorator pattern在運行期來分配角色和職責。

下面是輔助函數(shù)(helper functions)的代碼,被用來獲取游戲?qū)嶓w在運行期內(nèi)的角色和職責:

 Collapse

//------------templated helper functions for getting roles-------//

template <class T>

T* getresponsibility_entity(GameEntity *pEnt)

{

    return dynamic_cast<T*>(pEnt->GetResponsibility(T::RESP_CLSID));

}

template <class T>

T* getroles_entitiy(GameEntity *pEnt)

{

    return dynamic_cast<T*>(pEnt->GetRole(T::ROL_CLSID));

}

下面的代碼片斷是在運行期創(chuàng)建一個游戲?qū)嶓w并給它分配角色和職責,以及使用上面做成的helper functions接收這些對象 (關(guān)于完全的實現(xiàn),請參考附件中的CPP文件):

 Collapse

// Add a single player

GameEntity* play1 = new GameEntity("Beckham", "David");

//Adding role as Player

play1->AddRole(new Player(play1));

Player *playRole = getroles_entitiy<Player>(play1);

//Adding Responsibilities to play and manage

play1->AddResponsibilities(new ToPlay(play1));

play1->AddResponsibilities(new ToManage(play1));

還有,不同的隊伍能夠使用不同的設(shè)置在不同的球場上踢不同聯(lián)賽的比賽。舉例子來講,在足球游戲中的每一個實體能夠湊在一起形成一個球隊,并且還能夠應(yīng)用不同的外觀設(shè)置。你能夠添加一些球員到一家指定的俱樂部中以及添加一些不同的球隊到不同的聯(lián)賽中(如,英超聯(lián)賽)這里,使用橋接模式(Bridge pattern)就可以把每個實體的抽象(球隊/聯(lián)賽的比賽)能夠從具體的實現(xiàn)(聯(lián)賽/足球場/外觀設(shè)置等)中解耦出來。因此,實現(xiàn)和抽象之間能夠非常獨立的相互存在。或者說,使用建造者模式(Builder Pattern)也用來完成同樣的任務(wù)。

整個設(shè)計已經(jīng)被實現(xiàn)了并使用Visual Studio 2005 (VC8.0)編譯器編譯通過了,并且測試過了。一些具體的實現(xiàn)請參考附件中的FootballEngine.cpp 

興趣點

附加特征

近期我也正在思考如何使用觀察者模式,當策略和足球的位置以及對手的坐標被改變時來及時通知球員(游戲?qū)嶓w)

フォームの終わり

 

Feedback

# re: 使用C++設(shè)計游戲引擎的框架  回復  更多評論   

2009-12-23 09:33 by Sunshine Alike
mark,有空慢慢看~
我的個人簡歷第一頁 我的個人簡歷第二頁
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            99视频超级精品| 亚洲欧美综合v| 亚洲尤物视频在线| 一本色道88久久加勒比精品| 亚洲精品一区二区三区四区高清 | 欧美日韩成人免费| 亚洲高清av在线| 欧美福利在线| 日韩午夜免费| 亚洲一区精品视频| 欧美一区二区三区视频在线| 欧美成人精品1314www| 亚洲视频图片小说| 欧美一区二区在线观看| 久久久久国产精品人| 欧美不卡视频一区| 欧美高清在线| 欧美顶级少妇做爰| 一区二区三区视频观看| 亚洲欧美在线另类| 欧美成人综合一区| 亚洲国产欧美精品| 久久综合久久久| 久久精品国产91精品亚洲| 亚洲一区二区影院| 99国产精品视频免费观看| 欧美视频在线观看免费网址| 久久精品中文字幕免费mv| 日韩天堂在线视频| 免费观看久久久4p| 久久经典综合| 亚洲精品视频在线| 一本久道久久久| 亚洲欧美日韩天堂| 久久夜色精品一区| 欧美精品免费看| 国产精品草莓在线免费观看| 国产亚洲欧美日韩精品| 国产一区亚洲一区| 亚洲电影第1页| 欧美在线视频二区| 亚洲高清在线| 久久一区视频| 国产午夜亚洲精品羞羞网站| 久久久久久网站| 另类激情亚洲| 亚洲视频观看| 一区二区三区 在线观看视频| 亚洲天堂av电影| 亚洲日本va在线观看| 亚洲大片av| 国产又爽又黄的激情精品视频| 欧美日韩国产亚洲一区| 亚洲国产精品黑人久久久 | 久久久精彩视频| 国产精品永久免费视频| 亚洲美女在线国产| 久久久久久久成人| 亚洲三级免费观看| 欧美日韩国产综合一区二区| 亚洲国语精品自产拍在线观看| 中文国产一区| 免费日韩av| 一本久久综合| 欧美精品激情在线| 亚洲欧美日韩爽爽影院| 国产精品啊啊啊| 亚洲视频日本| 亚洲国产一区二区在线| 久久综合福利| 亚洲福利视频一区二区| 免费永久网站黄欧美| 久久人人爽人人爽| 亚洲精华国产欧美| 亚洲精品视频在线观看免费| 欧美手机在线| 欧美有码在线视频| 欧美亚洲免费电影| 影音先锋亚洲视频| 亚洲二区免费| 欧美午夜免费| 久久综合中文色婷婷| 久久综合狠狠综合久久激情| 9色国产精品| 亚洲欧美美女| 在线免费高清一区二区三区| 99国产精品久久久久久久久久| 国产精品福利网站| 久久综合五月| 欧美日韩免费在线观看| av成人免费| 久久久噜噜噜久噜久久| 99在线热播精品免费| 日韩一级大片在线| 日韩午夜电影| 欧美日韩高清一区| 一区二区三区四区国产精品| 亚洲国产三级在线| 午夜一级在线看亚洲| 在线精品一区| 99国产精品99久久久久久| 国产精品久久久久久影视 | 欧美xx69| 亚洲在线视频观看| 久久精品人人做人人综合| 亚洲片国产一区一级在线观看| 欧美电影免费观看高清完整版| 欧美国产日韩视频| 久久精品国产精品| 欧美日韩一区二区在线观看视频| 午夜精品国产| 欧美精品在线播放| 久热精品在线视频| 国产精品日韩久久久| 亚洲国产视频a| 国产一区二区久久久| 一区二区三区视频在线观看| 亚洲黄色免费电影| 欧美亚洲色图校园春色| 中文一区二区在线观看| 另类尿喷潮videofree| 久久久精品日韩欧美| 国产精品久久久久国产精品日日| 亚洲国产成人精品视频| 精品二区视频| 性视频1819p久久| 午夜精品在线观看| 国产精品久久久久久久久久免费看 | 亚洲三级免费观看| 久久久久一区二区三区四区| 欧美一区二区三区久久精品 | 欧美日韩国产综合视频在线观看中文 | 亚洲视频狠狠| 99热免费精品在线观看| 蜜桃久久精品一区二区| 看片网站欧美日韩| 国语自产在线不卡| 欧美一区二区日韩一区二区| 欧美一级欧美一级在线播放| 欧美色视频一区| 99国产精品久久久久老师| av不卡在线观看| 欧美日韩精品一二三区| 日韩亚洲欧美一区| 亚洲色图综合久久| 国产精品久99| 午夜精品99久久免费| 久久久久国产精品一区| 激情欧美一区二区| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲电影av| 国产精品99久久久久久久久久久久 | 国产主播一区二区三区四区| 午夜欧美大片免费观看| 久久久久99| 亚洲国产三级在线| 欧美人与禽性xxxxx杂性| 一本色道久久88综合亚洲精品ⅰ | 国产精品一区二区视频| 欧美一区精品| 欧美顶级大胆免费视频| 亚洲美女视频网| 国产精品乱看| 久久精品国产清自在天天线| 免费亚洲网站| 亚洲视频免费看| 国产亚洲免费的视频看| 蜜臀99久久精品久久久久久软件| 91久久久在线| 欧美在线视频免费| 亚洲欧洲日韩女同| 国产精品成人免费视频| 久久久精品2019中文字幕神马| 亚洲国产专区校园欧美| 欧美一区1区三区3区公司| 永久免费视频成人| 欧美午夜激情视频| 久久久一区二区三区| 99亚洲一区二区| 麻豆乱码国产一区二区三区| 一本色道久久综合亚洲精品婷婷| 国产欧美精品一区二区色综合 | 国产酒店精品激情| 蜜臀久久久99精品久久久久久| 中文国产成人精品久久一| 猛男gaygay欧美视频| 亚洲图片在区色| 亚洲人成免费| 国语精品中文字幕| 国产伦精品一区二区三区在线观看 | 午夜精品久久久久久久99水蜜桃| 国模 一区 二区 三区| 欧美精品亚洲一区二区在线播放| 亚洲欧美欧美一区二区三区| 亚洲黄页视频免费观看| 久久人91精品久久久久久不卡| 亚洲一级二级| 99精品视频一区| 亚洲激情在线播放| 狠狠久久综合婷婷不卡|