Blender 3D:从新手到高手/Intro-GE-Source
适用 Blender 版本:2.43。 |
使命宣言:本节的目的是向程序员展示如何理解 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() 函数调用时,它们停止运行。