目录
2Quake3Map
首页 数据库 mysql教程 Irrlicht学习备忘录2 Quake3Map

Irrlicht学习备忘录2 Quake3Map

Jun 07, 2016 pm 03:43 PM
备忘录 学习

2Quake3Map 官方代码 ($sdk)\examples\02.Quake3Map 这个例子演示了向 irr 引擎中载入一张 Quake3 地图文件以及创建一个用户控制的摄象机。它跟上一个例子 HelloWorld 一样简单,其实应该是更简单。它比上个例子少了 GUI 部分,增加了使用压缩文件的方法,剩

2Quake3Map

官方代码($sdk)\examples\02.Quake3Map

Irrlicht学习备忘录2 Quake3Map

这个例子演示了向irr引擎中载入一张Quake3地图文件以及创建一个用户控制的摄象机。它跟上一个例子HelloWorld一样简单,其实应该是更简单。它比上个例子少了GUI部分,增加了使用压缩文件的方法,剩下的内容都是上个例子中已有的。至于多出来渲染方式选择菜单,帧速统计这部分代码,应该可以说跟irr彻底无关,这是任何一门编程语言入门时就练习过的内容。

irr名字空间下有五个子命名空间,core,scene,video,io,gui。在这个例子中,可能引擎作者为了让学习者熟悉各空间的负责什么功能,并没有使用usingnamespace xxx的方式声明使用子名字空间。

下面代码为例子中的选择irr驱动设备代码。在命令行界面中做了个简单的菜单选择界面,通过swicht语句判断选中的驱动类型。

video::E_DRIVER_TYPEdriverType;

printf("Pleaseselect the driver you want for this example:\n"\

"(a) OpenGL 1.5\n (b) Direct3D 9.0c\n (c) Direct3D 8.1\n"\

"(d) Burning's Software Renderer\n (e) Software Renderer\n"\

"(f) NullDevice\n (otherKey) exit\n\n");

chari;

std::cin>> i;

switch(i)

{

case'a': driverType = video::EDT_OPENGL; break;

case'b': driverType = video::EDT_DIRECT3D9;break;

case'c': driverType = video::EDT_DIRECT3D8;break;

case'd': driverType = video::EDT_BURNINGSVIDEO;break;

case'e': driverType = video::EDT_SOFTWARE; break;

case'f': driverType = video::EDT_NULL; break;

default:return 1;

}

该段代码在irr的例子中经常出现,在后面其他例子中,它被封装到driverChoiceConsole函数接口中,头文件driverChoice.h

下面是使用压缩文件的代码。方法很简单,通过irr的设备指针提供的获取irr文件系统。

irr文件系统中addFileArchive接口提供了访问zip压缩文件的功能。在头文件中能看到该接口的详细说明。

device->getFileSystem()->addFileArchive("../../media/map-20kdm2.pk3");

调用addFileArchive后,解压的文件在irr文件系统中的位置与程序文件在相同目录下,但在操作系统文件系统中看不到。addFileArchive接口中有参数指定解压后的文件目录是否有效,设置无效标记,压缩文件中的文件目录将被忽略,所有解压后的文件都在同一目录下。

scene::IAnimatedMesh*mesh = smgr->getMesh("20kdm2.bsp");

这行代码在HelloWorld中已经出现过,唯一不同的是getMesh中的文件名。20kdm2.bsp文件是从map-20kdm2.pk3文件中解压出来的。因解压后的文件位置与程序文件在同一目录,因此使用相对路径访问,就只需直接给出文件名就行了。

scene::ISceneNode*node = 0;

if(mesh)

node= smgr->addOctreeSceneNode(mesh->getMesh(0), 0, -1, 1024);

