Compare commits

..

No commits in common. "a963437069112e0ebf9d8ddd64e76b06ed930365" and "7aac1a15441f856a45de98c6b20b9c480a889795" have entirely different histories.

27 changed files with 56 additions and 131 deletions

Binary file not shown.

View File

@ -3,12 +3,36 @@
#include "ContainerInfo.h" #include "ContainerInfo.h"
#include "IDetailTreeNode.h"
#include "PlayerInfoSaveGame.h" #include "PlayerInfoSaveGame.h"
#include "Chaos/PBDRigidClusteringAlgo.h"
#include "Engine/AssetManager.h" #include "Engine/AssetManager.h"
#include "Engine/StreamableManager.h" #include "Engine/StreamableManager.h"
// void UContainerInfo::InitContainer(FPrimaryAssetId ContainerShapeId)
// {
// //加载形状资源
// TSharedPtr<FStreamableHandle> LoadHandle = GEngine->AssetManager->LoadPrimaryAsset(ContainerShapeId);
// if (LoadHandle.IsValid())
// {
// // 等待加载完成,这会阻塞线程
// LoadHandle->WaitUntilComplete();
//
// // 加载完成后,通过句柄获取资源
// UObject* LoadedObject = LoadHandle->GetLoadedAsset();
// if (LoadedObject)
// {
// ContainerShape = Cast<UShapeAsset>(LoadedObject);
// for (int x = 0; x < ContainerShape->GetShapeWidth(); x++)
// {
// for (int y = 0; y < ContainerShape->GetShapeHeight(); y++)
// {
// SlotInUsing.Add(FIntPoint(x, y), false);
// }
// }
// }
// LoadHandle->ReleaseHandle();
// }
//
// }
void UContainerInfo::InitContainerByShape(UShapeAsset* InContainerShape) void UContainerInfo::InitContainerByShape(UShapeAsset* InContainerShape)
{ {
@ -22,19 +46,18 @@ void UContainerInfo::InitContainerByShape(UShapeAsset* InContainerShape)
} }
} }
bool UContainerInfo::AddContainerItem(FContainerItem Item, int32& ItemID) bool UContainerInfo::AddContainerItem(FContainerItem Item, FIntPoint Position)
{ {
if (IsItemInContainerShape(Item)) if (IsItemInContainerShape(Item, Position))
{ {
return false; return false;
} }
if (IsItemOverlapOtherItem(Item)) if (IsItemOverlapOtherItem(Item, Position))
{ {
return false; return false;
} }
ItemID = NextItemID;
Items.Add(NextItemID, Item); Items.Add(Position, Item);
++NextItemID;
//设置容器指定位置的占用状态 //设置容器指定位置的占用状态
for (int x = 0; x < Item.GetItemWIdth(); x++) for (int x = 0; x < Item.GetItemWIdth(); x++)
{ {
@ -42,46 +65,25 @@ bool UContainerInfo::AddContainerItem(FContainerItem Item, int32& ItemID)
{ {
if (Item.IsSlotUsing(FIntPoint(x, y))) if (Item.IsSlotUsing(FIntPoint(x, y)))
{ {
SlotInUsing.Add(FIntPoint(x + Item.ContainerStartPos.X, y + Item.ContainerStartPos.Y), true); SlotInUsing.Add(FIntPoint(x + Position.X, y + Position.Y), true);
} }
} }
} }
return true; return true;
} }
bool UContainerInfo::RemoveContainerItem(const int32& ItemID) bool UContainerInfo::IsItemOverlapOtherItem(FContainerItem NewItem, FIntPoint Position)
{
if (Items.Contains(ItemID))
{
FContainerItem Item = Items[ItemID];
for (int x = 0; x < Item.GetItemWIdth(); x++)
{
for (int y = 0; y < Item.GetItemHeight(); y++)
{
if (Item.IsSlotUsing(FIntPoint(x + Item.ContainerStartPos.X, y + Item.ContainerStartPos.Y)))
{
SlotInUsing[FIntPoint(x + Item.ContainerStartPos.X, y + Item.ContainerStartPos.Y)] = false;
}
}
}
Items.Remove(ItemID);
return true;
}
return false;
}
bool UContainerInfo::IsItemOverlapOtherItem(FContainerItem NewItem)
{ {
for (int x = 0; x < NewItem.GetItemWIdth(); x++) for (int x = 0; x < NewItem.GetItemWIdth(); x++)
{ {
for (int y = 0; y < NewItem.GetItemHeight(); y++) for (int y = 0; y < NewItem.GetItemHeight(); y++)
{ {
if (NewItem.IsSlotUsing(FIntPoint(x, y))) if (NewItem.IsSlotUsing(Position))
{ {
if (!ContainerShape->IsSlotActive(NewItem.ContainerStartPos.X + x, NewItem.ContainerStartPos.Y + y) || if (!ContainerShape->IsSlotActive(Position.X + x, Position.Y + y) ||
SlotInUsing[FIntPoint(x + NewItem.ContainerStartPos.X, y + NewItem.ContainerStartPos.Y)]) SlotInUsing[FIntPoint(x + Position.X, y + Position.Y)])
{ {
return true; return true;
} }
@ -92,17 +94,17 @@ bool UContainerInfo::IsItemOverlapOtherItem(FContainerItem NewItem)
return false; return false;
} }
bool UContainerInfo::IsItemInContainerShape(FContainerItem NewItem) bool UContainerInfo::IsItemInContainerShape(FContainerItem NewItem, FIntPoint Position)
{ {
for (int x = 0; x < NewItem.GetItemWIdth(); x++) for (int x = 0; x < NewItem.GetItemWIdth(); x++)
{ {
for (int y = 0; y < NewItem.GetItemHeight(); y++) for (int y = 0; y < NewItem.GetItemHeight(); y++)
{ {
if ( (x + NewItem.ContainerStartPos.X) > 0 && (x + NewItem.ContainerStartPos.X) < ContainerShape->GetShapeWidth() && if ( (x + Position.X) > 0 && (x + Position.X) < ContainerShape->GetShapeWidth() &&
(y + NewItem.ContainerStartPos.Y) > 0 && (y + NewItem.ContainerStartPos.Y) < ContainerShape->GetShapeHeight() (y + Position.Y) > 0 && (y + Position.Y) < ContainerShape->GetShapeHeight()
) )
{ {
if (!ContainerShape->IsSlotActive(NewItem.ContainerStartPos.X + x, NewItem.ContainerStartPos.Y + y)) if (!ContainerShape->IsSlotActive(Position.X + x, Position.Y + y))
{ {
return false; return false;
} }
@ -123,8 +125,8 @@ TArray<FContainerItemSaveData> UContainerInfo::GetSaveData() const
for (const auto& ItemPair : Items) for (const auto& ItemPair : Items)
{ {
FContainerItemSaveData SaveData; FContainerItemSaveData SaveData;
SaveData.PosX = ItemPair.Value.ContainerStartPos.X; SaveData.PosX = ItemPair.Key.X;
SaveData.PosY = ItemPair.Value.ContainerStartPos.Y; SaveData.PosY = ItemPair.Key.Y;
SaveData.DegreeType = ItemPair.Value.DegreeType; SaveData.DegreeType = ItemPair.Value.DegreeType;
if (ItemPair.Value.RewardItem) if (ItemPair.Value.RewardItem)
@ -138,71 +140,28 @@ TArray<FContainerItemSaveData> UContainerInfo::GetSaveData() const
return SaveDataArray; return SaveDataArray;
} }
bool UContainerInfo::LoadFromSaveData(FPrimaryAssetId ShapeID, const TArray<FContainerItemSaveData>& ContainerItems) void UContainerInfo::LoadFromSaveData(UPlayerInfoSaveGame* SaveGameData)
{ {
// 清空当前数据 // 清空当前数据
Items.Empty(); Items.Empty();
SlotInUsing.Empty(); SlotInUsing.Empty();
//从存档中加载仓库形状 //从存档中加载仓库形状
FSoftObjectPath ShipShapePath = UAssetManager::Get().GetPrimaryAssetPath(ShapeID); if (IsValid(SaveGameData))
UShapeAsset* ShapeAsset = Cast<UShapeAsset>(ShipShapePath.TryLoad());
if (!IsValid(ShapeAsset))
{ {
return false; FSoftObjectPath ShipShapePath = UAssetManager::Get().GetPrimaryAssetPath(SaveGameData->ShipContainerShapeID);
} InitContainerByShape(Cast<UShapeAsset>(ShipShapePath.TryLoad()));
InitContainerByShape(ShapeAsset); ;}
// 获得仓库中的物品信息 // 获得仓库中的物品信息
TArray<FPrimaryAssetId> AssetsToLoad; TArray<FPrimaryAssetId> AssetsToLoad;
for (const FContainerItemSaveData& ItemData : ContainerItems) for (const FContainerItemSaveData& ItemData : SaveGameData->ShipContainerItems)
{ {
FContainerItem NewItem; FContainerItem NewItem;
NewItem.ContainerStartPos = FIntPoint(ItemData.PosX, ItemData.PosY);
NewItem.DegreeType = ItemData.DegreeType; NewItem.DegreeType = ItemData.DegreeType;
//获得物品形状 //获得物品形状
FSoftObjectPath RewardItemPath = UAssetManager::Get().GetPrimaryAssetPath(ItemData.RewardItemAssetId); FSoftObjectPath RewardItemPath = UAssetManager::Get().GetPrimaryAssetPath(ItemData.RewardItemAssetId);
NewItem.RewardItem = Cast<UFishingRewardDataAsset>(RewardItemPath.TryLoad()); NewItem.RewardItem = Cast<UFishingRewardDataAsset>(RewardItemPath.TryLoad());
//添加物品到容器中 //添加物品到容器中
FIntPoint Position(ItemData.PosX, ItemData.PosY); FIntPoint Position(ItemData.PosX, ItemData.PosY);
int32 ItemID; AddContainerItem(NewItem, Position);
AddContainerItem(NewItem, ItemID);
} }
return true;
} }
// bool UContainerInfo::LoadFromSaveData(UPlayerInfoSaveGame* SaveGameData)
// {
// // 清空当前数据
// Items.Empty();
// SlotInUsing.Empty();
// //从存档中加载仓库形状
// if (IsValid(SaveGameData))
// {
// FSoftObjectPath ShipShapePath = UAssetManager::Get().GetPrimaryAssetPath(SaveGameData->ShipContainerShapeID);
// UShapeAsset* ShapeAsset = Cast<UShapeAsset>(ShipShapePath.TryLoad());
// if (!IsValid(ShapeAsset))
// {
// return false;
// }
// InitContainerByShape(ShapeAsset);
// // 获得仓库中的物品信息
// TArray<FPrimaryAssetId> AssetsToLoad;
// for (const FContainerItemSaveData& ItemData : SaveGameData->ShipContainerItems)
// {
// FContainerItem NewItem;
// NewItem.DegreeType = ItemData.DegreeType;
// //获得物品形状
// FSoftObjectPath RewardItemPath = UAssetManager::Get().GetPrimaryAssetPath(ItemData.RewardItemAssetId);
// NewItem.RewardItem = Cast<UFishingRewardDataAsset>(RewardItemPath.TryLoad());
// //添加物品到容器中
// FIntPoint Position(ItemData.PosX, ItemData.PosY);
// AddContainerItem(NewItem, Position);
// }
// }
// else
// {
// return false;
// }
//
// return true;
// }

View File

@ -44,8 +44,6 @@ struct FContainerItem
{ {
GENERATED_BODY() GENERATED_BODY()
public: public:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FIntPoint ContainerStartPos;
UPROPERTY(EditAnywhere, BlueprintReadWrite) UPROPERTY(EditAnywhere, BlueprintReadWrite)
EItemDegreeType DegreeType; EItemDegreeType DegreeType;
UPROPERTY(EditAnywhere, BlueprintReadWrite) UPROPERTY(EditAnywhere, BlueprintReadWrite)
@ -112,34 +110,28 @@ public:
void InitContainerByShape(UShapeAsset* InContainerShape); void InitContainerByShape(UShapeAsset* InContainerShape);
UFUNCTION(BlueprintPure) UFUNCTION(BlueprintPure)
bool AddContainerItem(FContainerItem Item, int32& ItemID); bool AddContainerItem(FContainerItem Item, FIntPoint Position);
UFUNCTION(BlueprintPure)
bool RemoveContainerItem(const int32& ItemID);
// 获取存档数据 // 获取存档数据
UFUNCTION(BlueprintCallable, Category = "ContainerInfo") UFUNCTION(BlueprintCallable, Category = "ContainerInfo")
TArray<FContainerItemSaveData> GetSaveData() const; TArray<FContainerItemSaveData> GetSaveData() const;
// 从存档数据加载 // 从存档数据加载
// UFUNCTION(BlueprintCallable, Category = "ContainerInfo")
// bool LoadFromSaveData(UPlayerInfoSaveGame* SaveGameData);
UFUNCTION(BlueprintCallable, Category = "ContainerInfo") UFUNCTION(BlueprintCallable, Category = "ContainerInfo")
bool LoadFromSaveData(FPrimaryAssetId ShapeID, const TArray<FContainerItemSaveData>& ContainerItems); void LoadFromSaveData(UPlayerInfoSaveGame* SaveGameData);
private: private:
//要添加的物品是否会覆盖其他物品 //要添加的物品是否会覆盖其他物品
bool IsItemOverlapOtherItem(FContainerItem Item); bool IsItemOverlapOtherItem(FContainerItem Item, FIntPoint Position);
//要添加的物品是否在容器范围内 //要添加的物品是否在容器范围内
bool IsItemInContainerShape(FContainerItem Item); bool IsItemInContainerShape(FContainerItem Item, FIntPoint Position);
public: public:
UPROPERTY(EditAnywhere, BlueprintReadWrite) UPROPERTY(EditAnywhere, BlueprintReadWrite)
TMap<int32, FContainerItem> Items; TMap<FIntPoint, FContainerItem> Items;
UPROPERTY(EditAnywhere, BlueprintReadWrite) UPROPERTY(EditAnywhere, BlueprintReadWrite)
UShapeAsset* ContainerShape; UShapeAsset* ContainerShape;
private: private:
int32 NextItemID = 0;
TMap<FIntPoint, bool> SlotInUsing; TMap<FIntPoint, bool> SlotInUsing;
}; };

View File

@ -44,33 +44,10 @@ bool UGameInfoManager::LoadGameInfo()
return false; return false;
} }
void UGameInfoManager::CreateGameInfo(UContainerInfo* ShipContainer, UContainerInfo* PlayerContainer) void UGameInfoManager::CreateGameInfo(UContainerInfo* ShipContainer)
{ {
PlayerInfo = NewObject<UPlayerInfoSaveGame>(this); PlayerInfo = NewObject<UPlayerInfoSaveGame>(this);
PlayerInfo->ShipContainerItems = ShipContainer->GetSaveData(); PlayerInfo->ShipContainerItems = ShipContainer->GetSaveData();
PlayerInfo->ShipContainerShapeID = ShipContainer->ContainerShape->GetPrimaryAssetId(); PlayerInfo->ShipContainerShapeID = ShipContainer->ContainerShape->GetPrimaryAssetId();
PlayerInfo->PlayerContainerItems = PlayerContainer->GetSaveData();
PlayerInfo->PlayerContainerShapeID = PlayerContainer->ContainerShape->GetPrimaryAssetId();
SaveGameInfo();
}
void UGameInfoManager::CreateGameInfoAndSave(UShapeAsset* ShipContainerShape, UShapeAsset* PlayerContainerShape)
{
//创建仓库信息
UContainerInfo* ShipContainer = NewObject<UContainerInfo>();
ShipContainer->InitContainerByShape(ShipContainerShape);
UContainerInfo* PlayerContainer = NewObject<UContainerInfo>();
PlayerContainer->InitContainerByShape(PlayerContainerShape);
//创建要保存的额存档信息
PlayerInfo = NewObject<UPlayerInfoSaveGame>(this);
PlayerInfo->ShipContainerItems = ShipContainer->GetSaveData();
PlayerInfo->ShipContainerShapeID = ShipContainer->ContainerShape->GetPrimaryAssetId();
PlayerInfo->PlayerContainerItems = PlayerContainer->GetSaveData();
PlayerInfo->PlayerContainerShapeID = PlayerContainer->ContainerShape->GetPrimaryAssetId();
SaveGameInfo(); SaveGameInfo();
} }

View File

@ -23,10 +23,7 @@ protected:
UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable)
bool LoadGameInfo(); bool LoadGameInfo();
UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable)
void CreateGameInfo(UContainerInfo* ShipContainer, UContainerInfo* PlayerContainer); void CreateGameInfo(UContainerInfo* ShipContainer);
UFUNCTION(BlueprintCallable)
void CreateGameInfoAndSave(UShapeAsset* ShipContainerShape, UShapeAsset* PlayerContainerShape);
protected: protected:
UPROPERTY(BlueprintReadOnly) UPROPERTY(BlueprintReadOnly)
TObjectPtr<class UPlayerInfoSaveGame> PlayerInfo; TObjectPtr<class UPlayerInfoSaveGame> PlayerInfo;