添加背包配置资源类

This commit is contained in:
997146918 2025-08-31 10:43:05 +08:00
parent 9171347f2e
commit 2a4643b85b
4 changed files with 233 additions and 2 deletions

View File

@ -0,0 +1,116 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "BagConfigAsset.h"
#include "BagShapeAsset.h"
bool UBagConfigAsset::AddSkill(USkillAsset* SkillObject, int32 PositionX, int32 PositionY)
{
if (!SkillObject || !CanPlaceSkill(SkillObject, PositionX, PositionY))
{
return false;
}
PlacedSkills.Add(FPlacedSkillInfo(SkillObject, PositionX, PositionY));
return true;
}
bool UBagConfigAsset::RemoveSkill(int32 SkillIndex)
{
if (SkillIndex < 0 || SkillIndex >= PlacedSkills.Num())
{
return false;
}
PlacedSkills.RemoveAt(SkillIndex);
return true;
}
bool UBagConfigAsset::CanPlaceSkill(USkillAsset* SkillObject, int32 PositionX, int32 PositionY) const
{
if (!SkillObject || !BagShapeAsset)
{
return false;
}
if (!IsSkillWithinBagShape(SkillObject, PositionX, PositionY))
{
return false;
}
if (CheckSkillOverlap(SkillObject, PositionX, PositionY))
{
return false;
}
return true;
}
int32 UBagConfigAsset::GetSkillAtPosition(int32 X, int32 Y) const
{
for (int32 i = 0; i < PlacedSkills.Num(); i++)
{
if (PlacedSkills[i].OccupiesPosition(X, Y))
{
return i;
}
}
return -1;
}
void UBagConfigAsset::ClearAllSkills()
{
PlacedSkills.Empty();
}
bool UBagConfigAsset::CheckSkillOverlap(USkillAsset* SkillObject, int32 PositionX, int32 PositionY) const
{
if (!SkillObject)
{
return false;
}
for (int32 i = 0; i < PlacedSkills.Num(); i++)
{
const FPlacedSkillInfo& ExistingSkill = PlacedSkills[i];
if (!ExistingSkill.SkillAsset)
{
continue;
}
// 检查矩形重叠
if (!(PositionX >= ExistingSkill.PositionX + GetSkillSizeValue(ExistingSkill.SkillAsset->SkillSize).X ||
PositionX + GetSkillSizeValue(SkillObject->SkillSize).X <= ExistingSkill.PositionX ||
PositionY >= ExistingSkill.PositionY + GetSkillSizeValue(ExistingSkill.SkillAsset->SkillSize).Y ||
PositionY + GetSkillSizeValue(SkillObject->SkillSize).Y <= ExistingSkill.PositionY))
{
return true; // 有重叠
}
}
return false; // 无重叠
}
bool UBagConfigAsset::IsSkillWithinBagShape(USkillAsset* SkillObject, int32 PositionX, int32 PositionY) const
{
if (!BagShapeAsset || !SkillObject)
{
return false;
}
// 检查技能占用的所有格子是否都在激活的背包形状内
for (int32 X = PositionX; X < PositionX + GetSkillSizeValue(SkillObject->SkillSize).X; X++)
{
for (int32 Y = PositionY; Y < PositionY + GetSkillSizeValue(SkillObject->SkillSize).Y; Y++)
{
if (!BagShapeAsset->IsSlotActive(X, Y))
{
return false;
}
}
}
return true;
}

View File

