Learning C++ by Creating Games With UE4(15.05.18)-1(Chapter 9-1)Coding

来源:互联网 发布:在线制作淘宝商品图片 编辑:程序博客网 时间:2024/06/16 14:53

由于最近腾讯的比赛进入了复赛,所以本来计划从开头翻译就先搁置下来,我们需要迅速把整个虚幻4C++大概的使用方式掌握,这让比较方便我们整个作品的完整性。因此接着第八章我们开始学习第九章

 

Chapter 9 模板和公共使用的容器

 

在第七章中动态内存分配,我们讲到关于你如何去使用动态地分配内存。如果你希望创建一个新的数组而在编译的时候你并不清楚他的大小。那么动态分配内存就是使用这样的形式:

Int * array=new int[number_of_elements]

 

你当然也可以看见动态分配使用new[] 的关键字同时要求你去调用delete[]最后来删除这个数组,否则将会造成内存泄漏。要控制内存是一个困难的工作。

 

这里有一种创建动态空间的大小同时将内存自动使用你的C++来控制吗?这个回答是正确的。这里有很多的C++的对象类型(公共的称作容器)这样可以动态分配内存空间和自动重新分配。UE4提供了一组容器的类型去存储你的数据在动态可重新分配大小的集合中。

 

这里有两个不同的模板容器组。这里是UE4的家庭容器(从 T*)以及C++标准模板函数库中(STL)。这里还有一些和虚幻4不同的容器以及C++STL容器,但是这些不同之处并不是最主要的。UE4容器应用在游戏的表现形式中。C++STL容器也表现的很不错,他们的接口有很强大的支持(可以在API中进行查询)。虽然如此,这还是建议你去使用UE4的容器这样你就不需要考虑化平台的问题当你编译你的代码的时候。

 

 

UE4中输出调试的信息

 

所有在本章节的代码将会指引你如何在UE4中进行工作。例如测试一个TArray,我创建一个基本的代码工程叫做TArrays. 在 AATArraysGameMode::ATArrayGameMode 构造中,我来调试输出去打印一些文本内容在控制台上面。

 

那么下面我们来看如何书写代码:

ATArraysGameMode::ATArraysGameMode(const class FPostConstructInitializeProperties & PCIP) : Super(PCIP)

{

If(GEngine)

{

GEngine->AddOnScreenDebugMessage(0,30.f,FColor::Red,”Hello!”);

}

}

 

如果你编译并且运行这个工程,你将会看见调试的文本在你游戏的左上角当你开始运行游戏的时候,你可使用调试输出看到你的信息。

 

 

 

UE4中的  TArray<T>

 

TArrays UE4的动态数组版本。为了明白什么是TArray<T> 变量,你必须先知道<T>的涵义,他代表存储数据类型数组变量。你想知道什么是int类型的数组吗?那么就可以创建一个TArray<int> 变量。类似其他的类型的话,那么就将你需要的类型写入<>中就可以了。

 

一个使用TArray<T>例子

一个TArray<int>变量仅仅是一个Int的数组。一个  TArray<Player *>变量将会是一个  Player* pointers的数组。一个数组是动态大小可变化的,同时在其创建后很多元素也是可以添加的

 

TArray<int>array;

改变TArray的成员变量需要使用成员函数。这里有一组成员函数你可以在TArry变量中使用,一个是  Add,  添加一个数字进入列表中

 

每个添加进入TArray的元素是以按顺序存储进入。如果你希望插入一个数字进入数组中间,这个也是可以的,array.insert(value,index)的方式,例如insert(9,0)将数字9插入下标为0的位置。

 

这个函数意味着将9插入第一个位置,而将原来数组的所有元素向后移动一位

 

 

迭代在TArray中的应用

 

迭代其实就是我们在编程中经常用到的循环

For(int index=0;index<array.Num();index++)

{

GEngine->AddOnScreenDebugMessage(index,30.f,FColor::Red,FString::FromInt(array[index]));

}

这就是在屏幕上输出这个数组中的所有元素

 

迭代器

你当然也可以使用一个迭代器去工作

 

Int count=0;

For(TArray<int>::TIterator it=array.CreateIterator();it;++it)

{

GEngine->AddOnScreenDebugMessage(count++,30.f,FColor::Red.FString::FromInt(*it));

}

 

迭代器的概念:这是一个外部的对象可以看到整个数组内部的数据。使用++可以将迭代器推向相下一个元素。

 

一个迭代器必须对应一个适合的集合。为了能够获取整个TArray<int>的变量,你需要  一个  TArray<int>::TIterator 类型的迭代器。

 

我们使用(*it)去获得一个整形变量从迭代器之中。这叫做引用。为了引用一个迭代器这意味着需要看到他的数值

 

++it操作代表在该轮循环结束后对迭代器添加一个增量,移动指针指向下一个元素处的列表

 

ATArrayGameMode::ATArrayGameMode(const class FPostConstructInitialProperties& PCIP):Super(PCIP)

{

TArray<int>array;

Array.add(1);

}

 

 

TArray中找到是否存在一个元素

 

Int index=array.Find(10);

 

 

TSet<T>

一个TSet<FString>变量,存储一系列的字符串的变量。这个主要与TArray的区别是TSet不允许重复,所有在TSet中的元素都是独一无二的。而对于TArrat中变量则不会在意其他相同的元素

 

.Add的添加方式与TArrat是一样的,只不过不可以添加同样的数据

 

 

使用TSet进行迭代

 

Int count=0;

For(TSet<Int>::TIterator it=set.CreateIterator();it;++it)

{

GEngine->AddOnCreenDeBugMessage(count++,30.f,FColor::Red,FString::FromInt(*it));

}

 

 

相交的TSet

TSet<int> X;

X.add(1);

X.add(2);

X.add(3);

TSet<int> Y;

Y.add(42);

Y.add(2);

Y.add(32);

TSet<int> common=X.Intersect(Y);  //最终这个相交TSet中就会是2

 

 

并集的  TSet

 

TSet<int> uni=X.Union(Y);//将会获取YX的并集

 

0 0
原创粉丝点击