UiCoinCountComponent.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <MultiplayerSampleTypes.h>
  9. #include <AzCore/Serialization/EditContext.h>
  10. #include <AzCore/Settings/SettingsRegistry.h>
  11. #if AZ_TRAIT_CLIENT
  12. #include <LyShine/Bus/UiTextBus.h>
  13. #endif
  14. #include <Source/Components/UI/UiCoinCountComponent.h>
  15. namespace MultiplayerSample
  16. {
  17. void UiCoinCountComponent::Activate()
  18. {
  19. #if AZ_TRAIT_CLIENT
  20. UiCoinCountNotificationBus::Handler::BusConnect();
  21. #endif
  22. }
  23. void UiCoinCountComponent::Deactivate()
  24. {
  25. #if AZ_TRAIT_CLIENT
  26. UiCoinCountNotificationBus::Handler::BusDisconnect();
  27. #endif
  28. }
  29. #if AZ_TRAIT_CLIENT
  30. void UiCoinCountComponent::OnCoinCountChanged(uint16_t totalCoinsCollectedByLocalPlayer)
  31. {
  32. AZ::u64 winningCoinCount = 10;
  33. if (const auto registry = AZ::SettingsRegistry::Get())
  34. {
  35. registry->Get(winningCoinCount, WinningCoinCountSetting);
  36. }
  37. const AZStd::string message = AZStd::string::format("%04d", totalCoinsCollectedByLocalPlayer);
  38. UiTextBus::Event(m_coinsTextForLocalPlayer, &UiTextBus::Events::SetText, message);
  39. if (m_coinTextColorEffectDuration > AZ::Time::ZeroTimeMs) // sanity check
  40. {
  41. m_coinTextColorEffect = m_coinTextColorEffectDuration;
  42. m_gameFrameTick.Enqueue(AZ::Time::ZeroTimeMs, true);
  43. }
  44. else
  45. {
  46. UiTextBus::Event(m_coinsTextForLocalPlayer, &UiTextBus::Events::SetColor, m_coinTextColor);
  47. }
  48. }
  49. void UiCoinCountComponent::OnTick(AZ::TimeMs delta)
  50. {
  51. m_coinTextColorEffect -= delta;
  52. if (m_coinTextColorEffect <= AZ::Time::ZeroTimeMs)
  53. {
  54. UiTextBus::Event(m_coinsTextForLocalPlayer, &UiTextBus::Events::SetColor, m_coinTextColor);
  55. m_gameFrameTick.RemoveFromQueue();
  56. }
  57. else
  58. {
  59. const float normalizedEffectTime = aznumeric_cast<float>(m_coinTextColorEffect) / aznumeric_cast<float>(m_coinTextColorEffectDuration);
  60. const AZ::Color interpolatedColor = m_coinTextColor.Lerp(m_recentlyChangedCoinTextColor, normalizedEffectTime);
  61. UiTextBus::Event(m_coinsTextForLocalPlayer, &UiTextBus::Events::SetColor, interpolatedColor);
  62. }
  63. }
  64. #endif
  65. void UiCoinCountComponent::Reflect(AZ::ReflectContext* context)
  66. {
  67. if (AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
  68. {
  69. serializeContext->Class<UiCoinCountComponent, AZ::Component>()
  70. ->Version(1)
  71. ->Field("Coin Count Text", &UiCoinCountComponent::m_coinsTextForLocalPlayer)
  72. ->Field("Just Changed Color", &UiCoinCountComponent::m_recentlyChangedCoinTextColor)
  73. ->Field("Coin Color", &UiCoinCountComponent::m_coinTextColor)
  74. ->Field("Effect Duration", &UiCoinCountComponent::m_coinTextColorEffectDuration)
  75. ;
  76. if (AZ::EditContext* editContext = serializeContext->GetEditContext())
  77. {
  78. editContext->Class<UiCoinCountComponent>("Ui Coin Count",
  79. "Updates collected coin count for the local player")
  80. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  81. ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("CanvasUI"))
  82. ->DataElement(AZ::Edit::UIHandlers::Default, &UiCoinCountComponent::m_coinsTextForLocalPlayer,
  83. "Coin Count Text",
  84. "The text element for the count of coins collected by the local player.")
  85. ->DataElement(AZ::Edit::UIHandlers::Default, &UiCoinCountComponent::m_recentlyChangedCoinTextColor,
  86. "Just Changed Color",
  87. "Briefly show the coin count in this color whenever a coin count changes.")
  88. ->DataElement(AZ::Edit::UIHandlers::Default, &UiCoinCountComponent::m_coinTextColor,
  89. "Coin Color",
  90. "The common text color to use for coin count.")
  91. ->DataElement(AZ::Edit::UIHandlers::Default, &UiCoinCountComponent::m_coinTextColorEffectDuration,
  92. "Effect Duration",
  93. "The duration of the color change effect when a coin count changes.")
  94. ->Attribute(AZ::Edit::Attributes::Suffix, " milliseconds")
  95. ;
  96. }
  97. }
  98. }
  99. } // namespace MultiplayerSample