Compare commits

..

4 Commits

26 changed files with 270 additions and 1 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -48,4 +48,8 @@ public:
// 任务存档数据 // 任务存档数据
UPROPERTY(SaveGame, BlueprintReadWrite, meta = (ToolTip = "任务存档数据")) UPROPERTY(SaveGame, BlueprintReadWrite, meta = (ToolTip = "任务存档数据"))
TArray<FQuestSaveData> QuestSaveData; TArray<FQuestSaveData> QuestSaveData;
//已战胜的鱼
UPROPERTY(SaveGame, BlueprintReadWrite, meta = (ToolTip = "被击败的鱼"))
TArray<int32> Fish_defeated_IDS;
}; };

View File

@ -102,3 +102,22 @@ void UGameInfoManager::CreateGameInfoAndSave(UShapeAsset* ShipContainerShape, US
SaveGameInfo(); SaveGameInfo();
} }
bool UGameInfoManager::IsFishDefeated(int32 FishID)
{
if (!IsValid(PlayerInfo))
{
return false;
}
return PlayerInfo->Fish_defeated_IDS.Contains(FishID);
}
void UGameInfoManager::AddDefeatedFish(int32 FishID)
{
if (!IsValid(PlayerInfo))
{
PlayerInfo = NewObject<UPlayerInfoSaveGame>(this);
}
PlayerInfo->Fish_defeated_IDS.Add(FishID);
SaveGameInfo();
}

View File

@ -29,6 +29,12 @@ public:
UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable)
void CreateGameInfoAndSave(UShapeAsset* ShipContainerShape, UShapeAsset* PlayerContainerShape); void CreateGameInfoAndSave(UShapeAsset* ShipContainerShape, UShapeAsset* PlayerContainerShape);
UFUNCTION(BlueprintPure)
bool IsFishDefeated(int32 FishID);
UFUNCTION(BlueprintCallable)
void AddDefeatedFish(int32 FishID);
protected: protected:
UPROPERTY(BlueprintReadOnly) UPROPERTY(BlueprintReadOnly)
TObjectPtr<class UPlayerInfoSaveGame> PlayerInfo; TObjectPtr<class UPlayerInfoSaveGame> PlayerInfo;

View File

@ -0,0 +1,53 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "UIManagerSubsystem.h"
#include "ProjectFish/Widget/DragableUserWidget.h"
#include "Framework/Application/SlateApplication.h"
#include "Components/CanvasPanelSlot.h"
void UUIManagerSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
Super::Initialize(Collection);
FSlateApplication& SlateApp = FSlateApplication::Get();
SlateApp.OnApplicationMousePreInputButtonDownListener().AddUObject(this, &UUIManagerSubsystem::OnMouseButtonDown);
}
void UUIManagerSubsystem::AddDragWidget(UDragableUserWidget* UserWidget)
{
UserWidget->AddToViewport();
UserWidget->SetVisibility(ESlateVisibility::HitTestInvisible);
DragDropWidget = MakeWeakObjectPtr(UserWidget);
}
void UUIManagerSubsystem::RemoveDragWidget()
{
if (DragDropWidget.IsValid())
{
DragDropWidget->RemoveFromViewport();
}
DragDropWidget.Reset();
}
UDragableUserWidget* UUIManagerSubsystem::GetDragWidget()
{
if (DragDropWidget.IsValid())
{
return DragDropWidget.Get();
}
return nullptr;
}
void UUIManagerSubsystem::OnMouseButtonDown(const FPointerEvent& PointerEvent)
{
if (DragDropWidget.IsValid())
{
if (PointerEvent.GetEffectingButton() == EKeys::RightMouseButton)
{
DragDropWidget->OnMouseButtonDownWhenDragging(PointerEvent);
}
}
}

View File

@ -0,0 +1,32 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "Widgets/SWidget.h"
#include "Blueprint/UserWidget.h"
#include "UIManagerSubsystem.generated.h"
/**
*
*/
UCLASS()
class PROJECTFISH_API UUIManagerSubsystem : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
UFUNCTION(BlueprintCallable, Category = "UIManagerSubsystem")
void AddDragWidget(class UDragableUserWidget* UserWidget);
UFUNCTION(BlueprintCallable, Category = "UIManagerSubsystem")
void RemoveDragWidget();
UFUNCTION(BlueprintPure, Category = "UIManagerSubsystem")
UDragableUserWidget* GetDragWidget();
void OnMouseButtonDown(const FPointerEvent& PointerEvent);
protected:
TWeakObjectPtr<class UDragableUserWidget> DragDropWidget;
};

View File

@ -9,6 +9,6 @@ public class ProjectFish : ModuleRules
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
OptimizeCode = CodeOptimization.Never; OptimizeCode = CodeOptimization.Never;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine",
"InputCore", "NavigationSystem", "AIModule", "Niagara", "EnhancedInput", "GameplayTags", "DeveloperSettings" }); "InputCore", "NavigationSystem", "AIModule", "Niagara", "EnhancedInput", "GameplayTags", "DeveloperSettings", "UMG", "Slate" ,"SlateCore"});
} }
} }

View File

@ -0,0 +1,116 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "DragableUserWidget.h"
#include "Blueprint/WidgetLayoutLibrary.h"
#include "Components/CanvasPanelSlot.h"
#include "ProjectFish/Gameplay/Subsystem/UIManagerSubsystem.h"
void UDragableUserWidget::SetWidgetDragable(bool Dragable)
{
bDragable = Dragable;
}
void UDragableUserWidget::BeginDrag(const FGeometry& InGeometry)
{
bDraging = true;
//OriginWidgetScreenPos = InGeometry.GetAbsolutePosition();
UUIManagerSubsystem* UIManager = GetGameInstance()->GetSubsystem<UUIManagerSubsystem>();
UIManager->AddDragWidget(this);
}
void UDragableUserWidget::EndDrag()
{
//取消拖拽 不处理点击事件
bDraging = false;
UUIManagerSubsystem* UIManager = GetGameInstance()->GetSubsystem<UUIManagerSubsystem>();
UIManager->RemoveDragWidget();
}
// FReply UDragableUserWidget::NativeOnMouseButtonDown(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent)
// {
// if (bDragable && InMouseEvent.GetEffectingButton() == EKeys::LeftMouseButton)
// {
// if (!bDraging)
// {
// BeginDrag(InGeometry);
// return FReply::Unhandled();
// }
// }
// else
// {
// return Super::NativeOnMouseButtonDown(InGeometry, InMouseEvent);
// }
// return FReply::Unhandled();
// }
//
// FReply UDragableUserWidget::NativeOnMouseButtonUp(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent)
// {
// return Super::NativeOnMouseButtonUp(InGeometry, InMouseEvent);
// }
//
// FReply UDragableUserWidget::NativeOnMouseMove(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent)
// {
// if (bDraging)
// {
// Super::NativeOnMouseMove(InGeometry, InMouseEvent);
//
// // 获取鼠标在屏幕空间的绝对坐标
// FVector2D MouseScreenPos = InMouseEvent.GetScreenSpacePosition();
//
// // 获取Widget在屏幕上的实际渲染尺寸
//
// FVector2D WidgetAbsoluteSize = InGeometry.GetDrawSize();
//
// // 计算Widget中心点应对应的屏幕位置
// FVector2D DesiredCenter = MouseScreenPos;
//
// // 计算新的左上角位置(让中心点对准鼠标)
// FVector2D NewTopLeft =FVector2D(DesiredCenter.X - WidgetAbsoluteSize.X * 0.5f, DesiredCenter.Y - WidgetAbsoluteSize.Y* 0.5f ); ;
//
// // 边界检查
// FVector2D ViewportSize;
// if (GEngine && GEngine->GameViewport)
// {
// GEngine->GameViewport->GetViewportSize(ViewportSize);
// }
// else
// {
// ViewportSize = FVector2D(1920, 1080);
// }
//
// // 确保Widget不会完全移出屏幕
// NewTopLeft.X = FMath::Clamp(NewTopLeft.X, 0.0f, ViewportSize.X - WidgetAbsoluteSize.X);
// NewTopLeft.Y = FMath::Clamp(NewTopLeft.Y, 0.0f, ViewportSize.Y - WidgetAbsoluteSize.Y);
//
// // // 计算相对于原始位置的偏移量
// // FVector2D ParentAbsolutePosition = FVector2D::ZeroVector;
// // if (InGeometry.GetParentGeometry().IsValid())
// // {
// // ParentAbsolutePosition = InGeometry.GetParentGeometry().GetAbsolutePosition();
// // }
// //
// FVector2D LocalOffset = NewTopLeft - OriginWidgetScreenPos;
//
// // 应用变换
// FWidgetTransform WidgetTransform = GetRenderTransform();
// WidgetTransform.Translation = LocalOffset/InGeometry.Scale;
// SetRenderTransform(WidgetTransform);
//
// // FString Scale = FString::Printf(TEXT("%.0f"), InGeometry.Scale);
// // UE_LOG(LogTemp, Warning, TEXT("Mouse: %s, CurrentWidgetScreenPos: %s, WidgetAbsoluteSize: %s NewTopLeft : %s LocalOffset : %s Scale = %s"),
// // *MouseScreenPos.ToString(),
// // *OriginWidgetScreenPos.ToString(),
// // *WidgetAbsoluteSize.ToString(),
// // *NewTopLeft.ToString(),
// // *LocalOffset.ToString(),
// // *Scale
// // );
//
// return FReply::Unhandled();
// }
// else
// return Super::NativeOnMouseMove(InGeometry, InMouseEvent);
// }

View File

@ -0,0 +1,39 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "DragableUserWidget.generated.h"
/**
*
*/
UCLASS()
class PROJECTFISH_API UDragableUserWidget : public UUserWidget
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category = "Dragable Widget")
void SetWidgetDragable(bool Dragable);
UFUNCTION(BlueprintCallable, Category = "Dragable Widget")
void BeginDrag(const FGeometry& InGeometry);
UFUNCTION(BlueprintCallable, Category = "Dragable Widget")
void EndDrag();
UFUNCTION(BlueprintImplementableEvent, Category = "Dragable Widget")
void OnMouseButtonDownWhenDragging(const FPointerEvent& PointerEvent);
// virtual FReply NativeOnMouseButtonDown( const FGeometry& InGeometry, const FPointerEvent& InMouseEvent ) override;
// virtual FReply NativeOnMouseButtonUp( const FGeometry& InGeometry, const FPointerEvent& InMouseEvent ) override;
// virtual FReply NativeOnMouseMove( const FGeometry& InGeometry, const FPointerEvent& InMouseEvent ) override;
protected:
UPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (ExposeOnSpawn = true))
bool bDragable;
UPROPERTY(BlueprintReadOnly)
bool bDraging;
FVector2D OriginWidgetScreenPos;
};