SaveGame->InventoryData.Add(Pair.Key, Pair.Value怎么理解
时间: 2024-05-26 11:13:09 浏览: 10
这段代码是将一个键值对(Pair.Key 和 Pair.Value)添加到 SaveGame->InventoryData 这个 Map 容器中。
具体来说,SaveGame 是一个对象指针,InventoryData 是该对象中的一个 Map 容器,Add() 是 Map 容器的成员函数,用于向 Map 中添加元素。Pair.Key 和 Pair.Value 是一个键值对,它们将作为参数传递给 Add() 函数,从而将它们添加到 Map 容器中。这里的意思是将 Pair.Key 作为 Map 容器中的键,Pair.Value 作为对应的值,添加到 InventoryData 中。
相关问题
当你输入很长的字符串时,会出现缓冲区溢出,在把name覆盖掉的同时,并且会更改gold的值为你的字符串后四位,请修改以下代码来实现:// savegame.c // Compile using gcc -fno-stack-protector savegame.c #include <stdio.h> #include <stdlib.h> #include <string.h> struct hero { unsigned int hp; char name[10]; unsigned int gold; }; void secret_function() { printf("You made it!\n"); return; } struct hero setup_hero() { struct hero h; h.hp = 30; h.gold = 8; scanf("%s", h.name); return h; } int main(int argc, const char *argv[]) { struct hero h = setup_hero(); printf("Name: %s\n", h.name); printf("HP: %d | Gold: %d\n", h.hp, h.gold); return 0; }
为了避免缓冲区溢出,可以使用 fgets() 函数代替 scanf() 函数读取输入。此外,可以使用 strncpy() 函数来复制字符串,以确保不会溢出。修改后的代码如下:
```
// savegame.c
// Compile using gcc -fno-stack-protector savegame.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct hero {
unsigned int hp;
char name[10];
unsigned int gold;
};
void secret_function() {
printf("You made it!\n");
return;
}
struct hero setup_hero() {
struct hero h;
h.hp = 30;
h.gold = 8;
fgets(h.name, 10, stdin);
h.name[strcspn(h.name, "\n")] = '\0'; // Remove newline character from input
strncpy(&h.gold, &h.name[strlen(h.name) - 4], 4); // Copy last 4 characters of input into gold
return h;
}
int main(int argc, const char *argv[]) {
struct hero h = setup_hero();
printf("Name: %s\n", h.name);
printf("HP: %d | Gold: %d\n", h.hp, h.gold);
return 0;
}
```
在新的代码中,我们使用 fgets() 函数读取输入,并且使用 strcspn() 函数来删除输入中的换行符。然后,我们使用 strncpy() 函数将输入的最后四个字符复制到 gold 字段中。这样,即使输入的字符串很长,也不会溢出缓冲区。
UE4 C++ 用SaveGame类写一个异步加载关卡
首先,你需要创建一个继承自`USaveGame`的保存游戏数据的类,并在其中定义需要保存的数据成员。接下来,你需要在异步加载关卡时加载这些数据。
以下是一个简单的示例:
```c++
// MySaveGame.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/SaveGame.h"
#include "MySaveGame.generated.h"
UCLASS()
class UMySaveGame : public USaveGame
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadWrite)
FString LevelName;
};
// MyLevelLoader.h
#pragma once
#include "CoreMinimal.h"
#include "Engine/LevelStreamingDynamic.h"
#include "MySaveGame.h"
#include "MyLevelLoader.generated.h"
UCLASS()
class AMyLevelLoader : public AActor
{
GENERATED_BODY()
public:
AMyLevelLoader();
UFUNCTION(BlueprintCallable)
void LoadLevelAsync(const FString& LevelName);
void LoadLevelAsync_Internal(const FString& LevelName);
UFUNCTION()
void OnLevelLoaded();
private:
UPROPERTY()
ULevelStreamingDynamic* StreamingLevel;
UPROPERTY()
UMySaveGame* SaveGame;
};
// MyLevelLoader.cpp
#include "MyLevelLoader.h"
#include "Kismet/GameplayStatics.h"
#include "Engine/World.h"
AMyLevelLoader::AMyLevelLoader()
{
PrimaryActorTick.bCanEverTick = false;
StreamingLevel = NewObject<ULevelStreamingDynamic>(this, ULevelStreamingDynamic::StaticClass());
StreamingLevel->bShouldBeLoaded = false;
StreamingLevel->bShouldBeVisible = false;
}
void AMyLevelLoader::LoadLevelAsync(const FString& LevelName)
{
SaveGame = Cast<UMySaveGame>(UGameplayStatics::CreateSaveGameObject(UMySaveGame::StaticClass()));
if (SaveGame != nullptr)
{
SaveGame->LevelName = LevelName;
SaveGame->SaveAsync(0);
}
FStreamableManager& Streamable = UAssetManager::GetStreamableManager();
Streamable.RequestLevel(StreamingLevel->GetWorldAssetPackageFName(LevelName), FStreamableDelegate::CreateUObject(this, &AMyLevelLoader::LoadLevelAsync_Internal, LevelName));
}
void AMyLevelLoader::LoadLevelAsync_Internal(const FString& LevelName)
{
StreamingLevel->SetWorldAssetByPackageName(LevelName);
StreamingLevel->bShouldBeLoaded = true;
UWorld* World = GetWorld();
if (World != nullptr)
{
StreamingLevel->LevelColor = FColor::MakeRandomColor();
StreamingLevel->LevelTransform = FTransform(FRotator::ZeroRotator, FVector(0.f, 0.f, 0.f), FVector(1.f, 1.f, 1.f));
World->AddLevelStreamingActor(StreamingLevel, GetActorTransform());
}
}
void AMyLevelLoader::OnLevelLoaded()
{
if (SaveGame != nullptr)
{
FString LevelName = SaveGame->LevelName;
SaveGame->Delete();
SaveGame = nullptr;
// Do something with the loaded level...
}
}
```
在上面的示例中,`UMySaveGame`保存了需要在异步加载关卡时加载的数据成员。`AMyLevelLoader`是一个继承自`AActor`的类,它有一个`LoadLevelAsync`函数,它会异步加载指定名称的关卡,并在加载完成后调用`OnLevelLoaded`函数。在`LoadLevelAsync_Internal`函数中,我们使用`ULevelStreamingDynamic`类来加载关卡,并在加载完成后将其添加到世界中。在`OnLevelLoaded`函数中,我们可以获取保存在`UMySaveGame`对象中的数据成员,并进行后续操作。
请注意,以上示例仅用于演示目的,实际使用时可能需要进行更多的错误处理和数据验证。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)