Files
o3de/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Flipbook/Flipbook.lua
T
Steve Pham 38261d0800 Shorten copyright headers by splitting into 2 lines (#2213)
* Updated all copyright headers to split the longer original copyright line into 2 shorter lines

Signed-off-by: Steve Pham <spham@amazon.com>
2021-07-16 15:25:48 -07:00

195 lines
8.3 KiB
Lua

----------------------------------------------------------------------------------------------------
--
-- Copyright (c) Contributors to the Open 3D Engine Project.
-- For complete copyright and license terms please see the LICENSE at the root of this distribution.
--
-- SPDX-License-Identifier: Apache-2.0 OR MIT
--
--
--
----------------------------------------------------------------------------------------------------
local SequenceStates =
{
Properties =
{
FlipbookContentSpriteSheet = {default = EntityId()},
FlipbookContentImageSequence = {default = EntityId()},
StateText = {default = EntityId()},
PlayStateText = {default = EntityId()},
PlayStateImage = {default = EntityId()},
StartButton = {default = EntityId()},
StopButton = {default = EntityId()},
LoopTypeDropdown = {default = EntityId()},
ImageTypeDropdown = {default = EntityId()},
ImageTypeDropdownSpritesheetOption = {default = EntityId()},
ImageTypeDropdownImageSequenceOption = {default = EntityId()},
ImageDescription = {default = EntityId()},
},
}
function SequenceStates:OnActivate()
self.requiresInit = true
self.tickBusHandler = TickBus.Connect(self);
-- By default, we'll use sprite-sheets for flipbooks. The user can switch
-- to the image sequence version of the flipbook via dropdown.
self.currentImage = self.Properties.FlipbookContentSpriteSheet
end
function SequenceStates:PrintImageDescription()
local currentFrame = UiFlipbookAnimationBus.Event.GetCurrentFrame(self.currentImage, 0)
local zeroPaddedFrameString = string.format("%02d", currentFrame)
if self.currentImage == self.Properties.FlipbookContentSpriteSheet then
UiTextBus.Event.SetText(self.Properties.ImageDescription, "flipbook_walking.tif (index " .. zeroPaddedFrameString .. ")")
else
UiTextBus.Event.SetText(self.Properties.ImageDescription, "flipbook_walking_" .. zeroPaddedFrameString .. ".png")
end
end
function SequenceStates:OnTick(deltaTime, timePoint)
if self.requiresInit == true then
self.requiresInit = false
self.numLoops = 0
self.sequenceStartedString = "Sequence Started"
UiElementBus.Event.SetIsEnabled(self.currentImage, true)
self.canvas = UiElementBus.Event.GetCanvas(self.entityId)
-- Handler for OnAction callbacks
self.canvasNotificationBusHandler = UiCanvasNotificationBus.Connect(self, self.canvas)
-- Handler for flipbook animation start/stop callbacks
self.flipbookNotificationBusHandler = UiFlipbookAnimationNotificationsBus.Connect(self, self.currentImage)
-- Initialize button states
UiInteractableBus.Event.SetIsHandlingEvents(self.Properties.StartButton, true)
UiInteractableBus.Event.SetIsHandlingEvents(self.Properties.StopButton, false)
self:PrintImageDescription()
-- Disconnect here because we want to change the value of the image-type dropdown value
-- but we don't want to be notified of the change. The first time this logic gets
-- executed the handler will be nil, however, so we have to guard against that
if self.imageTypeDropdownNotificationBusHandler ~= nil then
self.imageTypeDropdownNotificationBusHandler:Disconnect()
end
if self.currentImage == self.Properties.FlipbookContentSpriteSheet then
UiDropdownBus.Event.SetValue(self.Properties.ImageTypeDropdown, self.Properties.ImageTypeDropdownSpritesheetOption)
else
UiDropdownBus.Event.SetValue(self.Properties.ImageTypeDropdown, self.Properties.ImageTypeDropdownImageSequenceOption)
end
-- Handler for dropd-down callbacks
self.loopTypeDropdownNotificationBusHandler = UiDropdownNotificationBus.Connect(self, self.Properties.LoopTypeDropdown)
self.imageTypeDropdownNotificationBusHandler = UiDropdownNotificationBus.Connect(self, self.Properties.ImageTypeDropdown)
else
local isPlaying = UiFlipbookAnimationBus.Event.IsPlaying(self.currentImage)
if isPlaying == true then
UiImageBus.Event.SetColor(self.Properties.PlayStateImage, Color(0, 255, 0))
UiTextBus.Event.SetColor(self.Properties.PlayStateText, Color(0, 255, 0))
self:PrintImageDescription()
else
UiImageBus.Event.SetColor(self.Properties.PlayStateImage, Color(255, 0, 0))
UiTextBus.Event.SetColor(self.Properties.PlayStateText, Color(255, 0, 0))
end
end
end
function SequenceStates:OnDeactivate()
self.tickBusHandler:Disconnect()
self.canvasNotificationBusHandler:Disconnect()
self.flipbookNotificationBusHandler:Disconnect()
self.loopTypeDropdownNotificationBusHandler:Disconnect()
self.imageTypeDropdownNotificationBusHandler:Disconnect()
end
function SequenceStates:OnAction(entityId, actionName)
if actionName == "StartPressed" then
UiFlipbookAnimationBus.Event.Start(self.currentImage)
elseif actionName == "StopPressed" then
UiFlipbookAnimationBus.Event.Stop(self.currentImage)
end
end
function SequenceStates:OnAnimationStarted()
-- Setup button states
UiInteractableBus.Event.SetIsHandlingEvents(self.Properties.StartButton, false)
UiInteractableBus.Event.SetIsHandlingEvents(self.Properties.StopButton, true)
-- Set sequence state text
UiTextBus.Event.SetText(self.Properties.StateText, self.sequenceStartedString)
self.numLoops = 0
end
function SequenceStates:OnAnimationStopped()
-- Update button states
UiInteractableBus.Event.SetIsHandlingEvents(self.Properties.StartButton, true)
UiInteractableBus.Event.SetIsHandlingEvents(self.Properties.StopButton, false)
-- Set sequence state text
UiTextBus.Event.SetText(self.Properties.StateText, "Sequence Stopped")
end
function SequenceStates:OnLoopSequenceCompleted()
self.numLoops = self.numLoops + 1
local pluralString = ""
if self.numLoops > 1 then
pluralString = "s"
end
UiTextBus.Event.SetText(self.Properties.StateText, self.sequenceStartedString .. " (" .. tostring(self.numLoops) .. " loop" .. pluralString .. ")")
end
function SequenceStates:OnDropdownValueChanged(optionEntityId)
-- Note: both the loop and image type dropdowns will execute this function
local dropdownText = UiDropdownOptionBus.Event.GetTextElement(optionEntityId)
local textValue = UiTextBus.Event.GetText(dropdownText)
-- If the image type changes, we need to re-initialize based on the new
-- image content entity (either sprite-sheet or image sequence)
local currentLoopType = nil
if UiDropdownNotificationBus.GetCurrentBusId() == self.Properties.ImageTypeDropdown then
if (UiFlipbookAnimationBus.Event.IsPlaying(self.currentImage)) then
UiFlipbookAnimationBus.Event.Stop(self.currentImage)
end
self.requiresInit = true
self.flipbookNotificationBusHandler:Disconnect(self, self.currentImage)
currentLoopType = UiFlipbookAnimationBus.Event.GetLoopType(self.currentImage)
end
if textValue == "None" then
UiFlipbookAnimationBus.Event.SetLoopType(self.currentImage, eUiFlipbookAnimationLoopType_None)
elseif textValue == "Linear" then
UiFlipbookAnimationBus.Event.SetLoopType(self.currentImage, eUiFlipbookAnimationLoopType_Linear)
elseif textValue =="PingPong" then
UiFlipbookAnimationBus.Event.SetLoopType(self.currentImage, eUiFlipbookAnimationLoopType_PingPong)
elseif textValue =="Sprite sheet" then
UiElementBus.Event.SetIsEnabled(self.currentImage, false)
self.currentImage = self.Properties.FlipbookContentSpriteSheet
elseif textValue =="Image sequence" then
UiElementBus.Event.SetIsEnabled(self.currentImage, false)
self.currentImage = self.Properties.FlipbookContentImageSequence
end
-- If changing image type, restore the current loop type to the new image
-- content entity and reset the frame.
if UiDropdownNotificationBus.GetCurrentBusId() == self.Properties.ImageTypeDropdown then
UiFlipbookAnimationBus.Event.SetLoopType(self.currentImage, currentLoopType)
UiFlipbookAnimationBus.Event.SetCurrentFrame(self.currentImage, 0)
self:PrintImageDescription()
end
end
return SequenceStates