YouTube-style timer in Captivate

Does anyone have a working solution for displaying the movie duration using system variables and JavaScript? E.g. 01:15 / 03:30

  • I know that the movie duration is available in the TOC, but I don’t want the latter to be visible all the time
  • I have been able to calculate the total time of the project using the cpInfoFrameCount system variable
  • But I’m stuck with the current time. The cpInfoCurrentFrame system variable is what I need, but I can’t convert it to the mm:ss format:
    • I can display cpInfoCurrentFrame in a caption and it increments as the movie progresses. So far so good.
    • If I use a Captivate while loop for the conversion to mm:ss, the “Execute JavaScript” action is only executed once e.g. (while cpInfoCurrentFrame < cpInfoFrameCount)
    • I can’t add a JavaScript while loop for some reason as an action: it is removed when I save the action.
    • The “Expression” action is not powerful enough.

Any ideas?

The post YouTube-style timer in Captivate appeared first on eLearning.

Calculate Expiry Date (Expression, variables)


Today a user asked for help with coding to get an expiry date for a certificate slide,  see thread

It is a nice use case for the use of both system and user variables, and the use of the mysterious Expression command which is only available in the Advanced Actions dialog box (not as simple action in the Actions tab of the Properties panel). If  you are totally new to the use of variables, here are some links:

Using System Variables – part 1

Using System Variables – part 2

User Variables – Intro

Workflow described here step-by-step will show how to get the expiry date, 3 years from the present date can be calculated and stored in a user variable. It can of course also be done with JS, but I kept to one advanced action. Since I live in Belgium, I used the date format ‘day/month/year’. It is rather easy to change this to another sequence like the one used by ISO or in the USA.  Maybe I’ll post an interactive output, where you can choose the sequence of the 3 parameters. It is also possible to go for another way of presenting the date, but that is not treated here. Insertion in the Learning Interaction  ‘Certificate’ is not included neither.


1. Variables

You will be using these system variables, all from the category System information:

  • cpInfoCurrentYear: its value is a 4-digit number, at this moment 2019
  • cpInfoCurrentMonth: its value is a 2-digit number, still January at this moment, will be 01
  • cpInfoCurrentDate: its value is a 2-digit number, for me at this moment it will be 29; it may seem bit confusing that I don’t use cpInfoCurrentDay, but that gives a 1-digit number for the sequence in the week. Monday will result in 2 if t Sunday is considered to be the first day of the week in your OS settings.

You need two user variables (how to create them, see third link in the Introduction ‘Why?’)

  • v_year: will be used to calculate the expiry year, which would be 2022 for this user (3 years from now).
  • v_date: will have the full date of expiration after the calculations explained later.

The third variable v_choice has been used to offer a choice between the sequence for the date numbers. That is not part of this workflow.

2. Advanced action – creation

You need to create this advanced action, which is non-conditional I will explain each command:

  1. First Expression calculates the expiry year from the present year (cpInfoCurrentYear) and stores it in the user variable v_year. This is possible since the system variable can be seen by Captivate as a number, and using the mathematical operator +. Result will be of course 2022.
  2. The mathematical operator becomes here a ‘concatenation’ operator: it will add the string “/” to the day number. Do not forget the quote marks, because / is a mathematical operator. Result after this expression is the text:    29/   which will be stored in v_date
  3. Another concatenation replaces the value in v_date  by 29/01   
  4. Third concatenation results in v_date = 29/01/
  5. Last expression gives the final result v_date = 29/01/2019

The need for 4 expressions to get to the final value for v_date is due to the fact that the Expression command can have only one operator. You can use the Copy/Paste functionality in the Advanced Actions dialog box to speed up the process.

3. Assign action to Slide On Enter event

Attach the Advanced Action to the On Enter event of the slide, where you need to insert the variable v_date.

