跳转到内容

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() 函数调用时,它们停止运行。

华夏公益教科书