调整 技能应用位置逻辑
This commit is contained in:
parent
4e7af37166
commit
9762d2cb0f
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
@ -132,52 +132,15 @@ void USkillEffect::GetEffectTargetsByTargetType(const FSkillContext& context, TA
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ESkillTargetType::AdjacentLeft:
|
||||
case ESkillTargetType::Around:
|
||||
{
|
||||
//技能左侧的技能
|
||||
TArray< USkill*> allSkills = context.SkillManager->GetAllSkills();
|
||||
int32 index = allSkills.Find(OwnerSkill);
|
||||
if ((index - 1) >= 0)
|
||||
TArray<USkill*> aroundSkills = context.SkillManager->GetSkillsAround(context.OwnerSkill);
|
||||
for (auto skill: aroundSkills)
|
||||
{
|
||||
result.Add(allSkills[index - 1]);
|
||||
result.Add(skill);
|
||||
}
|
||||
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]);
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user