这里添加场景节点的方法与HelloWorld的也很相似,不同是以前用的是addAnimatedMeshSceneNode添加动画网格场景节点,这次用的是addOctreeSceneNode添加八叉树场景节点。从节点名称上可以知道,动画网格节点,意味着该节点是会动的。这次的八叉树场景节点,是用八叉树对该节点模型进行优化,它只对静态模型有效。通常地图、地形这类静态模型体积非常大,使用的顶点数极其庞大,同时将所有顶点数据传递给显卡处理,对带宽资源是种浪费,同时也让显卡对不需要显示的部分也进行了大量运算,这是对硬件资源使用的浪费。使用八叉树优化后,通过对八叉树的裁剪,得出每次显示区域的顶点数据,只传送该部分数据给显卡,可以明显提高显示速度。irr通过八叉树节点把这些优化功能全做了。

if(node)

node->setPosition(core::vector3df(-1300,-144,-1249));

设置场景节点的位置坐标。这里同样在HelloWorld中出现过。

smgr->addCameraSceneNodeFPS();

这行看起来很眼熟,就是比原来见到的多了FPS这个尾巴。熟悉游戏的人,一看FPS就知道只的是什么。因此这行是添加了一个FPS视觉的摄像机。玩FPS游戏时是如何控制摄像机移动的,这里也一样。只需addCameraSceneNodeFPS这么一句,就已经把FPS摄像机及移动方式都解决了。

device->getCursorControl()->setVisible(false);

这句,用词霸查出每个单词的意思,连起来一读也就明白。irr设备获取光标控制,设为光标不显示。FPS游戏里本来就不需要鼠标光标,这里把鼠标光标关闭,没什么可奇怪的。

intlastFPS = -1;

while(device->run())

{

if(device->isWindowActive())

{

driver->beginScene(true,true, video::SColor(255,200,200,200));

smgr->drawAll();

driver->endScene();

intfps = driver->getFPS();

if(lastFPS != fps)

{

core::stringwstr = L"Irrlicht Engine - Quake 3 Map example [";

str+= driver->getName();

str+= "] FPS:";

str+= fps;

device->setWindowCaption(str.c_str());

lastFPS= fps;

}

}

else

device->yield();

}

这段代码跟原来见到的仍然很相似,就是中间多了几行。仔细看看多出来的这几行,就是设计了一个计数器,用来记录显示帧速。irr设备提供的getFPS()接口可以直接获取当前的显示帧速,因此不再需要用计时器和累加器在循环里进行帧速的计算,这点很方便。 core::stringw字符串类型,看到前面的名字空间,应该知道这是irr自己的字符串类型。为何不用STL字符串?我也觉着奇怪,在后面还不断的发现很多常用的泛型,仍然不是STL而是irr自己的。不过看了它们的代码后,感觉他们比STL的更简洁写,少了一些不常用的东西,也增加了一些STL没有的功能。可能是开始写irr时,STL还没成C++标准的一部分,要么是STL用在游戏引擎中速度方面不够理想。不过irr的字符串类型我挺喜欢的,它可以通过+=运算符,直接将数字、字符串直接加入原有的字符串,而且字符串类型并不区分宽窄,它会在本地字符集和Unicode之间自动转换,挺方便的。

将处理好的字符串传递给setWindowCaption,显示在窗口标题栏上。

程序编译好后,就可以进去游览下这个Quake3Map了,操作完全是FPS操作方式,退出时需要按Alt+F4。就这么几行代码,就实现了FPS游戏的最基本样子,感觉的确有点振奋人心。似乎用它做出自己的游戏并不难。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

学会彻底卸载pip,使用Python更加高效 学会彻底卸载pip,使用Python更加高效 Jan 16, 2024 am 09:01 AM

不再需要pip?快来学习如何有效卸载pip!引言:pip是Python的包管理工具之一,它可以方便地安装、升级和卸载Python包。然而,有时候我们可能需要卸载pip,可能是因为我们希望使用其他的包管理工具,或者因为我们需要完全清除Python环境。本文将介绍如何有效地卸载pip,并提供具体的代码示例。一、卸载pip的方法下面将介绍两种常见的卸载pip的方法

深入研究matplotlib的色彩映射表 深入研究matplotlib的色彩映射表 Jan 09, 2024 pm 03:51 PM

