1. 程式人生 > >遊戲製作心得(一)

遊戲製作心得(一)

談了很多關於網路遊戲的一些技術技巧和框架,但都是零散的,這有好處,但大多數新手或是愛好者都不知道該如何下手,下面談談我的遊戲開發心得

遊戲開發一般使用VC+DX,你可以使用Win32 API直接建立一個Windows應用程式框架,也可以使用MFC來建立一個Windows應用程式框架,注意,並不是像很多人想象的那樣,用了MFC就覺得很慢,其實我們只是用MFC搭建了一個應用程式框架,而且MFC有很多很好用的類庫,這些類庫可以提高我們開發的效率,但並不影響我們的圖形渲染和資料處理,因為在圖形渲染和資料處理部分我們很少能用得上MFC,不會影響執行效率。

當然,不用MFC也可以,直接使用Win32 API 也並不是需要花很多時間。可以根據個人需求進行選擇。

大多數人都知道遊戲的基本結構

Game_Init( );

while ( )
{
    if ( )
    {
    }
    else
    {
        Update( );
        Render( );
    }
}

Game_Destroy( );

我先說簡單的 Update( )和Render( ) 函式
一般說來不同的資料更新在自己不同的事件中處理,但有很多是帶狀態的資料,比如:IDirectInput的狀態機,需要在一定的時間來處理這些資料,那麼我們可以在Update函式裡來處理。我們還可以模擬一些自定義的事件訊息,比如自定義的UI,或者指令碼。

Update( )
{
   while ( Events_Count > 0 )
   {
       Do_Events( );
   }
}

關於渲染函式很簡單了,很多遊戲資料都介紹瞭如何渲染,但渲染什麼我稍後再說

Render ( )
{
    Begin_Render( );

    // 場景,角色,UI等等

    ...

    End_Render( );
}

下面說渲染內容,渲染內容都是預先準備好的。
我們一般有2種方式組織資料,一種我稱之為集合式,一種我稱之為派生式。
1、集合式
所有的物件都有2個類
class CObj
{
    // 物件的方法屬性
};

typedef CObj* ObjPtr;

class CCObj
{
protected:

    map<ObjKey, ObjPtr> m_lstObjs;     // 物件清單

public:

    CCObj( );
    ~CCObj( )
    {
        clear( );
    } 
 
public:
   
    static CCObj * GetInst( );

public:

  LoadFromConfigFile( char * szFile );  // 從配置檔案中批量讀取物件

    ObjPtr New( );                         // 直接新建物件
    bool Add( ObjPtr p );                  // 增加新物件
    bool Remove( ObjKey );                 // 移除物件
    ObjPtr Find( );                        // 檢索物件

    void clear( )                          // 全部清空
    {
        map<ObjKey, ObjPtr>::iterator it = m_lstObjs.begin( );
        for ( ; it != m_lstObjs.end( ); ++it )
        {
            ObjPtr p = (*it);
            if ( p )
            {
                delete p;
                p = NULL;
            }
        }

        m_lstObjs.clear( );        
    }
};

要特別注意的是那個集合的解構函式,另外還有一個函式就是GetInst( ),它是靜態的,用來訪問這個類,其實也就是說這個集合類是個全域性性的例項,用來管理整個遊戲中所用的該物件。那麼我們在CPP檔案裡需要這樣定義:

#include "Obj.h"

CCObj g_CCObj;

CCObj * CCObj::GetInst( )
{
   return &g_CCObj;
}

這樣,關於Obj的資料我們就處理好了,用的時候是隨需申請,集中釋放,比如:

#include "Obj.h"

{
   ...
  
   ObjPtr pNewObj = new CObj;
   CCObj::GetInst( )->Add( pNewObj );

   ...
}

我們不需要去呼叫delete pNewObj來釋放該物件,因為當程式退出的時候,集合CCObj會把所有申請的物件全部集中釋放,不用擔心記憶體問題,用的時候只管用就好了。

上面的是集合式管理

2、派生式管理
派生式管理就是我們定義一個基類
class CObjBase
{
public:

   typedef CObjBase * CObjBasePtr;

private:

   map<ObjKey, CObjBasePtr> m_lstObjs;     // 物件清單
 
public:
  