@ -0,0 +1,102 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Engine/DataAsset.h"
#include "ProjectFish/Definations.h"
#include "SkillAsset.h"
#include "BagConfigAsset.generated.h"
class UBagShapeAsset;
//背包中摆放的技能信息
USTRUCT(BlueprintType)
struct FPlacedSkillInfo
{
GENERATED_BODY()
// 技能对象引用
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Placed Skill")
TObjectPtr< USkillAsset> SkillAsset;
// 技能在背包中的位置X
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Placed Skill Position")
int32 PositionX;
// 技能在背包中的位置Y
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Placed Skill Position")
int32 PositionY;
FPlacedSkillInfo()
{
SkillAsset = nullptr;
PositionX = 0;
PositionY = 0;
}
FPlacedSkillInfo(USkillAsset* InSkillAsset, int32 InX, int32 InY)
{
SkillAsset = InSkillAsset;
PositionX = InX;
PositionY = InY;
}
// 检查技能是否占用指定位置
bool OccupiesPosition(int32 X, int32 Y) const
{
if (!SkillAsset)
{
return false;
}
return X >= PositionX && X < (PositionX + GetSkillSizeValue(SkillAsset->SkillSize).X) &&
Y >= PositionY && Y < (PositionY + GetSkillSizeValue(SkillAsset->SkillSize).Y);
}
};
/**
*
*/
UCLASS()
class PROJECTFISH_API UBagConfigAsset : public UDataAsset
{
GENERATED_BODY()
public:
// 背包形状资源引用
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "BagConfig")
TObjectPtr<UBagShapeAsset> BagShapeAsset;
// 背包中放置的技能列表
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "BagConfig")
TArray<FPlacedSkillInfo> PlacedSkills;
// 添加技能到背包
UFUNCTION(BlueprintCallable, Category = "BagConfig")
bool AddSkill(USkillAsset* SkillObject, int32 PositionX, int32 PositionY);
// 移除技能
UFUNCTION(BlueprintCallable, Category = "BagConfig")
bool RemoveSkill(int32 SkillIndex);
// 检查技能是否可以放置在指定位置
UFUNCTION(BlueprintCallable, Category = "BagConfig")
bool CanPlaceSkill(USkillAsset* SkillObject, int32 PositionX, int32 PositionY) const;
// 获取指定位置的技能索引
UFUNCTION(BlueprintCallable, Category = "BagConfig")
int32 GetSkillAtPosition(int32 X, int32 Y) const;
// 获取技能总数
UFUNCTION(BlueprintCallable, Category = "BagConfig")
int32 GetSkillCount() const { return PlacedSkills.Num(); }
// 清除所有技能
UFUNCTION(BlueprintCallable, Category = "BagConfig")
void ClearAllSkills();
private:
// 检查技能之间是否有重叠
bool CheckSkillOverlap(USkillAsset* SkillObject, int32 PositionX, int32 PositionY) const;
// 检查技能是否在背包形状范围内
bool IsSkillWithinBagShape(USkillAsset* SkillObject, int32 PositionX, int32 PositionY) const;
};

View File

@ -5,9 +5,10 @@
#include "CoreMinimal.h"
#include "GameplayTagContainer.h"
#include "Engine/DataAsset.h"
#include "ProjectFish/Definations.h"
#include "../Definations.h"
#include "SkillAsset.generated.h"
/**
*
*/

View File

@ -55,10 +55,21 @@ UENUM(BlueprintType)
enum class ESkillSize: uint8
{
Small UMETA(DisplayName = "", ToolTip = "技能占用格子 2x2"),
Middle UMETA(DisplayName = "", ToolTip = "技能占用格子 3x2"),
Medium UMETA(DisplayName = "", ToolTip = "技能占用格子 3x2"),
Large UMETA(DisplayName = "", ToolTip = "技能占用格子 4x2"),
};
static FIntPoint GetSkillSizeValue(ESkillSize SizeType)
{
switch (SizeType)
{
case ESkillSize::Small: return FIntPoint(2, 2);
case ESkillSize::Medium: return FIntPoint(3, 2);
case ESkillSize::Large: return FIntPoint(4, 2);
}
return FIntPoint();
}
USTRUCT(BlueprintType)
struct FSkillContext
{
@ -290,3 +301,4 @@ struct FShipDataConfig
TSubclassOf<UCameraShakeBase> CollisionCameraShakeClass;
};