添加背包配置资源类
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 "CoreMinimal.h"
|
||||||
#include "GameplayTagContainer.h"
|
#include "GameplayTagContainer.h"
|
||||||
#include "Engine/DataAsset.h"
|
#include "Engine/DataAsset.h"
|
||||||
#include "ProjectFish/Definations.h"
|
#include "../Definations.h"
|
||||||
#include "SkillAsset.generated.h"
|
#include "SkillAsset.generated.h"
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -55,10 +55,21 @@ UENUM(BlueprintType)
|
|||||||
enum class ESkillSize: uint8
|
enum class ESkillSize: uint8
|
||||||
{
|
{
|
||||||
Small UMETA(DisplayName = "小", ToolTip = "技能占用格子 2x2"),
|
Small UMETA(DisplayName = "小", ToolTip = "技能占用格子 2x2"),
|
||||||
Middle UMETA(DisplayName = "中", ToolTip = "技能占用格子 3x2"),
|
Medium UMETA(DisplayName = "中", ToolTip = "技能占用格子 3x2"),
|
||||||
Large UMETA(DisplayName = "大", ToolTip = "技能占用格子 4x2"),
|
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)
|
USTRUCT(BlueprintType)
|
||||||
struct FSkillContext
|
struct FSkillContext
|
||||||
{
|
{
|
||||||
@ -290,3 +301,4 @@ struct FShipDataConfig
|
|||||||
TSubclassOf<UCameraShakeBase> CollisionCameraShakeClass;
|
TSubclassOf<UCameraShakeBase> CollisionCameraShakeClass;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user