调整 技能应用位置逻辑

This commit is contained in:
997146918 2025-07-21 17:59:58 +08:00
parent 4e7af37166
commit 9762d2cb0f
9 changed files with 71 additions and 61 deletions

View File

@ -25,10 +25,11 @@ enum class ESkillTargetType: uint8
{
Self UMETA(DisplayName = "自身"),
Other UMETA(DisplayName = "对方"),
AdjacentLeft UMETA(DisplayName = "左侧相邻"),
AdjacentRight UMETA(DisplayName = "右侧相邻"),
AllLeft UMETA(DisplayName = "左侧全部"),
AllRight UMETA(DisplayName = "右侧全部"),
Around UMETA(DisplayName = "格子周围")
// AdjacentLeft UMETA(DisplayName = "左侧相邻"),
// AdjacentRight UMETA(DisplayName = "右侧相邻"),
// AllLeft UMETA(DisplayName = "左侧全部"),
// AllRight UMETA(DisplayName = "右侧全部"),
};
//随机对象类型
UENUM(BlueprintType)
@ -116,7 +117,7 @@ struct FSkillData: public FTableRowBase
FGameplayTag SkillTag;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "背包占用"))
FIntPoint SkillWeight;
FIntPoint SkillWeight = FIntPoint(1, 1);
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "是否为主动技能"))
bool bActiveSkill = true;

View File

@ -11,11 +11,12 @@
#include "SkillEffects/SkillEffect_ModifySpeed.h"
#include "SkillEffects/SkillEffect_SER.h"
void USkill::InitSkill(APawnWithSkill* owner, USkillManager* skillManager, FSkillData skillData)
void USkill::InitSkill(APawnWithSkill* owner, USkillManager* skillManager, FSkillData skillData, FIntPoint BagPos)
{
this->Owner = owner;
this->SkillManager = skillManager;
this->SkillData = skillData;
this->BagPosition = BagPos;
this->RemainingTime = SkillData.CD;
this->RemainingEndurance = SkillData.Endurance;
for (auto effectData: skillData.SkillEffects)
@ -113,6 +114,11 @@ FSkillData& USkill::GetSkillData()
return SkillData;
}
FIntPoint USkill::GetBagPos()
{
return BagPosition;
}
void USkill::SetSkillData(FSkillData data)
{
SkillData = data;

View File

@ -19,7 +19,7 @@ class PROJECTFISH_API USkill : public UObject
{
GENERATED_BODY()
public:
void InitSkill(class APawnWithSkill* owner, USkillManager* skillManager, FSkillData SkillData);
void InitSkill(class APawnWithSkill* owner, USkillManager* skillManager, FSkillData SkillData, FIntPoint BagPos);
void InitSkillTrigger();
void TickSkill(float deltaTime);
void ExecuteSkill();
@ -28,6 +28,7 @@ public:
class APawnWithSkill* GetOwner();
FSkillData& GetSkillData();
FIntPoint GetBagPos();
void SetSkillData( FSkillData SkillData);
UFUNCTION(BlueprintCallable)
void ApplyRemainingTimeOffset(int timeOffset);
@ -53,6 +54,9 @@ protected:
float RemainingTime;
UPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (ToolTip = "剩余耐久度"))
int32 RemainingEndurance;
UPROPERTY(BlueprintReadOnly, EditAnywhere, meta = (ToolTip = "背包位置"))
FIntPoint BagPosition;
};

View File

@ -132,52 +132,15 @@ void USkillEffect::GetEffectTargetsByTargetType(const FSkillContext& context, TA
}
break;
}
case ESkillTargetType::AdjacentLeft:
case ESkillTargetType::Around:
{
//技能左侧的技能
TArray<USkill*> aroundSkills = context.SkillManager->GetSkillsAround(context.OwnerSkill);
for (auto skill: aroundSkills)
{
//技能左侧的技能
TArray< USkill*> allSkills = context.SkillManager->GetAllSkills();
int32 index = allSkills.Find(OwnerSkill);
if ((index - 1) >= 0)
{
result.Add(allSkills[index - 1]);
}
break;;
}
case ESkillTargetType::AdjacentRight:
{
//技能右侧的技能
TArray< USkill*> allSkills = context.SkillManager->GetAllSkills();
int32 index = allSkills.Find(OwnerSkill);
if ((index + 1) < allSkills.Num())
{
result.Add(allSkills[index + 1]);
result.Add(skill);
}
break;;
}
case ESkillTargetType::AllLeft:
{
//所有当前技能左侧的技能
TArray< USkill*> allSkills = context.SkillManager->GetAllSkills();
int32 index = allSkills.Find(OwnerSkill);
for (int i = 0; i < index; ++i)
{
if (allSkills[i]->GetOwner() == OwnerSkill->GetOwner())
result.Add(allSkills[i]);
}
break;
}
case ESkillTargetType::AllRight:
{
//所有当前技能右侧的技能
TArray< USkill*> allSkills = context.SkillManager->GetAllSkills();
int32 index = allSkills.Find(OwnerSkill);
for (int i = index + 1; i < allSkills.Num(); ++i)
{
if (allSkills[i]->GetOwner() == OwnerSkill->GetOwner())
result.Add(allSkills[i]);
}
break;
}
}
}

