Micro-Navigation in Adobe Captivate


One of my Captivate friends asked to show him by example the possibilities of navigation using frame numbers. Great idea for a blog post, hope it will help you too.
Every Captivate users does know how to navigate to the next, the previous or another slide. But navigation within a slide is a bit more complex, that is what I call 'micro-navigation'.


Play this movie to understand what I will try to explain. It has 5 slides:
  1. slide Intro with an Effect on the Text Caption, try the button Replay to see the playhead returning to the first frame
  2. slide Choice where you'll be asked to choose a type of object; to illustrate the Replay again, watch the fading in effect on the Text Captions; Replay will not result in resetting the Radiobuttons widget, it is the widget coming with Captivate that doesn't have this functionality (as available in Jim Leichliter's extended version)
  3. slide Objects1 where the playhead will jump immediately to the chosen object, and stop; you can release the playhead by the Continue button or go to the Next slide; again I provided the Replay button, which will jump to the first frame of the slide and you'll be able to see all the objects 
  4. slide Objects2 where the playhead will jump immediately to the chosen object, and playhead will continue on the timeline
  5. slide End with an Exit effect that has again a Replay button

Frames and variables

Captivate's output is a movie, and like all movies it has a frame rate: during each second 30 frames are running before your eyes, and due to that speed it results in a continuous movement. You can change that framerate of 30fps but I'll keep with it in this post. This means that:
  • a slide with a default duration of 3secs has 3x30 = 90 frames
  • if you insert a default button or Text Entry Box, with its default duration of 3secs (90 frames), it will by default pause at 1,5secs which means after 45 frames
  • if you insert a default click box on that slide for the duration of that slide, it seems to pause at the end of the slide, but really pauses at frame 87 of that slide
  • if you have a long project, check the total number of frames in the Project Info panel (Captivate 5.5 only)
If you need information about frames during runtime, you have access to these system variables (belonging to my favourites):
rdinfoCurrentFrame: offers you the number of the frame where the playhead is at that moment; if you watched the sample movie carefully, you will have seen that I'm showing the value of this variable continuously, inserted a text caption with that variable on the master slide

rdcmndGotoFrame: allows you to move the playhead to a frame with a certain number and nothing else, the playhead will not continue

rdcmndGotoFrameAndResume: same as the previous one but now the playhead will continue its journey on the timeline


Fine, but mostly I will add a user variable v_startframe. Why? Because of my laziness, I do not want to calculate the absolute number of a frame that sits 1.3secs from the start of slide 45 of a project. First thing when needing micro-navigation: create a user variable that will store the number of the first frame of each slide. It can be reused for each slide, which means that the small advanced action that you'll need to create to store that value can be reused without any change as well.

Replay = navigate to first frame of the slide

It is as simple as that:
  1. store the number of the first frame of the slide in the user variable v_startframe by executing this standard advanced action on entering the slide:
       Assign v_startframe with rdinfoCurrentFrame
    the second statement is a good practice for standard actions to avoid that the playhead just stops
    this advanced action is used in the sample file for the slides 1 (Intro), 2 (Choice) and 5 (End); it is incorporated in an advanced conditional action for slides 3 and 4.
  2. create another standard advanced action to be triggered by the button Replay:
       Assign rdcmndGotoFrameAndResume with v_startframe
    not necessary to add Continue here, because of the system variable


This is illustrated on the slides Objects1 and Objects2. Have a look at the timeline of Objects1 in the Gallery (Objects2 is constructed identically); from bottom to top you'll see those objects:
  • Rectangle with a duration, a timeline of 3 seconds; translated in frames: from frame 1 up to 90
  • Circle starting at sec. 3 and equally with a duration of 3 seconds: from fram 91 to 180
  • Triangle start at sec 6 with a duration of 3 secs as well: from frame 181 to 270
  • Polygon start at sec 9 with a duration of 3 secs: from frame 271 to 360
  • 3 buttons: Continue, Next and Replay for the duration of the slide, but pausing at sec11 (anywhere after the start of the Polygon was OK)
To navigate to the proper object, based on the Choice made by the user in the second slide, a conditional advanced action is needed to be triggered on entering the slide Objects1 (and Objects2). Because I also want to store the first frame number in the user variable v_startframe, this conditional action will have 5 decisions 1-3 have an image in the Gallery:
  1. a mimicked standard action StartFrame, to store the frame number 
  2. decision Rectangle that sets the playhead to the first frame of the slide, because Continue is lacking here, contrary to the Replay action, the playhead will not move on
  3. decision Circle uses an Expression to navigate to second 3 (because of the speed I used 89 instead of 90, watch the frame numbers on the slides)
  4. decision Triangle is similar to Circle, but with replacing 89 by 179
  5. decision Polygon is similar to Circle, replace 89 by 269
For the next slide Objects2, I used a similar advanced action with one big difference: the system variable rdcmndGotoFrame is replaced by rdcmndGotoFrameAndResume. That is the reason the playhead will continue, contrary to the slide Objects1.


Hope this has explained my view on micro-navigation? 


9 responses
I am delighted that I am now able to do this micro-navigating! Thank you for sharing.

That is funny that you say that you are "lazy" and that is why you use the v_startframe instead of calculating the starting frame number of each slide manually. I decided to follow in your footsteps and see if I could be be even "lazier" and not have to calculate any frames at all.

Let's say I'm micro-navigating to the circle which starts on second 3.

I first created a new user variable called v_framemultiplier.

Originally, to navigate to the frame with the circle you use:
expression rdcmdGotoFrame = v_startframe + 89

What I did was insert an expression one line before that saying:
Expression v_framemultiplier = 3 * 30
(this represents 3 seconds multiplied by 30 frames per second).

Then, instead of having to calculate that the circle frame is +89 frames from the beginning of the slide, I use:
expression rdcmdGotoFrame = v_startframe + v_framemultiplier

In this way, I can be very lazy and not have to calculate the starting frame of each shape.

LOL, and why not use the available system variable rdinfoFPS, that offers you automatically the framerate (even if you have changed it from the default 30 to another value)?
Wonderful idea! I did not know about rdinfoFPS.

Lazier and lazier! How fabulous!

Hello Lilybiri! I've "seen" you in the Adobe forums and appreciate your willingness to help.
{Note: this is such a basic thing but is SO difficult in Captivate and it is frustrating that one cannot get to the start of a slide without herculean machinations!}
I see by your screen caps that you use a version other than 4 of captivate.
I'm trying to get this to work in version 4 but the command doesn't work but the setting of a variable does.
Do you know if your wonderful solution is only available in later versions of captivate (I was thinking not since I was able to do everything you did but it didnt work).
I tried a hack in Flash but didn't work either (that says more about my AS3 skills than Captivate though.
Thank you from a most frustrated Captivate user.
Will try to figure it out for CP4, but not immediately because I'm too busy. My intuition tells me it should be possible, but can only fully confirm after trying it out.
Hi, I've used your method in my project, where on the 2nd slides attempt (next visit) I've created advanced action to jump to the last frame of this slide. I've few objects appearing on timeline for example 2, 4 and 6s after slide start with transition effect. Variable v_nextvisit added to the next button; advance action on slide enter: if v_nextvisit=1 Actions: Assign cpCmndGoToFrame with 25930 (used cpInfoCurrentFrame to find the last frame for my slide). And, everything working fine with HTML5 output, however when I used swf there is only empty screen without object (also (used cpInfoCurrentFrame variable to check, and slide stop on the first slide's frame). So, my idea was that during the next slide attempt I wish to jump to the last frame with all the objects on screen without any transition. Thank you for your help Peter
Peter, this is a blog, not the place to post that type of questions. Go to the Adobe forums where you can post screenshots of the actions and situations. I just wonder why you want to go to the last frame of a slide? That has no sense at all, unless you have a pausing point at the end (which is also not a good idea). The playhead will continue immediately to the next slide. If you added the action 'Pause' to the On Exit event of the slide (bad idea as well), that action will be done only after leaving the last frame, so you'll not stay on the slide neither.
Hi Lieve, Thanks for your very informative blog! I've combined the tips in this post with another about using multiple decisions to mimic nested IF statements, and found some peculiar behaviour! I'll post in the Adobe forums, and hope you'll stop by.
1 visitor upvoted this post.