遊戲製作心得(一)
談了很多關於網路遊戲的一些技術技巧和框架,但都是零散的,這有好處,但大多數新手或是愛好者都不知道該如何下手,下面談談我的遊戲開發心得
遊戲開發一般使用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微服務框架,將最近的學習過程寫下來供大家參考。好,