How you can insert a variable has been explained in the very first link I posted under ‘Why’.


  • Change the Advanced action to present the date in another sequence, like ‘Year/Month/Day’. If you are on CP2017 or later, maybe this blog could help.
  • For the fans of conditional actions: try to create a version where the learner can choose the sequence. You’ll need probably another user variable in that case and a multiple decision conditional action.
  • Which dangers exist for ‘cheating’ (I am a former professor) in the use case as described here? How would you cope with those dangers?

The post Calculate Expiry Date (Expression, variables) appeared first on eLearning.

Hiding Custom Navigation buttons – Advanced or Shared Action


I have been writing multiple articles about Shared actions (and Advanced actions), have presented webinars. Someone even labeled me as ‘Empress of Shared Actions’ but I still see this feature ignored by the big majority of even advanced Captivate users.  I will create a list of resources in another blog for those who want to learn more about them. This short showcase is an answer to a question posted today in the portal. A typical use case for shared, actions, but the user tried to do it with one Advanced action. Since I couldn’t ask him for permission to use his question (I am respectful of his privacy as an European), I will not point to the thread but explain the use case here:

  • The navigation in the course is not accomplished by a default playbar but by custom navigation buttons. To make it simple, I will use only three buttons in my example: SB_Next,  SB_Back and SB_Home.
  • On some slides the navigation buttons have to be hidden, maybe because  dedicated buttons will appear at the end of the slide, thus forcing viewing the slide.
  • Because of that request, it is not possible to have the shape buttons on the master slide because they wouldn’t have an ID, twhich means you cannot control their visibility.
  • The Shape buttons have to be on the first slide, Timed for the rest of the project, always on top. This is only possible with shape buttons not with the trhee old types of buttons. Beware: if you use a responsive project developed with Fluid Boxes, objects timed for the rest of the project are not allowed.

One Advanced Action? Possible but cumbersome

The user proposed a solution where the value of the system variable cpInfoCurrentSlide was checked, and based on that number the buttons would be hidden or shown.  One great advantage of this system variable: the index starts with 1, which is exceptional because all the other incrementing system variables start with 0. Hence the Expression needed to restart a slide from its first frame (index of cpCmndGotoSldie starts with 0):

Expression  cpCmndGotoSlide = cpInfoCurrentSlide – 1

To make the use case specific: if I have  50  slides, and I want to hide the buttons on slides 5, 10, 15, 20, 25, 30, 35, 40 and 45 that could be done with one Advanced action like this:

IF cpInfoCurrentSlide is equal to 5     OR
cpInfoCurrentSlide is equal to 10   OR
cpInfoCurrentSlide is equal to 15   OR
cpInfoCurrentSlide is equal to 20   OR
cpInfoCurrentSlide is equal to 25   OR
cpInfoCurrentSlide is equal to 30   OR
cpInfoCurrentSlide is equal to 35   OR
cpInfoCurrentSlide is equal to 40   OR
       cpInfoCurrentSlide is equal to 45   

Hide Gr_Buttons


Show Gr_Buttons

You see that I grouped the three buttons in Gr_Buttons.

Pretty cumbersome, right? Moreover this long condition has to be attached On Enter for each slide, and evaluated (will be fast, but I don’t like that type of long conditions). Moreover, if you change the sequence of slides, add or delete slides, you’ll have to check the advanced action and change the literals: those slide numbers will change. If you need to use this action for another course, you have to edit the condition.

Shared action

I have already blogged a lot about the advantages of shared actions. The action I designed for this use case, may seem bit complicated but it needed a lot of testing and understanding of the use of parameters which are literals. You can have a look at this published file. There is no content on the slides, I just indicated in the title if the buttons had to be visible or invisible. The used master slides is different as well. Reason: when you hide all buttons, there is no pausing point on the slide anymore. That is the reason why I added a transparent shape button covering the slide, and the mention ‘Click the slide to go to the next slide. A shape with two variables is inserted to follow the changes.


