Advertisement
Creedbloom

OST_HUDElement.cpp

Mar 18th, 2017
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.35 KB | None | 0 0
  1. // Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
  2.  
  3. #include "OST_Game.h"
  4. #include "OST_HUD.h"
  5. #include "OST_HUDElement.h"
  6.  
  7.  
  8. AOST_HUDElement::AOST_HUDElement(const class FObjectInitializer& PCIP)
  9.     : Super(PCIP)
  10. {
  11.     Align = EHUDElementsAlign::EBT_CenterCenter;
  12.     Size = FVector2D(100.0f, 40.0f);
  13. }
  14.  
  15. bool AOST_HUDElement::Init()
  16. {
  17.     if (!MyViewportClient)
  18.     {
  19.         if (!MyHUD)
  20.         {
  21.             UE_LOG(OST_Log, Error, TEXT("%s::Init() -> No MyHUD"),*GetName());
  22.             return false;
  23.         }
  24.         const ULocalPlayer* _localPlayer = Cast<ULocalPlayer>(MyHUD->PlayerOwner->Player);
  25.         MyViewportClient = _localPlayer->ViewportClient;
  26.     }
  27.     OnInit();
  28.     return true;
  29. }
  30.  
  31. void AOST_HUDElement::SendHUDElementEventName(FName Sender, FName Event)
  32. {
  33.     HUDElementEvent.Broadcast(Sender, Event);
  34.     OnHUDElementEvent(Sender, Event);
  35. }
  36.  
  37. FVector2D AOST_HUDElement::GetScreenLocation()
  38. {
  39.     return RealLocation;
  40. }
  41.  
  42. void AOST_HUDElement::SetScreenLocation(FVector2D NewLocation)
  43. {
  44.     LocOffset = NewLocation;
  45. }
  46.  
  47. void AOST_HUDElement::SetState(TEnumAsByte<EHUDElementsEnum::EElementState> NewState)
  48. {
  49.     /*for (int32 i = 0; i < ChildrenElements.Num(); i++)
  50.     {
  51.         ChildrenElements[i]->State = NewState;
  52.     }*/
  53.     State = NewState;
  54. }
  55.  
  56. void AOST_HUDElement::SetParent(AActor* NewParent)
  57. {
  58.     Parent = NewParent;
  59.     AOST_HUDElement* _parent = Cast<AOST_HUDElement>(NewParent);
  60.     if (_parent)
  61.     {
  62.         _parent->AddChieldElement(this);
  63.     }
  64. }
  65.  
  66. FName AOST_HUDElement::GetParentName()
  67. {
  68.     FName _parentName;
  69.  
  70.     if (!Parent)
  71.     {
  72.         return "noname";
  73.     }
  74.  
  75.     if (Cast<AOST_HUDElement>(Parent))
  76.     {
  77.         _parentName = Cast<AOST_HUDElement>(Parent)->Name;
  78.     }
  79.     else
  80.     {
  81.         _parentName = FName(*Parent->GetName());
  82.     }
  83.     return _parentName;
  84. }
  85.  
  86. FName AOST_HUDElement::GetGlobalName(FName LocalName)
  87. {
  88.     return FName(*(GetParentName().ToString() + LocalName.ToString()));
  89. }
  90.  
  91. AOST_HUDElement* AOST_HUDElement::GetElementByName(FName _name)
  92. {
  93.     AOST_HUD* _myHud = Cast<AOST_HUD>(MyHUD);
  94.     if (!_myHud)
  95.     {
  96.         return NULL;
  97.     }
  98.     for (int32 i = 0; i < _myHud->HUDElementList.Num(); i++)
  99.     {
  100.         if (_myHud->HUDElementList[i]->Name == _name)
  101.         {
  102.             return _myHud->HUDElementList[i];
  103.         }
  104.     }
  105.     return NULL;
  106. }
  107.  
  108. void AOST_HUDElement::HideElement()
  109. {
  110.     //UE_LOG(OST_Log, Log, TEXT("%s::HideElement()"), *GetName());
  111.     SetState(EHUDElementsEnum::EBT_Hide);
  112. }
  113.  
  114. void AOST_HUDElement::UnHideElement()
  115. {
  116.     //UE_LOG(OST_Log, Log, TEXT("%s::UnHideElement()"), *GetName());
  117.     SetState(EHUDElementsEnum::EBT_Normal);
  118. }
  119.  
  120. bool AOST_HUDElement::AddChieldElement(AOST_HUDElement* Element)
  121. {
  122.     if (ChildrenElements.Find(Element) < 0)
  123.     {
  124.         ChildrenElements.Add(Element);
  125.         return true;
  126.     }
  127.     GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, Name.ToString() + "->AddChieldElement() - try double add");
  128.     return false;
  129. }
  130.  
  131. void AOST_HUDElement::DrawChieldElements()
  132. {
  133.     if (ChildrenElements.Num() < 1) return;
  134.     for (int32 i = 0; i < ChildrenElements.Num(); i++)
  135.     {
  136.         if (ChildrenElements[i]->State != EHUDElementsEnum::EBT_Hide)
  137.         {
  138.             ChildrenElements[i]->DrawHUDElement();
  139.         }
  140.     }
  141. }
  142.  
  143. FVector2D AOST_HUDElement::GetAlignmentLocation()
  144. {
  145.     FVector2D _startLoc;
  146.     FVector2D _parentSize = FVector2D::ZeroVector;
  147.  
  148.     AOST_HUDElement* _parent = Cast<AOST_HUDElement>(Parent);
  149.  
  150.     if (_parent)
  151.     {
  152.         _startLoc = _parent->RealLocation;
  153.         _parentSize = _parent->RealSize;
  154.     }
  155.     else
  156.     {
  157.         _startLoc = FVector2D::ZeroVector;
  158.         if (MyViewportClient)
  159.         {
  160.             MyViewportClient->GetViewportSize(_parentSize);
  161.         }
  162.     }
  163.  
  164.     FVector2D _result;
  165.  
  166.     switch (Align)
  167.     {
  168.         case EHUDElementsAlign::EBT_UpCenter:
  169.             _result.X = (_parentSize.X - RealSize.X) / 2;
  170.             _result.Y = 0.0f;
  171.             break;
  172.         case EHUDElementsAlign::EBT_UpRight:
  173.             _result.X = _parentSize.X - RealSize.X;
  174.             _result.Y = 0.0f;
  175.             break;
  176.         case EHUDElementsAlign::EBT_CenterLeft:
  177.             _result.Y = (_parentSize.Y - RealSize.Y) / 2;
  178.             _result.X = 0.0f;
  179.             break;
  180.         case EHUDElementsAlign::EBT_CenterCenter:
  181.             _result.Y = (_parentSize.Y - RealSize.Y) / 2;
  182.             _result.X = (_parentSize.X - RealSize.X) / 2;
  183.             break;
  184.         case EHUDElementsAlign::EBT_CenterRight:
  185.             _result.Y = (_parentSize.Y - RealSize.Y) / 2;
  186.             _result.X = _parentSize.X - RealSize.X;
  187.             break;
  188.         case EHUDElementsAlign::EBT_DownLeft:
  189.             _result.Y = _parentSize.Y - RealSize.Y;
  190.             _result.X = 0.0f;
  191.             break;
  192.         case EHUDElementsAlign::EBT_DownCenter:
  193.             _result.Y = _parentSize.Y - RealSize.Y;
  194.             _result.X = (_parentSize.X - RealSize.X) / 2;
  195.             break;
  196.         case EHUDElementsAlign::EBT_DownRight:
  197.             _result.Y = _parentSize.Y - RealSize.Y;
  198.             _result.X = _parentSize.X - RealSize.X;
  199.             break;
  200.         case EHUDElementsAlign::EBT_UpLeft:
  201.         case EHUDElementsAlign::EBT_None:
  202.         default:
  203.             _result = FVector2D::ZeroVector;
  204.             break;
  205.     }
  206.    
  207.     return _result + _startLoc;
  208. }
  209.  
  210. void AOST_HUDElement::DrawDebugInfo(FVector2D _location)
  211. {
  212.     AOST_HUD* _hud = Cast<AOST_HUD>(MyHUD);
  213.     if (_hud)
  214.     {
  215.         FString  _tmpStr = FString::Printf(TEXT("I'm - %s / Children cnt=%i / Scale: %.1f"), *(Name.ToString()),ChildrenElements.Num(), Scale);
  216.         _hud->DrawText(_tmpStr, FLinearColor::Red, _location.X, _location.Y, _hud->DefaultFont, 0.5f);
  217.         _hud->DrawText(FString("My parent is -  ") + ((Cast<AOST_HUDElement>(Parent)) ? Cast<AOST_HUDElement>(Parent)->Name.ToString() : "NULL"), FLinearColor::Red, _location.X, _location.Y + 15, _hud->DefaultFont, 0.5f);
  218.     }
  219. }
  220.  
  221. void AOST_HUDElement::DrawHUDElement()
  222. {
  223.     if (State == EHUDElementsEnum::EBT_Hide) return;
  224.  
  225.     OnBeforeDrawHUDElement();
  226.  
  227.     if (!MyViewportClient)
  228.     {
  229.         UE_LOG(OST_Log, Error, TEXT("%s::DrawHUDElement() -> No MyViewportClient"),*GetName());
  230.         return;
  231.     }
  232.  
  233.     AOST_HUD* _hud = Cast<AOST_HUD>(MyHUD);
  234.  
  235.     if (_hud)
  236.     {
  237.         Scale = _hud->GlobalScale;
  238.     }
  239.     else
  240.     {
  241.         Scale = 1.0f;
  242.     }
  243.    
  244.     RealLocation = GetAlignmentLocation() + LocOffset*Scale;
  245.     RealSize = Size*Scale;
  246.  
  247.     if (bIsDrugging && MyViewportClient && MyHUD)
  248.     {
  249.         FVector2D _mousePos;
  250.  
  251.         MyViewportClient->GetMousePosition(_mousePos);
  252.         RealLocation += (_mousePos - MouseLastClickLoc);
  253.     }
  254.     else if (bIsDrugging)
  255.     {
  256.         GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, "ERROR");
  257.     }
  258.  
  259.     if (bCanMouseEvents)
  260.     {
  261.         bool _bCreateHitBox = false;
  262.         if (!MyHUD->GetHitBoxWithName(Name)) _bCreateHitBox = true;
  263.         if ((MyHUD->GetHitBoxWithName(Name) && LastLocOffset != RealLocation))  _bCreateHitBox = true;
  264.         if ((MyHUD->GetHitBoxWithName(Name) && RealSize != LastSize))  _bCreateHitBox = true;
  265.         if (_bCreateHitBox)
  266.         {
  267.             MyHUD->AddHitBox(RealLocation, RealSize, Name, true);
  268.             LastLocOffset = RealLocation;
  269.             LastSize = RealSize;
  270.         }
  271.     }
  272.  
  273.     OnAfterDrawHUDElement();
  274. }
  275.  
  276. AOST_Character* AOST_HUDElement::GetCharacter()
  277. {
  278.     if (MyHUD && MyHUD->PlayerOwner && MyHUD->PlayerOwner->GetPawn())
  279.     {
  280.         return Cast<AOST_Character>(MyHUD->PlayerOwner->GetPawn());
  281.     }
  282.     return NULL;
  283. }
  284.  
  285. void AOST_HUDElement::ReceiveActorBeginCursorOver()
  286. {
  287.     if (!bCanMouseEvents) return;
  288.  
  289.     Super::ReceiveActorBeginCursorOver();
  290.  
  291.     //UE_LOG(OST_Log, Warning, TEXT("%s::ReceiveActorBeginCursorOver()"), *GetName());
  292.  
  293.     if (Cast<AOST_HUDElement>(Parent))
  294.     {
  295.         Cast<AOST_HUDElement>(Parent)->ReceiveFromChieldBeginCursorOver(this->Name);
  296.     }
  297. }
  298. void AOST_HUDElement::ReceiveActorEndCursorOver()
  299. {
  300.     if (!bCanMouseEvents) return;
  301.  
  302.     Super::ReceiveActorEndCursorOver();
  303.  
  304.     //UE_LOG(OST_Log, Warning, TEXT("%s::ReceiveActorEndCursorOver()"), *GetName());
  305.  
  306.     if (Cast<AOST_HUDElement>(Parent))
  307.     {
  308.         Cast<AOST_HUDElement>(Parent)->ReceiveFromChieldEndCursorOver(this->Name);
  309.     }
  310. }
  311. void AOST_HUDElement::ReceiveActorOnClicked()
  312. {
  313.     if (!bCanMouseEvents) return;
  314.  
  315.     Super::ReceiveActorOnClicked();
  316.  
  317.     //UE_LOG(OST_Log, Warning, TEXT("%s::ReceiveActorOnClicked()"), *GetName());
  318.  
  319.     if (bDraggable && MyViewportClient)
  320.     {
  321.         MyViewportClient->GetMousePosition(MouseLastClickLoc);
  322.         bIsDrugging = true;
  323.     }
  324.  
  325.     if (Cast<AOST_HUDElement>(Parent))
  326.     {
  327.         Cast<AOST_HUDElement>(Parent)->ReceiveFromChieldOnClicked(this->Name);
  328.     }
  329. }
  330. void AOST_HUDElement::ReceiveActorOnReleased()
  331. {
  332.     if (!bCanMouseEvents) return;
  333.  
  334.     Super::ReceiveActorOnReleased();
  335.  
  336.     if (bDraggable && MyViewportClient)
  337.     {
  338.         bIsDrugging = false;
  339.         FVector2D _mousePos;
  340.         MyViewportClient->GetMousePosition(_mousePos);
  341.         LocOffset += (_mousePos - MouseLastClickLoc);
  342.     }
  343.    
  344.     if (Cast<AOST_HUDElement>(Parent))
  345.     {
  346.         Cast<AOST_HUDElement>(Parent)->ReceiveFromChieldOnReleased(this->Name);
  347.     }
  348. }
  349.  
  350. void AOST_HUDElement::DrawTextureSimpleExt(UTexture2D* Texture, FVector2D TXTLocation, FVector2D TXTSize)
  351. {
  352.     if (TXTSize == FVector2D::ZeroVector) return;
  353.    
  354.     if (!Texture)
  355.     {
  356.         MyHUD->DrawRect(FLinearColor(1, 0, 0, 0.5f), TXTLocation.X, TXTLocation.Y, TXTSize.X, TXTSize.Y);
  357.         DrawMemoText(FString("No image"),FVector2D::ZeroVector, FLinearColor::Yellow, TXTLocation, 10.0f,Cast<AOST_HUD>(MyHUD)->DefaultFont, 0.5f, EHUDElementsAlign::EBT_CenterCenter);
  358.         return;
  359.     }
  360.     float _scale = TXTSize.X / Texture->GetSizeX();
  361.     MyHUD->DrawTextureSimple(Texture, TXTLocation.X, TXTLocation.Y, _scale);
  362. }
  363.  
  364. void AOST_HUDElement::DrawMemoText(FString Text, FVector2D TextSize, FLinearColor TextColor, FVector2D TextLoc, float LenInterval,
  365.     UFont* Font, float FontScale, TEnumAsByte<EHUDElementsAlign::EElementAlign> TextAlign)
  366. {
  367.     if (Text == "")
  368.     {
  369.         UE_LOG(OST_Log, Error, TEXT("%s::DrawMemoText() - Have no text"), *GetName());
  370.         return;
  371.     }
  372.     if (FontScale == 0.0f)
  373.     {
  374.         UE_LOG(OST_Log, Error, TEXT("%s::DrawMemoText() - FontScale == 0.0f"), *GetName());
  375.         return;
  376.     }
  377.  
  378.     if (TextSize == FVector2D::ZeroVector)
  379.     {
  380.         int32 _id;
  381.         int32 _lenNum = 0;
  382.  
  383.         while (_lenNum < 10)
  384.         {
  385.             _id = Text.Find("/", ESearchCase::IgnoreCase, ESearchDir::FromStart, 0);
  386.             if (_id > 0)
  387.             {
  388.                 MyHUD->DrawText(Text.Left(_id), TextColor, TextLoc.X, TextLoc.Y + _lenNum*LenInterval, Font, FontScale);
  389.                 Text = Text.Right(Text.Len() - _id - 1);
  390.                 _lenNum++;
  391.             }
  392.             else
  393.             {
  394.                 break;
  395.             }
  396.         }
  397.         MyHUD->DrawText(Text, TextColor, TextLoc.X, TextLoc.Y + _lenNum*LenInterval, Font, FontScale);
  398.         return;
  399.     }
  400.  
  401.     int32 _strWidth;
  402.     int32 _strHeight;
  403.     Font->GetStringHeightAndWidth(Text, _strHeight, _strWidth);
  404.     _strWidth *= FontScale;
  405.     _strHeight *= FontScale;
  406.  
  407.     float _charW = _strWidth / Text.Len();
  408.     float _charH = _strHeight;
  409.  
  410.     int32 _maxCharCntInLen = TextSize.X / _charW;
  411.  
  412.     int32 _lenMax = TextSize.Y / (_charH + LenInterval);
  413.  
  414.     FString _strOut = Text;
  415.  
  416.     for (int32 i = 0; i <= _lenMax; i++)
  417.     {
  418.         MyHUD->DrawText(_strOut.Left(_maxCharCntInLen), TextColor, TextLoc.X, TextLoc.Y + i*(_charH + LenInterval), Font, FontScale);
  419.         _strOut = _strOut.Right(_strOut.Len() - _maxCharCntInLen);
  420.         if (_strOut == "") break;
  421.     }
  422. }
  423.  
  424. void AOST_HUDElement::ReceiveFromChieldBeginCursorOver(FName _nameChield)
  425. {
  426.     SendHUDElementEventName(_nameChield, "OnBeginCursorOver");
  427.     //UE_LOG(OST_Log, Warning, TEXT("%s::ReceiveFromChieldBeginCursorOver(%s)"), *GetName(), *(_nameChield.ToString()));
  428.     if (Cast<AOST_HUDElement>(Parent))
  429.     {
  430.         Cast<AOST_HUDElement>(Parent)->ReceiveFromChieldBeginCursorOver(_nameChield);
  431.     }
  432. }
  433. void AOST_HUDElement::ReceiveFromChieldEndCursorOver(FName _nameChield)
  434. {
  435.     SendHUDElementEventName(_nameChield, "OnEndCursorOver");
  436.     //UE_LOG(OST_Log, Warning, TEXT("%s::ReceiveFromChieldEndCursorOver(%s)"), *GetName(), *(_nameChield.ToString()));
  437.     if (Cast<AOST_HUDElement>(Parent))
  438.     {
  439.         Cast<AOST_HUDElement>(Parent)->ReceiveFromChieldEndCursorOver(_nameChield);
  440.     }
  441. }
  442. void AOST_HUDElement::ReceiveFromChieldOnClicked(FName _nameChield)
  443. {
  444.     SendHUDElementEventName(_nameChield, "OnClicked");
  445.     //UE_LOG(OST_Log, Warning, TEXT("%s::ReceiveFromChieldOnClicked(%s)"), *GetName(), *(_nameChield.ToString()));
  446.     if (Cast<AOST_HUDElement>(Parent))
  447.     {
  448.         Cast<AOST_HUDElement>(Parent)->ReceiveFromChieldOnClicked(_nameChield);
  449.     }
  450. }
  451. void AOST_HUDElement::ReceiveFromChieldOnReleased(FName _nameChield)
  452. {
  453.     SendHUDElementEventName(_nameChield, "OnReleased");
  454.     //UE_LOG(OST_Log, Warning, TEXT("%s::ReceiveFromChieldOnReleased(%s)"), *GetName(), *(_nameChield.ToString()));
  455.     if (Cast<AOST_HUDElement>(Parent))
  456.     {
  457.         Cast<AOST_HUDElement>(Parent)->ReceiveFromChieldOnReleased(_nameChield);
  458.     }
  459. }
  460.  
  461. void AOST_HUDElement::SetPlayerController(APlayerController* NewPC)
  462. {
  463.     UE_LOG(OST_Log, Warning, TEXT("%s::SetPlayerController()"), *GetName());
  464.     MyPlayerController = NewPC;
  465. }
  466.  
  467. APlayerController* AOST_HUDElement::GetPlayerController()
  468. {
  469.    
  470.     if (!MyPlayerController)
  471.     {
  472.         UWorld* world = GetWorld();
  473.         if (world)
  474.         {
  475.             MyPlayerController = world->GetFirstPlayerController();
  476.         }
  477.     }
  478.     return MyPlayerController;
  479. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement