跳轉到內容

Blender 3D:從新手到高手/Intro-GE-Source

來自華夏公益教科書

使命宣言:本節的目的是向程式設計師展示如何理解 Blender 遊戲引擎原始碼。它不適用於那些不會 C++ 程式碼的人。如果你是一個對 C++ 有基本瞭解的人,我會謹慎地使用關鍵詞,如果你在 Google 上搜索這些關鍵詞,應該能提供足夠的理解資訊。


當你按下 P 時,在任何操作可以進行之前,會有一些東西被髮送到 GE。這些東西可能是什麼?

StartKetsjiShell(struct ScrArea *area,
		      char* scenename,
		      struct Main* maggie1,
		      struct SpaceIpo *sipo,
		      int always_use_expand_framing)


Blender 使用了大量的結構體和類。你需要對它們以及繼承有一個基本的瞭解,然後我們才能繼續。複習一下:http://www-numi.fnal.gov/offline_software/srt_public_context/WebDocs/Companion/cxx_crib/inheritance.html

SCA_IObject 類 source/gameengine/GameLogic/SCA_IObject.cpp

and SCA_IObject.h


這個類封裝了許多其他東西,所以我們可以從這裡開始,向下移動到它控制的東西。首先,它使用向量來儲存與物件關聯的所有不同的感測器、控制器和執行器。向量就像一個數組,但它是動態的,並且具有內建函式。
我們將從檢查感測器是如何新增的開始。


typedef std::vector<SCA_ISensor *> SCA_SensorList;
SCA_SensorList m_sensors;

這裡的第一行是一個 typedef,所以它只是告訴我們,我們可以透過使用 SCA_SensorList 這個名稱來建立一個 SCA_ISensor 的向量。
第二行建立了名為 m_sensors 的向量。


void SCA_IObject::AddSensor(SCA_ISensor* act)<br />
{   m_sensors.push_back(act);   }

這個函式允許 SCA_IObject 的父類透過呼叫 SCA_IObject.AddSensor(keyboard) 來新增新的感測器;虛擬碼

所以現在你知道 GE 中的物件是如何建立感測器(以及執行器和控制器,它們是一樣的 :) 那麼讓我們看看感測器是如何被獲取的!由於它們是動態新增的,所以程式無法假設有多少個感測器,或者它們是什麼。因此,就有了這個輔助函式。

1''SCA_ISensor* SCA_IObject::FindSensor(const STR_String& sensorname)
2{
3	SCA_ISensor* foundsensor = NULL;
4
5	for (SCA_SensorList::iterator its = m_sensors.begin();!(its==m_sensors.end());its++)
6	{
7		if ((*its)->GetName() == sensorname)
8		{<br />
9			foundsensor = (*its);
10			break;
11		}
12	}
13	return foundsensor;
14}''

簡單來說,你給它一個感測器的名稱,它返回一個指向該感測器的指標。

對於新手:我知道我讓你學習了所有關於類的知識,但以防萬一:) 第一個詞,“SCA_ISensor*”,它告訴我們該函式將返回指向 SCA_ISensor 的指標。根據該函式的引數,我們知道當你呼叫 FindSensor 時,你必須在括號之間給它一個字串。
在第 3 行,你建立一個空指標,你將用它來儲存你找到的感測器。然後你迴圈遍歷感測器向量(記住,它叫做 m_sensors)中的每個感測器,直到你找到與名稱匹配的那個。如果你沒有找到,你將返回 NULL。


void SCA_IObject::Suspend(void) 它所做的是迴圈遍歷所有感測器,並向每個感測器傳送一個 "suspend" 呼叫。這樣做會改變一個名為 "m_suspended" 的變數,這會導致當感測器被 Activate() 函式呼叫時,它們停止執行。

華夏公益教科書