View File

@ -25,12 +25,12 @@ TStatId USkillManager::GetStatId() const
void USkillManager::AddPawn(class APawnWithSkill* Pawn, FIntPoint BagSize)
{
PawnInfo.Add(Pawn, BagSize);
TMap<FIntPoint, bool> states;
TMap<FIntPoint, int32> states;
for (int y = 0; y < BagSize.Y; y++)
{
for (int x = 0; x < BagSize.X; x++)
{
states.Add(FIntPoint(x, y), false);
states.Add(FIntPoint(x, y), -1);
}
}
@ -44,12 +44,11 @@ void USkillManager::AddPawn(class APawnWithSkill* Pawn, FIntPoint BagSize)
USkill* USkillManager::AddSkill(FSkillData data, APawnWithSkill* Pawn, FIntPoint& BagPos)
{
TMap<FIntPoint, bool>* states = PawnBagState.Find(Pawn);
TMap<FIntPoint, int32>* states = PawnBagState.Find(Pawn);
FIntPoint BagSize = *PawnInfo.Find(Pawn);
bool bAddAble = true;
for (int y = 0; y < BagSize.Y; y++)
{
bAddAble = true;
for (int x = 0; x < BagSize.X; x++)
{
bAddAble = true;
@ -58,7 +57,7 @@ USkill* USkillManager::AddSkill(FSkillData data, APawnWithSkill* Pawn, FIntPoin
for (int skillY = 0; skillY < data.SkillWeight.Y; skillY++)
{
if (states->Find(FIntPoint(x, y) + FIntPoint(skillX, skillY)) == nullptr
|| *states->Find(FIntPoint(x, y) + FIntPoint(skillX, skillY)) == true)
|| *states->Find(FIntPoint(x, y) + FIntPoint(skillX, skillY)) != -1)
{
bAddAble = false;
}
@ -67,18 +66,19 @@ USkill* USkillManager::AddSkill(FSkillData data, APawnWithSkill* Pawn, FIntPoin
//满足条件
if (bAddAble)
{
BagPos = FIntPoint(x, y);
USkill* skill = NewObject<USkill>(this);
skill->InitSkill(Pawn, this, data, BagPos);
Skills.Add(skill);
//设置占用状态
for (int xTemp = 0; xTemp < data.SkillWeight.X; xTemp++)
{
for (int yTemp = 0; yTemp < data.SkillWeight.Y; yTemp++)
{
states->Add(FIntPoint(xTemp, yTemp) + FIntPoint(x, y), true);
states->Add(FIntPoint(xTemp, yTemp) + FIntPoint(x, y), GetSkillIndex(skill));
}
}
BagPos = FIntPoint(x, y);
USkill* skill = NewObject<USkill>(this);
skill->InitSkill(Pawn, this, data);
Skills.Add(skill);
return skill;
}
}
@ -106,6 +106,36 @@ class USkill* USkillManager::GetSkillByTag(FGameplayTag Tag)
return nullptr;
}
int32 USkillManager::GetSkillIndex(USkill* Skill)
{
return Skills.Find(Skill);
}
TArray<USkill*> USkillManager::GetSkillsAround(USkill* TargetSkill)
{
TArray<USkill*> aroundSkills;
TMap<FIntPoint, int32> *BagStates = PawnBagState.Find(TargetSkill->GetOwner());
FIntPoint BagPos = TargetSkill->GetBagPos();
FIntPoint BagSize = *PawnInfo.Find(TargetSkill->GetOwner());
FSkillData data = TargetSkill->GetSkillData();
int beginX = FMath::Max(0, BagPos.X- 1);
int endX = FMath::Min(BagSize.X - 1, BagPos.X + 1);
int beginY = FMath::Max(0, BagPos.Y - 1);
int endY = FMath::Min(BagSize.Y - 1, BagPos.Y + 1);
for (int x = beginX; x <= endX; x++)
{
for (int y = beginY; y <= endY; y++)
{
int32 skillIndex = *BagStates->Find(FIntPoint(x, y));
if (skillIndex != -1 && skillIndex != GetSkillIndex(TargetSkill) && !aroundSkills.Contains(Skills[skillIndex]))
{
aroundSkills.Add(Skills[skillIndex]);
}
}
}
return aroundSkills;
}
void USkillManager::RemoveSkill(USkill* Skill)
{

View File

@ -33,6 +33,10 @@ public:
UFUNCTION(BlueprintPure)
class USkill* GetSkillByTag(FGameplayTag Tag);
int32 GetSkillIndex(USkill* Skill);
UFUNCTION(BlueprintPure)
TArray<USkill*> GetSkillsAround(USkill *TargetSkill);
UFUNCTION(BlueprintCallable)
void RemoveSkill(class USkill *Skill);
@ -53,5 +57,7 @@ protected:
UPROPERTY(BlueprintReadWrite)
bool bGameEnd = false;
TMap<APawnWithSkill*, TMap<FIntPoint, bool>> PawnBagState;
TMap<APawnWithSkill*, TMap<FIntPoint, int32>> PawnBagState;
};