From 2a4643b85b52f2ff55a0017775a48b86236ca6ba Mon Sep 17 00:00:00 2001 From: 997146918 <997146918@qq.com> Date: Sun, 31 Aug 2025 10:43:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=83=8C=E5=8C=85=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E8=B5=84=E6=BA=90=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectFish/DataAsset/BagConfigAsset.cpp | 116 ++++++++++++++++++ .../ProjectFish/DataAsset/BagConfigAsset.h | 102 +++++++++++++++ .../Source/ProjectFish/DataAsset/SkillAsset.h | 3 +- ProjectFish/Source/ProjectFish/Definations.h | 14 ++- 4 files changed, 233 insertions(+), 2 deletions(-) create mode 100644 ProjectFish/Source/ProjectFish/DataAsset/BagConfigAsset.cpp create mode 100644 ProjectFish/Source/ProjectFish/DataAsset/BagConfigAsset.h diff --git a/ProjectFish/Source/ProjectFish/DataAsset/BagConfigAsset.cpp b/ProjectFish/Source/ProjectFish/DataAsset/BagConfigAsset.cpp new file mode 100644 index 0000000..ae125d8 --- /dev/null +++ b/ProjectFish/Source/ProjectFish/DataAsset/BagConfigAsset.cpp @@ -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; +} diff --git a/ProjectFish/Source/ProjectFish/DataAsset/BagConfigAsset.h b/ProjectFish/Source/ProjectFish/DataAsset/BagConfigAsset.h new file mode 100644 index 0000000..a5616aa --- /dev/null +++ b/ProjectFish/Source/ProjectFish/DataAsset/BagConfigAsset.h @@ -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 BagShapeAsset; + + // 背包中放置的技能列表 + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "BagConfig") + TArray 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; +}; diff --git a/ProjectFish/Source/ProjectFish/DataAsset/SkillAsset.h b/ProjectFish/Source/ProjectFish/DataAsset/SkillAsset.h index 326354d..dbb3bcc 100644 --- a/ProjectFish/Source/ProjectFish/DataAsset/SkillAsset.h +++ b/ProjectFish/Source/ProjectFish/DataAsset/SkillAsset.h @@ -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" + /** * */ diff --git a/ProjectFish/Source/ProjectFish/Definations.h b/ProjectFish/Source/ProjectFish/Definations.h index 2f33f3e..8e13715 100644 --- a/ProjectFish/Source/ProjectFish/Definations.h +++ b/ProjectFish/Source/ProjectFish/Definations.h @@ -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 CollisionCameraShakeClass; }; +