深入学习matplotlib颜色表,需要具体代码示例一、引言matplotlib是一个功能强大的Python绘图库,它提供了丰富的绘图函数和工具,可以用于创建各种类型的图表。而颜色表(colormap)是matplotlib中一个重要的概念,它决定了图表的配色方案。深入学习matplotlib颜色表,将帮助我们更好地掌握matplotlib的绘图功能,使绘

iOS 17 小技巧:备忘录支持增加跳转链接 iOS 17 小技巧:备忘录支持增加跳转链接 Mar 27, 2024 pm 10:26 PM

对于习惯使用iPhone备忘录记录事项的小伙伴来说,iOS17中新增加的这项改进不可错过:在备忘录中,可以添加链接跳转到其它备忘录。操作方法如下:1.在备忘录输入区域轻点一下并选择“添加链接”。2.输入备忘录标题关键词进行搜索,然后选择需要跳转的备忘录,来完成添加。3.轻点链接即可进行跳转。

Pygame入门指南:全面安装和配置教程 Pygame入门指南:全面安装和配置教程 Feb 19, 2024 pm 10:10 PM

从零开始学习Pygame:完整的安装和配置教程,需要具体代码示例引言:Pygame是一个使用Python编程语言开发的开源游戏开发库,它提供了丰富的功能和工具,使得开发者可以轻松创建各种类型的游戏。本文将带您从零开始学习Pygame,并提供完整的安装和配置教程,以及具体的代码示例,让您快速入门。第一部分:安装Python和Pygame首先,确保您的计算机上已

揭秘C语言的吸引力: 发掘程序员的潜质 揭秘C语言的吸引力: 发掘程序员的潜质 Feb 24, 2024 pm 11:21 PM

学习C语言的魅力:解锁程序员的潜力随着科技的不断发展,计算机编程已经成为了一个备受关注的领域。在众多编程语言中,C语言一直以来都备受程序员的喜爱。它的简单、高效以及广泛应用的特点,使得学习C语言成为了许多人进入编程领域的第一步。本文将讨论学习C语言的魅力,以及如何通过学习C语言来解锁程序员的潜力。首先,学习C语言的魅力在于其简洁性。相比其他编程语言而言,C语

一起学习word根号输入办法 一起学习word根号输入办法 Mar 19, 2024 pm 08:52 PM

在word中编辑文字内容时,有时会需要输入公式符号。有的小伙们不知道在word根号输入的方法,小面就让小编跟小伙伴们一起分享下word根号输入的方法教程。希望对小伙伴们有所帮助。首先,打开电脑上的Word软件,然后打开要编辑的文件,并将光标移动到需要插入根号的位置,参考下方的图片示例。2.选择【插入】,再选择符号里的【公式】。如下方的图片红色圈中部分内容所示:3.接着选择下方的【插入新公式】。如下方的图片红色圈中部分内容所示:4.选择【根式】,再选择合适的根号。如下方的图片红色圈中部分内容所示:

从零开始学习Go语言中的main函数 从零开始学习Go语言中的main函数 Mar 27, 2024 pm 05:03 PM

标题:从零开始学习Go语言中的main函数Go语言作为一种简洁、高效的编程语言,备受开发者青睐。在Go语言中,main函数是一个入口函数,每个Go程序都必须包含main函数作为程序的入口点。本文将从零开始介绍如何学习Go语言中的main函数,并提供具体的代码示例。一、首先,我们需要安装Go语言的开发环境。可以前往官方网站(https://golang.org

快速学会pip安装,从零开始掌握技巧 快速学会pip安装,从零开始掌握技巧 Jan 16, 2024 am 10:30 AM

从零开始学习pip安装,快速掌握技巧,需要具体代码示例概述:pip是Python包管理工具,能够方便地安装、升级和管理Python包。对于Python开发者来说,掌握pip的使用技巧是非常重要的。本文将从零开始介绍pip的安装方法,并给出一些实用的技巧和具体的代码示例,帮助读者快速掌握pip的使用。一、安装pip在使用pip之前,首先需要安装pip。pip的

See all articles