   bool AddSubObj( CObjBase * pChild )
   {
       m_lstObjs.insert( map<ObjKey, CObjBasePtr>::value_type( pChild->m_Key, pChild );
       return true;
   }

   CObjBase( CObjBase * pBase )
   {
       if ( pBase )
       {
           pBase->AddObj( this );
       }
   }

   ~CObjBase( )
   {
        map<ObjKey, CObjBasePtr>::iterator it = m_lstObjs.begin( );
        for ( ; it != m_lstObjs.end( ); ++it )
        {
            CObjBasePtr p = (*it);
            if ( p )
            {
                delete p;
                p = NULL;
            }
        }

        m_lstObjs.clear( );       
   }

};

這就像一棵大樹,每個節點下面有幾個子類,釋放的時候一級一級的釋放,主要是根節點需要手工釋放,用的時候比較方便,但釋放時其實是遞迴呼叫,所以一般用於休閒小遊戲,用法如下:

CObjBase * pRoot = new pRoot( NULL );

new CObjBase( pRoot );
new CObjBase( pRoot );
...
new CObjBase( pRoot );

delete pRoot;

上面new的時候甚至不用返回值,我們只需要釋放掉pRoot就可以了。所有其他的類都可以從這個基類派生,比如:

class CObj1 : public CObjBase
{
};

class CObj2 : public CObj1
{
};

用的時候

p1 = new CObj1( pRoot );
new CObj2( pRoot );
p2 = new CObj2( p1 );
new CObj2( p2 );

還是很方便的。

今天就講這麼多了,下次再聊

相關推薦

遊戲製作心得

談了很多關於網路遊戲的一些技術技巧和框架,但都是零散的,這有好處,但大多數新手或是愛好者都不知道該如何下手,下面談談我的遊戲開發心得 遊戲開發一般使用VC+DX,你可以使用Win32 API直接建立一個Windows應用程式框架,也可以使用MFC來建立一個Windows應用

pygame遊戲程式設計心得——轉向行為(目標追蹤)

 最近自學python語言的過程中接觸到了Pygame,這也是我第一次接觸到遊戲引擎。作為一個男生對遊戲有天然的興趣,所以當看到pygame時自己做個小遊戲的想法便油然而生,在這個過程中遇到了很多問題。基於學習和討論的基於學習和討論的目的寫了這個文章。 遇到的問題:怎麼實

使用cocos2d-js製作遊戲新手引導