I used three variables in this action:

  • v_show: has a default value of 1, because in the default setting the buttons are visible. This value is the only non-compulsory parameter, can be changed to 0 if the buttons have to be hidden.
  • v_visib: one of my popular variables which I import with a shared action as described in my recent post.
  • v_null: because I had to avoid double use of the literal 0, I used this variable with a default value of 0, it is also described in the same post.

The only variable that will be changed is the first one, you don’t have to bother about the other two variables.

The Shared Action, filled in with the two parameters looks in the Preview window as follows:

You have to add this shared action On Enter for each slide. This cannot be done for all slides at once. I’m sorry, but you always have to define the Button group as parameter, my request to be able to promote a non-variable/literal to the status of being always the same is not yet heard. The other parameter (value of v_show) has to be 0 for the slides where the buttons have to be hidden, and 1 for those where you want them visible. Here is an example for a slide where they have to be invisible.

In the Library you can check the usage of the action, 10 instances were used:


As a gift for 2019 you can grab this shared action:


Import it into your course, the variables will be created automatically. You have to create only what you want to hide/show on the slides, group those objects and name them. Now you are ready to use that action On Enter for each slide. The group to be hidden/shown doesn’t have to be buttons, but they have to be displayed for the rest of the project.

The post Hiding Custom Navigation buttons – Advanced or Shared Action appeared first on eLearning.

Understanding/Using System Variables – part 2


In a first blog about System variables I offered a free table with description an references for all system variables. If you didn’t get that table yet, please get it from that article. That older post described shortly all caregories. It had focus on the variable categories s which are read only, and how they can be used to show information in a course and/or for editing/debugging reasons (like cpInfoCurrentFrame).  Not treated in that first part was the Quizzing category because I already had a detailed explanation in this blog post.

Here the focus is on that very special category ‘Movie Control‘. It is special because those variables cannot be inserted for viewing in a course.  More important is that they can be controlled, changed by the developer on runtime which is not possible for any variable for the other categories. Learning how to control these variables can be a good step up to getting started with advanced or shared actions: more complicated actions than the simple actions which you find in the dropdown list on the Actions tab of an interactive object.


Since this post is meant for users starting with variables, I want to explain some terms that are important expecially when working with system variables of the Movie Control category. You can skip this part is it sounds familiar to you.

Slides versus Frames

In questions on the forum I often see confusion between those two terms. A normal cptx project is slide-based. That leads many users to suppose that Captivate is functioning like Powerpoint, but that is not true. Essentially Captivate will lead to a movie, not to a sequence of slides which is typical for a presentation. That movie is more than a simple video, because interactivity is based on offering control to the user and to do so you need to  pause the movie. This is not the case with a video: the learner can pause the video, but the developer has no influence of therm with the exception of the interactive videos. I use the term interactive movie for a fully interactive published Captivate file. An interactive video is not better at all, more of a hype at this moment, because is interactivity is more limited. Although a PPT can have animations with some duration and seqeuence, it is not a real movie unless you capture it as a movie.

Any video/movie is played at a certain ‘speed’. The speed is defined in frames per second or FPS. The default speed of a published cptx file is set to 30FPS (but a video demo at 15FPS). If you keep the default length of a slide in CP, which is 3 seconds, that means that you have 90 frames in that slide.

I explained these terms already many times. As you can see in the table, several system variables in the Movie Control category are linked to navigation between slides or frames. Understanding the difference is required.

Boolean variable

A variable can have any value in Captivate: a text (often called string) or a number. When you look in the table you will see the typical values of the system variables. Many of them also aren:  from the ‘Boolean’ type. That is a variable that will have only two possible values: 0 or 1, true or false. You can interchange them easily, I prefer using the numbers 0/1 because it is less typing.  In the Movie control category many variables are indicated as Boolean: cpCmndCC, cpCmndMute, cpCmndNextSlide, cpCmndPause, cpCmndPlaybarMoved (pretty useless, internal), cpCmndPrevious, cpCmndResume, cpCmndShowPlaybar, cpCmndTOCVisible and cpCmndLockTOC.

Like other variables Booleans have a default (or start) value which you find also in the table. Often it is 0, which means the situation described by the variable is turned OFF. But there are exceptions. Some examples:

  • cpCmndMute: default value = 0, which means that audio is playing
  • cpCmndPause: default value = 0, which means the course is not paused
  • cpCmndShowPlaybar: default value = 1, which means that the playbar is visible
  • cpCmndTOCVisible: default value = 0, which means that the TOC in overlay is not visible


When used as a verb, this means ‘switch between two situations’.  I didn’t use the word ‘state’ to avoid confusion with states in a multistate object. You can toggle a playbar between the visible and hidden situation, audio between muted and not muted, a TOC in overlay between expanded and collapsed, any object or group between visible and invisible. There is a close relation between Boolean variables and toggling. For that reason a couple of versions ago the new command/action Toggle’ appeared in the dropdown list of the Actions tab, and in the advanced actions dialog box.

Some people also use Toggle to indicate a Toggle button. That is a button which allows to switch between two situations£. Several buttons on the Captivate playbar are toggle buttons: turning CC on/off, play or mute audio, pause or continue the movie.

Use Cases

Toggle buttons

CC on/off

If you use custom buttons instead of a playbar, which is recommended for any non-linear project, you can create a toggle button to turn Closed Captioning on/of. Beware: in versions before CP2017, Closed Captioning was always turned off when the course started. That is the reason why the default value of cpCmndCC  is still indicated as O. With the new more elaborated features for CC, you also have the possibility to turn CC on for a project. In that case the variable will have the value 1.  To create a toggle button for this feature you can use a shape button on the main master slide (no need for pausing) if you are in a non-responsive project. For a responsive project with fluid boxes, using the main master slide is a bad idea (no fluid boxes possible), you’ll have to use the other master slides. Use guides for the creation of the footer fluid box, so that it is consistent for all the master slides.

Create this simple action to be triggered by the Success event of the button:

Since you don’t need this button to pause the slide, you have to uncheck the option ‘Pause Project until user clicks’.

Audio on/off, Playbar on/off, Overlay TOC expand/collapse, TOC lock/unlock

The workflow is exactly the same as for the CC toggle button. In the screenshot you see that the appropriate system variables show up and can be selected.

It is of course possible to replace a toggle button by two  buttons. Example: a button to show the overlay TOC  and another one to hide it. In that case you could use the commands ‘Show TOC’ (same result as Assign cpCmndTOCVisible with 1) and ‘Hide TOC’ (same result as Assign cpCmndTOCVisible with 0). This is  an alternative for the tiny expand/collapse buttons attached top left of the slide. A toggle button saves space on the slide, easier to manage.

Two buttons are also possible for Playbar on/off  (Show Playbar/Hide Playbar) and for locking/unlocking the TOC for navigation (Lock TOC/Unlokc TOC).

For Audio on/off you do NOT find such simple actions in the Actions tab.  ‘Play Audio’ is meant only to play an audio clip, but has no effect on slide audio, object audio, nor background audio. Similar with ‘Stop Triggered Audio’ which can only stop clips started with the command ‘Play Audio’. If you want two buttons, you will need to use the system variable cpCmndMute, with the Assign command:

  1. Assign cpCmndMute with 1    will mute audio
  2. Assign cpCmndMute with 0     will have it play again

To create a toggle button with a different look when the situation is toggled, you’ll need an advanced or shared action. Have a look at:

Multiple Toggle Buttons with one Shared Action

Shape category ‘Buttons’ – Challenge

