Compare commits

...

11 Commits

Author SHA1 Message Date
a963437069 修复显示bug 2025-10-22 19:38:46 +08:00
8106645812 调整舱位容器结构 2025-10-22 19:31:01 +08:00
e3dd0f022f 更新仓库UI 2025-10-22 17:50:03 +08:00
f2b7dc65dd 添加鱼市UI 2025-10-22 10:03:28 +08:00
1d294c5ee6 添加鱼市UI window 2025-10-21 19:36:45 +08:00
427bede723 添加仓库UI 2025-10-21 19:33:48 +08:00
905e881cab 添加鱼获ui背景颜色 2025-10-21 17:17:43 +08:00
86c87dbe64 Merge branch 'dev' 2025-10-21 10:04:25 +08:00
d902bb9255 更新ignore文件 2025-10-14 15:41:17 +08:00
2cd0504023 Merge branch 'main' of http://www.ntopia-tech.com:30000/admin/Project02
# Conflicts:
#	ProjectFish/Release/Windows/Manifest_NonUFSFiles_Win64.txt
#	ProjectFish/Release/Windows/Manifest_UFSFiles_Win64.txt
#	ProjectFish/Release/Windows/ProjectFish/Content/Paks/ProjectFish-Windows.pak
#	ProjectFish/Release/Windows/ProjectFish/Content/Paks/ProjectFish-Windows.ucas
#	ProjectFish/Release/Windows/ProjectFish/Content/Paks/ProjectFish-Windows.utoc
2025-10-14 11:56:52 +08:00
248bffdc34 添加打包后的文件 2025-10-14 11:54:23 +08:00
27 changed files with 131 additions and 56 deletions

Binary file not shown.

Binary file not shown.

View File

