| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- -- step animation forward or backwards 'amount' number of frames
- local function step(self, amount)
- -- frame_count is the number of frames in the current animationm
- local frame_count = go.get("#sprite", "frame_count")
- -- cursor is the normalized (0.0 to 1.0) animation cursor
- local cursor = go.get("#sprite", "cursor")
- -- normalized length of a frame in the current animation
- local frame_length = 1 / frame_count
- -- move the cursor amount number of frames
- cursor = cursor + (frame_length * amount)
- -- wrap animation if advancing beyond the first or last frame
- if cursor < 0 then
- cursor = cursor + 1
- elseif cursor >= 1 then
- cursor = cursor - 1
- end
- -- set new sprite cursor position
- go.set("#sprite", "cursor", cursor)
- -- calculate the current animation frame and show on a label
- local current_frame = 1 + math.floor(cursor * frame_count)
- label.set_text("#frame", ("%d / %d"):format(current_frame, frame_count))
- end
- -- stop automatic animation playback
- local function stop(self)
- -- only try to stop if there is an active timer
- if self.playback_timer then
- -- visually update the start/stop sprite to show the 'start image
- sprite.play_flipbook("controls#playstop", "start")
- -- cancel the animation timer
- timer.cancel(self.playback_timer)
- self.playback_timer = nil
- end
- end
- -- start automatic animation playback using a timer to advance the animation
- -- one frame at a time
- local function start(self)
- -- visually update the start/stop sprite to show the 'stop' image
- sprite.play_flipbook("controls#playstop", "stop")
- -- start a timer to advance the animation roughly every 0.15 seconds
- self.playback_timer = timer.delay(0.15, true, function()
- step(self, 1)
- end)
- end
- function init(self)
- msg.post(".", "acquire_input_focus")
- self.playback_timer = nil
- end
- function on_input(self, action_id, action)
- if action.pressed then
- -- key left or mouse click on left part of screen
- -- step animation one frame backwards
- if action_id == hash("key_left")
- or action_id == hash("mouse_button_left") and action.x < 240
- then
- stop(self)
- step(self, -1)
- return
- end
-
- -- key right or mouse click on right part of the screen
- -- step animation one frame forward
- if action_id == hash("key_right")
- or action_id == hash("mouse_button_left") and action.x > 480 then
- stop(self)
- step(self, 1)
- return
- end
- -- key space or mouse click in central part of the screen
- -- start or stop animation playback
- if action_id == hash("key_space")
- or action_id == hash("mouse_button_left") and action.x > 240 and action.x < 480 then
- if self.playback_timer then
- stop(self)
- else
- start(self)
- end
- end
- end
- end
|