添加背包配置资源类
This commit is contained in:
parent
9171347f2e
commit
2a4643b85b
116
ProjectFish/Source/ProjectFish/DataAsset/BagConfigAsset.cpp
Normal file
116
ProjectFish/Source/ProjectFish/DataAsset/BagConfigAsset.cpp
Normal 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;
|
||||
}
|
||||
102
ProjectFish/Source/ProjectFish/DataAsset/BagConfigAsset.h
Normal file
102
ProjectFish/Source/ProjectFish/DataAsset/BagConfigAsset.h
Normal 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;
|
||||
};
|
||||
@ -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"
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user