@ -3,36 +3,12 @@
#include "ContainerInfo.h"
#include "IDetailTreeNode.h"
#include "PlayerInfoSaveGame.h"
#include "Chaos/PBDRigidClusteringAlgo.h"
#include "Engine/AssetManager.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)
{
@ -46,18 +22,19 @@ void UContainerInfo::InitContainerByShape(UShapeAsset* InContainerShape)
}
}
bool UContainerInfo::AddContainerItem(FContainerItem Item, FIntPoint Position)
bool UContainerInfo::AddContainerItem(FContainerItem Item, int32& ItemID)
{
if (IsItemInContainerShape(Item, Position))
if (IsItemInContainerShape(Item))
{
return false;
}
if (IsItemOverlapOtherItem(Item, Position))
if (IsItemOverlapOtherItem(Item))
{
return false;
}
Items.Add(Position, Item);
ItemID = NextItemID;
Items.Add(NextItemID, Item);
++NextItemID;
//设置容器指定位置的占用状态
for (int x = 0; x < Item.GetItemWIdth(); x++)
{
@ -65,25 +42,46 @@ bool UContainerInfo::AddContainerItem(FContainerItem Item, FIntPoint Position)
{
if (Item.IsSlotUsing(FIntPoint(x, y)))
{
SlotInUsing.Add(FIntPoint(x + Position.X, y + Position.Y), true);
SlotInUsing.Add(FIntPoint(x + Item.ContainerStartPos.X, y + Item.ContainerStartPos.Y), true);
}
}
}
return true;
}
bool UContainerInfo::IsItemOverlapOtherItem(FContainerItem NewItem, FIntPoint Position)
bool UContainerInfo::RemoveContainerItem(const int32& ItemID)
{
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 y = 0; y < NewItem.GetItemHeight(); y++)
{
if (NewItem.IsSlotUsing(Position))
if (NewItem.IsSlotUsing(FIntPoint(x, y)))
{
if (!ContainerShape->IsSlotActive(Position.X + x, Position.Y + y) ||
SlotInUsing[FIntPoint(x + Position.X, y + Position.Y)])
if (!ContainerShape->IsSlotActive(NewItem.ContainerStartPos.X + x, NewItem.ContainerStartPos.Y + y) ||
SlotInUsing[FIntPoint(x + NewItem.ContainerStartPos.X, y + NewItem.ContainerStartPos.Y)])
{
return true;
}
@ -94,17 +92,17 @@ bool UContainerInfo::IsItemOverlapOtherItem(FContainerItem NewItem, FIntPoint Po
return false;
}
bool UContainerInfo::IsItemInContainerShape(FContainerItem NewItem, FIntPoint Position)
bool UContainerInfo::IsItemInContainerShape(FContainerItem NewItem)
{
for (int x = 0; x < NewItem.GetItemWIdth(); x++)
{
for (int y = 0; y < NewItem.GetItemHeight(); y++)
{
if ( (x + Position.X) > 0 && (x + Position.X) < ContainerShape->GetShapeWidth() &&
(y + Position.Y) > 0 && (y + Position.Y) < ContainerShape->GetShapeHeight()
if ( (x + NewItem.ContainerStartPos.X) > 0 && (x + NewItem.ContainerStartPos.X) < ContainerShape->GetShapeWidth() &&
(y + NewItem.ContainerStartPos.Y) > 0 && (y + NewItem.ContainerStartPos.Y) < ContainerShape->GetShapeHeight()
)
{
if (!ContainerShape->IsSlotActive(Position.X + x, Position.Y + y))
if (!ContainerShape->IsSlotActive(NewItem.ContainerStartPos.X + x, NewItem.ContainerStartPos.Y + y))
{
return false;
}
@ -125,8 +123,8 @@ TArray<FContainerItemSaveData> UContainerInfo::GetSaveData() const
for (const auto& ItemPair : Items)
{
FContainerItemSaveData SaveData;
SaveData.PosX = ItemPair.Key.X;
SaveData.PosY = ItemPair.Key.Y;
SaveData.PosX = ItemPair.Value.ContainerStartPos.X;
SaveData.PosY = ItemPair.Value.ContainerStartPos.Y;
SaveData.DegreeType = ItemPair.Value.DegreeType;
if (ItemPair.Value.RewardItem)
@ -140,28 +138,71 @@ TArray<FContainerItemSaveData> UContainerInfo::GetSaveData() const
return SaveDataArray;
}
void UContainerInfo::LoadFromSaveData(UPlayerInfoSaveGame* SaveGameData)
bool UContainerInfo::LoadFromSaveData(FPrimaryAssetId ShapeID, const TArray<FContainerItemSaveData>& ContainerItems)
{
// 清空当前数据
Items.Empty();
SlotInUsing.Empty();
//从存档中加载仓库形状
if (IsValid(SaveGameData))
FSoftObjectPath ShipShapePath = UAssetManager::Get().GetPrimaryAssetPath(ShapeID);
UShapeAsset* ShapeAsset = Cast<UShapeAsset>(ShipShapePath.TryLoad());
if (!IsValid(ShapeAsset))
{
FSoftObjectPath ShipShapePath = UAssetManager::Get().GetPrimaryAssetPath(SaveGameData->ShipContainerShapeID);
InitContainerByShape(Cast<UShapeAsset>(ShipShapePath.TryLoad()));
;}
return false;
}
InitContainerByShape(ShapeAsset);
// 获得仓库中的物品信息
TArray<FPrimaryAssetId> AssetsToLoad;
for (const FContainerItemSaveData& ItemData : SaveGameData->ShipContainerItems)
for (const FContainerItemSaveData& ItemData : ContainerItems)
{
FContainerItem NewItem;
NewItem.ContainerStartPos = FIntPoint(ItemData.PosX, ItemData.PosY);
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);
int32 ItemID;
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,6 +44,8 @@ struct FContainerItem
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FIntPoint ContainerStartPos;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
EItemDegreeType DegreeType;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
@ -110,28 +112,34 @@ public:
void InitContainerByShape(UShapeAsset* InContainerShape);
UFUNCTION(BlueprintPure)
bool AddContainerItem(FContainerItem Item, FIntPoint Position);
bool AddContainerItem(FContainerItem Item, int32& ItemID);
UFUNCTION(BlueprintPure)
bool RemoveContainerItem(const int32& ItemID);
// 获取存档数据
UFUNCTION(BlueprintCallable, Category = "ContainerInfo")
TArray<FContainerItemSaveData> GetSaveData() const;
// 从存档数据加载
// UFUNCTION(BlueprintCallable, Category = "ContainerInfo")
// bool LoadFromSaveData(UPlayerInfoSaveGame* SaveGameData);
UFUNCTION(BlueprintCallable, Category = "ContainerInfo")
void LoadFromSaveData(UPlayerInfoSaveGame* SaveGameData);
bool LoadFromSaveData(FPrimaryAssetId ShapeID, const TArray<FContainerItemSaveData>& ContainerItems);
private:
//要添加的物品是否会覆盖其他物品
bool IsItemOverlapOtherItem(FContainerItem Item, FIntPoint Position);
bool IsItemOverlapOtherItem(FContainerItem Item);
//要添加的物品是否在容器范围内
bool IsItemInContainerShape(FContainerItem Item, FIntPoint Position);
bool IsItemInContainerShape(FContainerItem Item);
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
TMap<FIntPoint, FContainerItem> Items;
TMap<int32, FContainerItem> Items;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
UShapeAsset* ContainerShape;
private:
int32 NextItemID = 0;
TMap<FIntPoint, bool> SlotInUsing;
};

View File

@ -44,10 +44,33 @@ bool UGameInfoManager::LoadGameInfo()
return false;
}
void UGameInfoManager::CreateGameInfo(UContainerInfo* ShipContainer)
void UGameInfoManager::CreateGameInfo(UContainerInfo* ShipContainer, UContainerInfo* PlayerContainer)
{
PlayerInfo = NewObject<UPlayerInfoSaveGame>(this);
PlayerInfo->ShipContainerItems = ShipContainer->GetSaveData();
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();
}

View File

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