(Feat) Add Animation Fps Charater

This commit is contained in:
2026-08-13 22:07:08 +02:00
parent 176beab9fc
commit cca54a5e0d
157 changed files with 850 additions and 148 deletions
+115
View File
@@ -0,0 +1,115 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "InputCoreTypes.h"
#include "KeyCaptureWidget.generated.h"
class UButton;
class UTextBlock;
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnKeyCaptured, FKey, CapturedKey);
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnKeyCaptureCancelled);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnKeyConflictAnswered, bool, bConfirmed);
/** Ce que le voile attend a un instant donne. */
UENUM()
enum class EKeyCaptureState : uint8
{
/** Ferme. */
Idle,
/** Ouvert, en attente d'une touche. Les boutons sont replies. */
Capturing,
/** Ouvert, la touche est prise : on demande quoi faire. Les boutons apparaissent. */
Conflict
};
/**
* Le voile de remappage, en deux temps : "Appuie sur une touche", puis
* eventuellement "cette touche est deja prise, on la vole ?".
*
* Les deux etapes vivent dans le MEME widget et non dans deux ecrans successifs.
* Le conflit fait partie du geste de remappage : refermer le voile pour ouvrir
* une boite par-dessus produirait un clignotement et ferait perdre le fil de ce
* qu'on etait en train de modifier. UConfirmDialogWidget garde les questions
* generiques -- reinitialiser, abandonner une partie, valider une resolution.
*
* Classe Abstract : on cree un WBP_KeyCapture qui en herite.
*/
UCLASS(Abstract)
class EMBERWILD_API UKeyCaptureWidget : public UUserWidget
{
GENERATED_BODY()
public:
UKeyCaptureWidget(const FObjectInitializer& ObjectInitializer);
virtual void NativeOnInitialized() override;
virtual FReply NativeOnKeyDown(const FGeometry& InGeometry, const FKeyEvent& InKeyEvent) override;
virtual FReply NativeOnMouseButtonDown(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override;
UPROPERTY(BlueprintAssignable, Category = "Reglages")
FOnKeyCaptured OnKeyCaptured;
UPROPERTY(BlueprintAssignable, Category = "Reglages")
FOnKeyCaptureCancelled OnCaptureCancelled;
UPROPERTY(BlueprintAssignable, Category = "Reglages")
FOnKeyConflictAnswered OnConflictAnswered;
/** Affiche le voile, ecrit la consigne, replie les boutons et prend le focus. */
UFUNCTION(BlueprintCallable, Category = "Reglages")
void BeginCapture(const FText& ActionLabel);
/**
* Bascule le voile deja ouvert sur la question de conflit.
*
* Ne referme rien : c'est tout l'interet d'avoir garde un seul widget.
*/
UFUNCTION(BlueprintCallable, Category = "Reglages")
void ShowConflict(const FText& Message);
UFUNCTION(BlueprintCallable, Category = "Reglages")
void EndCapture();
UFUNCTION(BlueprintPure, Category = "Reglages")
EKeyCaptureState GetCaptureState() const { return State; }
protected:
/** Optionnel : un voile dont le texte est fige dans le Blueprint reste valide. */
UPROPERTY(meta = (BindWidgetOptional))
TObjectPtr<UTextBlock> PromptText;
/**
* Boutons de la seule etape de conflit. Replies pendant la capture : les
* afficher inertes inviterait a cliquer alors qu'on attend une touche.
*/
UPROPERTY(meta = (BindWidgetOptional))
TObjectPtr<UButton> ConfirmButton;
UPROPERTY(meta = (BindWidgetOptional))
TObjectPtr<UButton> CancelButton;
/** Doit contenir {0}, remplace par le nom de l'action en cours de remappage. */
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Reglages")
FText PromptFormat;
private:
UFUNCTION()
void HandleConfirmClicked();
UFUNCTION()
void HandleCancelClicked();
/** Facteur commun a NativeOnKeyDown et NativeOnMouseButtonDown. */
FReply CaptureKey(const FKey& Key);
/** Affiche ou replie les deux boutons selon l'etat. */
void UpdateButtonVisibility();
EKeyCaptureState State = EKeyCaptureState::Idle;
};