Being a tutorial for newbie (no advanced/shared actions, I will not explain using the navigation system variables for two reasons:

  1. You probably never will use the slide navigation variables  for navigation between slides. It is intuitive to use ‘Go to Next Slide’, muc more than ‘Assign cpCmndNextSlide with 1’
  2. The navigation variable cpCmndGotoFrame is  very important in micro-navigation but that is a more advanced topic that needs the use of advanced/shared actions. If you are interested, have a look at: Intro to Micro-Navigation

However I have a challenge for you! The shape dialog box has a special category labeled ‘Buttons’.

Typical for these shapes: the option ‘Use as button’ is checked off (no pausing point by default). They will trigger an action, which for most buttons is a simple action. You will see that the Mute button  is assigning “1” to the system variable cpCmndMute. The three buttons marked in the screenshot trigger an advanced action: the Home button and the Start button (both marked in red) use the advanced action ‘startSlide‘, the End button (marked in green) uses ‘endSlide‘.  You can open th action in the Advanced Actions dialog box,  by clicking the Browse icon:

Look at the use of the system variables in startSlide :

  • Assign cpCmndGotoSlide with 0          this means: go to the first slide (index starts with 0)
  • Assign cpCmndResume with 1              is the same as Continue

Can you explain the script ‘endSlide’?


A lot more is possible when using the movie control variables in advanced or shared actions. I already posted some links before. Here is a link to a blog post about ‘Replay Slide‘ where you’ll find different scenarios. It will help to understand the importance of frames: if you only get back to the first frame of the slide, reset will not happen if this is done by an On Enter action, or if you have Text Entry Boxes/Drag&Drop slide.

For newbies I plan a third article about user variables and simple use of them (still without advanced/shared actions). Would love to get some comments.

The post Understanding/Using System Variables – part 2 appeared first on eLearning.

Understanding/Using System Variables – part 1


Many years ago I did write out some tutorials explaining how to use variables. They are still available in Adobe’s Knowledge base, but of course the screenshots are outdated since they were created in Captivate 4 and 5. Inspired by a recent thread in the forums, where it took a while to explain the use of variables, I want to write out some posts about Variables. This first article will focus on System variables and include a downloadable table which you can use as reference for them.

What is a Variable?

If you ‘google’ to find a definition of a variable you will get thousands of results. I would say that it is a container identified by a name and the content can change or be changed (is variable). It is a term used in programming languages and applications. It makes them more flexible, powerful. If you are a maths lover, compare this equation: 5 + 6 = 11 with  a + b = c. The a, b, c are variables, and the second equation allows you to create tons of small sums. The first equation uses ‘literals’, and you have only one sum.

Captivate’s System Variables

Captivate has by default 6 categories of System variables and 2 automatically defined user variables. This article is only about system variables, they are available for your use in any project. All the system variables start with the characters ‘cp’. Lables are, as usual in Captivate, unique for each variable and they are case sensitive. It may be confusing that the two  user variables,  created for each new project (cpQuizInfoStudentName and cpQuizInfoStudentID) also start with the same characters..  When you open the dialog box  Project, Variables the type ‘user’ is automatically selected, and you see only those 2 variables. Be sure: those are NO system variables, they are necessary for the workflow of Internal Server reporting, but can also be used with many LMS’s. The certificate interaction uses  cpQuizInfoStudentName as well.

Categories –  table

You can download the free explanatory table from  SysVars

Captivate has 6 categories of system variables. To see them switch to System type in the dialog box:

  1. Movie control: is a very special category, which I will explain in a later article.  They offer a way to control your course by changing a system variable. This is not a normal behavior of variables, and can be considered as a, add-on to more complicated advanced/shared actions. These system variables are also different from those of category 2-5 because their value cannot be displayed in Captivate output.
  2. Movie Information: typical for this movie are the number of slides/frames, the speed (FPS), which frame/slide you are at this moment, etc… All variables of this category are read only. Their value can be used by the developer, they can be displayed in a Captivate file, during Preview and after publishing. I will point out some examples later on that could save you time while developing. In the table you’ll find some references as well.
  3. Movie Metadata: you can add metadata to a course, lot of it can be done using File, Project Info.  The behavior and usefulness are similar to the previous category. More tips below the examples below.
  4. System Information: data about present Date, Time, or which OS you are using if watching on a mobile device are in this category. Like 2-3 these variables are read only but can be used in the same way as those from Movie Information and Movie MetaData. Look in the table for examples.
  5. Quizzing: will not expand on this category because I already posted a blog about using Quizzing System variables
  6. Mobile: has only one system variable which is exceptional because it stores 3 numbers. It cannot be displayed in a course, only be used in actions.

This blog has focus on categories 2-3: they are very useful when you insert them in a course, either during debugging or to be able to show their value in output.  The workflow is the same for all variables that can be displayed (not category 1n nor 6).

Display a variable

The best way to insert a variable to be displayed is this workflow:

  • Create a text container: either a caption or a shape on the slide
  • Go into edit mode, by double clicking or using the function key F2.
  • You’ll get the Character part in the Properties panel. Find tesee three buttons

    First button inserts a symbol, last button a hyperlink, but you need to click the second button to insert a Variable
  • Switch from the default User type, to System.
  • Choose a category under the dropdown list which has by default ‘All’ as choice
  • Select the wanted variable.
  • The ‘length’ is set by default to 50 characters, but you can edit this number. It is essential to do so if you expect the value to be greater than 50 characters (spaces included).
  • Confirm the insertion with the OK button.
  • While editing the variable will appear as in this first screenshot, between double $$. When previewing or after publishing that placeholder is replaced by the value (second screenshot)

Edit and Runtime view

Some examples

1. Slide counter: Slide X/Y

You use two system variables from the category Movie Information: cpInfoCurrentSlide and cpInfoSlideCount. Insert this text on the first slide of your course, and display it for the rest of the project.  Do not forget to check off ‘Always on top’ for the text container.

2. Author name in Theme

You will use the variable cpInfoAuthor from the category Movie Metadata. While creating a custom theme to be used in multiple courses, insert this variable in a text container on the main master slide. Master slides are part of the theme. Do not forget to warn your colleagues to fill in the fields under File, Project Info.

3. Course name in Theme

If you use a Title master slides, you can insert the variable cpInfoCourseName on that master slide as title. That variable also blelongs to the category Movie Metadata. Same comment: Project Info has to be defined by the developer. You can also use this variable in a footer of course.

4. Debugging Timeline

As I mentioned many times, understanding how to pause the timeline, and its consequences on objects is very important. I always recommend to insert a text container with the variable cpInfoCurrentFrame to watch pauses while Previewing the project. It is a variable from the category Movie information. You can see that I apply this recommendation myself in this movie:
Captivate’s Timeline

You’ll certainly find more examples. When used in combination with advanced or shared actions, lot more is possible but that is beyond the scope of this introduction.  One example: to show the elapsed time on the course (the real time spent, not the developer’s time based on slide durations), you cannot just insert the variable cpInfoElapsedTimeMS (from Movie Information) because it is defined in milliseconds. You need to do some simple maths to make it readable to the learner, and that means …. advanced action.

The post Understanding/Using System Variables – part 1 appeared first on eLearning.

Reflective Practitioner – A Learning Curve – Experiment #7


Two weeks ago I was approached by a Curriculum Design Specialist (CDS) on our team who wanted to make use of a very long interview that she had recorded. Initially she wished to splice the audio file into several podcasts but was grappling with the idea of making her learners do more than just listen. We came up with an idea for integrating other events of instruction, namely: THINK-LISTEN-COMPARE. In order to promote a more active listener during independent study, asking a learner to reflect on material covered/his experiences prior to the listening process should be a part of the exercise. Three (3) relevant questions would be asked and a learner would have the opportunity to enter their succinct responses (550 characters or less) in a space provided eg: text-entry boxes. Once completed, they would then move on to listening to the podcast. After listening, that they would view a summary of their responses alongside those raised by the speaker in the interview – prompting a compare and contrast reflection for future course activities or assessments.

Scripted Content (Screen Shot)

As with most of these multimedia instructional design exercises, I often have to insist that the core content is specified by the subject matter expert (SME). To do this, I designed a content planning template and helped the CDS to script the main ideas. I was later able to tweak the appropriate messaging for the potential learning object, and asked another team member to provide us with a voice narration. I intended to take on a full audio challenge with Captivate. Scripting would also help in implementing the closed captioning option (as it turned out though, we did not include closed captioning in this iteration).

I have storyboarded the project below based on the template I created. I will use this storyboard to discuss the Reflective Practitioner Project as Learning Curve #7.

Storyboard of Reflective Practitioner Project

Project Details

Canvas Size: 1024 x 768 px; Time: 6.0 mins, 31.2 secs; 11736 frames; 10 slides; 9.5MB; Responsive Design: Yes.

Published Project Demonstration (Click Here) 

Initial Concerns

The interview/audio file was over 16 mins long (9M so i immediately had a red flag raised for the project size. Added to this complication was my grand idea to use guided audio narration instead of text captions in this project. In past projects I have played around with the slide properties option to add audio there but it extended the length of my slide and as I was trying to avoid that, I knew I had to find another way to insert narration. I also didn’t want Captivate clipping the audio to the length of the slide. Further to that, I didn’t want the audio files starting up again when a user re-visited the branching menus.

Design Process

I opt to create as much as the visual design outside of Captivate using background slides that handle basic aesthetics. It’s my version of a cheap trick that you can try too. You can do much better (I am sure) but my real interest here was to work through the functionality. I typically place objects, avatars, text captions, interactions on these background slides. In a sense, it makes it easier to swap out images and make cosmetic changes outside of Captivate while preserving the functionality I have programmed.

I edited all the audio files myself and used background music tracks to kill some of the awkward pauses, bird noises and other white noise from my colleagues’ narration.

Development Process

1. Title Slide

It contains one object (the arrow shape) which is “used as a button” on the properties panel.  When I previewed the project, the button worked but I also realized that if the user clicked anywhere on the slide it also advanced. This is not something I wanted but raises a good lesson for everybody new to Captivate.

Fix your button properties> On success: Go to the Next Slide> Number of attempts: infinite
I circumvented the challenge I outlined in Initial Concerns by executing an advanced action scripted as “Title” which simply runs the command Play Audio for the selected file that i imported into the project library. Drum roll!  This is a strategy I used for all of the slides with guided narration expect the actual podcast.

2. Introduction Slide

It contains an object with text and another navigation arrow. This slide functions more or less like the Title Slide. Text will always vary per course, module or unit as course developers may choose to highlight the unit objectives etc. This is a question of content rather than functionality though.

What is different about this slide’s properties are the ON ENTER and ON EXIT executing advanced actions. I’ve learned in previous projects that it’s better to do this ahead of a slide with lots of re-visits.

>On Enter – I am playing another audio file “Introduction”

>On Exit – I am setting up the value of my variables (var_listened; var_reflected; Q1; Q2; Q3) to a value of 0, as well as enabling and disabling buttons for the upcoming slides and menus.

This is needed because the CDS specifically does not want the learner to move to the podcast without performing initial reflection around three questions.

3. Main Menu Slide

In addition to the obvious 3 objects “used as buttons” to jump “on success” to various slides, the main lesson here is one of variables and setting up a branching menu. When you are working through your functionality make sure you have your variables displayed (use the eye symbol in the right properties panel close to the re-naming form). This helps you see if your slide is measuring things like you want it to.

I wanted the following:
  • When my user first accesses the main menu, all existing variables should return a value of 0, the guided audio should play, the only active item on the menu should be the “think” button.
  • When my user re-visits the main menu (after having clicked think and performed there), var_reflected should return a value greater than or equal to 3. This is because there are three questions that a user can attempt more than once. The main menu should show that he has attempted that first option and reflecting is no longer available to him, the next active button is “listen” so he moves on. It should also NOT play the guided audio again.
  • When my user re-visits the main menu (after having listened to the podcast), it should show that he has attempted the first two components and they are no longer available to him, so he moves on to the “compare” activity. Once again, no guided audio needs to play here.

I used changing states on the three objects that are “used as buttons” (Reflection_Launch_Button; Podcast_Launch_Button; Summary_Launch_Button). These states are: rollover (inbuilt), down (inbuilt), normal (inbuilt) and attempted (new).

I am executing a conditional action in response to the situation I described above.

4. Reflective Question Menu

This slide contains 3 text caption boxes and 3 objects “used as buttons” which each jump to an individual reflective slide in the project. There is an avatar named “Thinking Tyrell”. There is also a hidden object as a continue button that only show up when all three questions are attempted. There are three variables on this question menu: Q1, Q2 and Q3 which are initially set at a value of 0 but will increment by 1 every time a user submits/resubmits a reflection. In my case, the 0 is more important than the number of times the user decides to change his reflection.

Like the slide before, this menu contains audio instructions that play the first time he accesses it. I do not want it repeating every time he returns to answer another question. Similarly, I only want the user to access the main menu when he was completed or attempted all three questions. I have locked down the navigation in this project.

5. Reflection Slides: Using Text-Entry Boxes, Variables & Variable Length.

As a slide, each one has the following ON ENTER and ON EXIT Properties:

Each slide contains a text entry box. A text-entry box in Captivate will carry a variable name. You can edit it to suit your project. This is useful because I want to display user input on my summary slide so that he can compare his initial reflections with the default answers given by the interviewer.

The style option for my text entry boxes in all 3 cases are set to: RETAIN TEXT, SHOW TEXT BOX FRAME, and in options I allowed a maximum character length of 550,  All cases (lower and upper) as well as numbers. I did not allow auto submit. The user must hit a default submit button to trigger my variables Q1, Q2 and Q3 available on the Questions Interface.

The Text Box itself has actions that can be programmed. I am executing some standard actions for each related text box:

There is another option “On focus lost” for text-entry boxes. This does not apply to my needs, so I did not assign any action there.

6. The Podcast Slide: implementing a play/pause button

This is the only slide in which I used the option to attach an audio file on the slide properties panel. As expected it lengthened the slide and increased the frame count. The audio file was now an automated part of the Captivate movie.

Given that the podcast itself was lengthy, I knew I would have to give users the option to pause/play while listening. I wanted to do this without having them rely on the play bar. I looked at several tutorials hoping to play and toggle audio within an advanced action, but soon realized that in this case, such a script created a stop/restart effect. This was definitely not what i wanted. I needed it to resume right where it had stopped.

Lilybiri had a useful solution using system variables: cpCmndPause and cpCmndResume in a conditional action. I had initially hoped to call them from an advanced action but I realized that they were not available to me when I was developing the script with a statement to Play Audio.

cpCmndPause and cpCmnd Resume work with the overall slide and progress of the project, hence the reason I had to attach the audio to the slide. I added in a design suggestion by Paul Wilson to manipulate the state of my play/pause button instead of using two buttons. When the user clicks pause, it changes the state to play in order to prompt the user to click again to pick back up and so forth. This worked out well.

7. Summary Slide

This slide should not be much of a mystery now. It used some of the same design strategies for playing audio, an exit button, and text captions to call all three text-entry box variables. The thing to remember is to specify the variable length here again. By default it is set to 50 so I extended this to 550 to display the full response of the learner.

Conclusion: Learning is for a lifetime

The “Reflective Practitioner” as a multimedia instructional design activity was another opportunity for me to learn about programmable responses in Adobe Captivate. If you enjoy a challenge, give yourself one today and build something, anything.

Until next time, cvsankars out!