    ​  想到新手引導的功能時可能很多人都會覺得頭痛,難以下手。特別是在遊戲本身功能或需求還不穩定的情況,更是難以應付,本人就是在這種情況下接受了一個艱鉅的任務。在痛定思痛之後,開始了引導功能開

關於spring源碼的一些心得

blog clas 實現接口 繼承 classpath mage 獲取 ssp 源碼 總結:通過前面的一些認識,可以大致認為,ioc容器就是獲取一些需要使用的對象如pojo等的引用,相當於new 而ioc容器的作用也就是用於此處,用於獲取或者讀取對象實例

C++學習心得

eof gpo pre typeid 學習 div ctrl+z c++ str 2018-01-20 while (cin >> n)//終止可以使用輸入eof或Ctrl+Z for (auto &c : str) cout <

轉整UE4遊戲優化 多人大地型遊戲的優化遊戲線程的優化

兼容 source bubuko 又是 mic ini 策略 動態 author 施主分享隨緣,評論隨心,@author:白袍小道 小道暗語: 1、因為小道這裏博客目錄沒自己整,暫時就用隨筆目錄結構,所以二級目錄那啥就忽略了。標題格式大致都是

遊戲開發入門遊戲開發概述

str 要掌握 strong 簡單 動手 屬於 掌握 技術 遊戲機 視頻鏈接:遊戲開發入門(一)遊戲開發概述請添加鏈接描述(3節課 時常:約1小時03分鐘) 該視頻圍繞電子遊戲的發展與開發簡單介紹了一些基本常識,同時提出並解決了幾個問題 筆記與總結(請先學習視頻內容):

Android學習心得

1、活動類處理啟動與關閉活動的相關方法及說明 方法 說明 StartActivity(intent) 使用引數意圖啟動新活動,此方法是重寫Context類實現的原始版本 startA

Java開發學習心得:SSM環境搭建

Java開發學習心得(一):SSM環境搭建 有一點.NET的開發基礎,在學校學過基礎語法,對JAVA有點興趣,就簡單學習了一下,記錄一下從哪些方面入手的,暫時不打算深入到原理方面,先簡單搭下環境看看,所以有些地方可能講得不慎準確。 1 SSM框架 從網上的討論來看,SSM框架似乎正在慢慢被Spring

STM32 使用Cube的心得

最近做了一個專案使用Cube自動生成程式碼,然後利用HAL庫進行程式設計。晶片為STM32F103C8T6進行程式設計。 I2C讀寫 1. 地址需要自己左移1位(stm32中需要,但是NXP中不需要),LPC系列的以前用過一款,函式內部自動左移了。 2. SCL,SDA通訊時需要接上拉電阻,然

項目管理學習心得

項目 隨著 集成 重要 前言 class 特定 實體 軟件項目管理 前言不序,往事不憶,直奔主題。 項目管理一般有十個主要管理內容:範圍管理、時間管理、成本管理、質量管理、集成管理、風險管理、溝通管理、組織管理、人力資源管理和采購管理。 在學習各個內容之前,需要先知道什麽是

專案管理學習心得

前言不序,往事不憶,直奔主題。 專案管理一般有十個主要管理內容:範圍管理、時間管理、成本管理、質量管理、整合管理、風險管理、溝通管理、組織管理、人力資源管理和採購管理。 在學習各個內容之前,需要先知道什麼是專案?什麼是專案管理? 專案是一次性的、臨時性的活動,即是在明確的有限時間內進行的工作和活動,也許

Android開發心得

Android開發心得之MVC 這一個學期在上潘老師的系統設計與分析課程時,我們小組開發了基於安卓平臺的電影購票軟體。在開發過程中收穫了挺多,現在在課程結束前,把其分享出來。 MVC是軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分:模型(Model)、檢視(View)和控

微信小遊戲-CocosCreator 基礎

路徑:不中文 設定IDE=》偏好設定=》資料編輯=》外部指令碼編輯器 cocosCreator: resources: cocos2d-x引擎 :C++ engine :H5引擎:js 模擬器 :resources=》cocos2d-x=》simulator=》win32=

遊戲前端學習 typescript + egret + egret-EUI系列

本系列主要是我的工作學習歷程,包括日常採坑,遊戲相關的程式設計、語法、擴充套件庫等。所以文章會有點流水賬的形式。  最近找了份新的工作,主要是微信小遊戲開發的,由於我擁有 Java、JavaScript、微信小程式開發等基礎,所以目前主要補充的知識點有 typescri

Android重新學習記錄和心得--Handler

1.關於Handler,MessageQueue,Looper,Message 主要講了Handler的message傳送,訊息的同步非同步。以前只知道Handler可以傳送訊息,然後一般通過handlerMessage方法來接收各種訊息,發現其實Handler還可設定

Python for Data Analysis 學習心得

一、簡介 Python for Data Analysis這本書的特點是將numpy和pandas這兩個工具介紹的很詳細,這兩個工具是使用Python做資料分析非常重要的一環,numpy主要是做矩陣的運算,pandas主要是做資料的預處理,另外本書還教了其他資料分析相關的工具,比如matplotlib用來作

AssetBundle系列——遊戲資源打包

將本地資源打包,然後放到資源伺服器上供遊戲客戶端下載或更新。伺服器上包含以下資源列表: (1)遊戲內容資源assetbundle (2)資源維護列表,包含每個資源的名字(完整路徑名)和對應的版本號[資源名,版本號],如下表所示(VersionNum.xml): &l

即時戰略遊戲Unity實現單位選擇

本人非常喜歡各種遊戲,尤其是即時戰略遊戲(如星際爭霸,war3等)以及仙俠類的單機遊戲,現在自學遊戲製作,希望有一天能製作出一款自己心中的遊戲。 今天突然想寫點東西,把自己的學習過程記錄下來。 從即時戰略遊戲的研究開始吧- - 我們從單位的選擇上開始,即時戰略遊戲裡單位

SpringCloud學習心得 構建最基礎的SpringCloud專案

首先本系列部落格參照 史上最簡單的 SpringCloud 教程,地址:https://blog.csdn.net/forezp/article/details/70148833根據工作需要,筆者最近研究SpringCloud微服務框架,將最近的學習過程寫下來供大家參考。好,