Aggregating results TEB's in Captivate

Intro

This use case is an answer to this question on the user forum Aggregate the results of four text-entry-boxes on the same slide. I thought it to be a good illustration of one of my previous recommendations when preparing advanced actions: think about all possible situations. For that reason I'll explain two different scenarios. The example is created in Captivate 6 but can easily be transformed for 5 and 5.5. To make the rewind possible in the example, I used a third scenario that will not be explained. It is the most complicated one, because I couldn't use the system variable cpQuizInfoPointsscored in this case, that variable cannot be reset.

Example

If you read the thread on the user forum, you'll know that four Text Entry Boxes are used to ask validated entries. Each TEB has its own Submit button, and the sequence is not imposed. The user can choose to have one or more TEB's blank, by just clicking on its Submit button. If you want to avoid blank entries, have a look at an old blog post where I explain the work flow to check  that: Where is Null

When all Submit buttons have been clicked, three situations are possible:

  1. a Success text and a button to the Next section if all 4 answers were correct
  2. a Hint text with a choice between two buttons: Review or Next
  3. e Failure text with only a Review button

The example has only 3 slides:

  1. 'Questions' with the 4 entry boxes and the initially hidden text containers and buttons
  2. 'ReviewSection'
  3. 'NextSection'

Play with it to see the different situations (use the Rewind button)

Here is the cheat sheet:

  • TEB1: Brussel, Brussels or Bruxelles
  • TEB2: Dutch or Nederlands
  • TEB3: 3 or three
  • TEB4: 8 or eight

Objects on Questions slide

In the example (Captivate 6) this slide has:

  • 4 TEB's with their associated variable (which I'll not use in the actions) and Submit button; the scenario to be chose depends on the number of attempts you chose here (Action accordion); I unchecked all captions in the Options dialog
  • 4 Questions (Text Captions)
  • Review button (used a shape from button category, added text to it): not visible, triggers simple action to jump to Review section
  • Next button: not visible, triggers simple action to jump to Next section
  • Three texts: Success, Hint, Failure (used shapes - added a character Sarah); not visible

Variables

Besides the variables associated with the TEB's, that will store the chosen answer, I created  5 user variables:

  • v_1, v_2, v_3, v_4 with an initial value of 0, will get the value 1 when the user has submitted that TEB; those variables are not necessary in the first scenario
  • v_total: initial value=0, will store the total number of TEB's that have been confirmed by their Submit button

Scenario 1

For this scenario the attempts for all the TEB's are set to 1.This means that the user can click only once on the Submit button, cannot change his mind.

Events and variables 

Each Text Entry Box has two events: On Success and LastAttempt. In this scenario it is possible to trigger the same advanced action TEBCheck by both events and for each TEB. 

I used the variable v_total to count the number of times the Submit button is clicked, each one will only once result in an action because the attempt is set to 1. 

To make it possible to check the number of correct answers, I checked 'Include in Quiz' in the Reporting accordion with score left to 1point. That way the system variable cpQuizInfoPointsscored can be used to check the number of correct answers.

Advanced Action (conditional) TEBCheck

This action has 4 decisions (see screenshots in Gallery) - ELSE is never used

  1. Always: is a mimicked standard action, to increment v_total
  2. TextCorrect: checks if both variables v_total AND cpQuizInfoPointsscored have the value 4 which means that all TEB's have been submitted and all answers were correct. Then the appropriate text and the Next button are made visible (I also had to make the actor SaraSmall visible)
  3. TextHint: checks if all TEB's have been submitted (v_total =4) AND if the score (cpQuizInfoPointsscored) equals 3. In that case the appropriate text, the Next and the Review will get visible
  4. TextFailure: checks if all TEB's have been submitted (v_total =4) AND if the score (cpQuizInfoPointsscored) is less than 3. The appropriate caption will get visible and the Review button

There is no need for ELSE, if none of the conditions is fulfilled the user can just go on submitting TEB's because in that case v_total is not yet equal to 4. Also there is no need to hide text/buttons because only one of the decisions can result in a positive answer, they are mutually exclusive.

Note: I wanted to keep this scenario as simple as possible, only one advanced action that is triggered by 8 events (Success, LastAttempt for each TEB). Real programmers could blame me for this, because for the LastAttempt, which is in reality a Failure event, the second decision TextCorrect can never be fulfilled! So for the purist: create two different advanced actions, and for the LastAttempt action you can delete the second decision, which results in 3 decisions for that action instead of 4 for the Success action I described here.

Scenario 2

If you want to allow more than one attempt the previous scenario would not work because the value of v_total is increased with each click on a Submit button. Example: if you allow 2 attempts for each TEB, the value of v_total would result in 4 if both attempts were used on two TEB's, and that is not what you want.

Events and variables

That is the reason for using the variables v_1....v_4 that will be set to 1 each time the Submit button is clicked for the corresponding TEB. And the counter v_total will not be created by incrementing, but by calculating the sum of the 4 variables v_1...v_4. That way the value can never exceed 4. 

Because the variable v_... depends on the TEB, now I'll need to create an advanced action for each TEB: CheckTEB1, CheckTEB2, CheckTEB3, CheckTEB4. For the lazy user: you can use this action both for the Success and LastAttempt event; for the purist: create a slightly different action for the LastAttempt event, in which you delete the second decision TextCorrect (see note in first scenario).

Advanced Actions (conditional) TEBCheck1 .... TEBCheck4

Those actions have the same 4 decisions as in the first scenario, even better, only the first decision (mimicked standard action) has to be changed. You have to assign the value 1 to the corresponding variable v_1.... v_4 and the variable v_total is calculated with 3 subsequent Expression statements. Remember: no functions like Sum are available, and you can use only one operator (+) in a statement, hence that sequence of Expressions.

Have a look at this Always decision for the first action TEBCheck1

Use the Duplicate function to create the similar actions TEBCheck2... 4. The only editing to be done is to change the variable highlighted in the screenshot! Nothing else has to be edited, but be sure to attach the correct action to the correct events.

"Beat the system" - save time creating Advanced Actions (Captivate)

Intro

Wondering about the title? I borrowed it from the answer of the user about my solution for her problem in this thread: http://forums.adobe.com/message/4859612#4859612 'Very brilliant way to beat the system, I am impressed...'

To create that solution, I followed my own instructions described in Look before you leap... and Be a Captivate ecologist. The user had created a solution, but it was taking so  much time to duplicate and edit the advanced actions, reason why she looked for help. 

The example in this post was created with Captivate 6, in which I again used a lot of shapes because of their unique possibilities. This is not possible in previous versions, so I'll explain the changes to be made to the example for versions 5/5.5. 

Look at the end of the post: for CP6-users I offer a template with the advanced actions, that can be easily customized (instructions included). 

I extended the solution so that it also includes an answer to a question that often pops up: conditional showing of a Next button when all information has been viewed. The simple solution where this condition is not required, is also available in the template. The user was hiding/showing the play bar for that purpose, but I choose to hide/show only a Next (shape) button. For previous versions, the version with the play bar will be easier.

User wanted to have the same work flow on a lot of slides: user has to click several buttons to show Text Captions, after having clicked all buttons. She had created advanced actions triggered by the buttons to achieve her goal, but the problem is that duplicating this for a lot of slides means a lot of work because the text captions have different content on each slide, so a unique ID was needed for each of them which means tiresome editing of the advanced actions pointing to those Text Captions.

Example

Have a look at this movie. It has only 4 content slides after the introduction slide. each of them has 4 buttons, that will show a Text container. The content of the containers is different on each slide. The Next button, that is also on the Intro-slide will only appear when all Text has been viewed.  The text container at the bottom shows the number of the content slide and doubles as a button to hide all text. The last slide has some tips for those who get the template (Captivate 6 only).

Captivate 6 solution

Slides - objects

  1. Slide Intro has a shape button BtNext, displayed for the rest of the project, placed on top and pausing at 2 seconds. 
  2. Slide Content1 has a lot of shapes, all are displayed for the rest of the project and all placed on top; look at the screenshot of that slide with the Timeline and you'll see from top to bottom:
    • BtnsGrp: object group with 4 shape buttons (Btn_One, Btn_Two, Btn_Three, Btn_Four), configured as buttons and pausing at 1,5secs each. Those buttons will trigger an advanced action that has not to be edited depending on the slide, thus allowing the Display for rest of Project tming.
    • Bt_HideAll, a shape button that shows the text 'Slide x' and is also configured as a button to trigger a simple advanced action that hides all text captions. This shape button ihas no pause, is displayed for the rest of the project, same action triggered on each content slide.
    • CaptionsGrp: object group with 4 shapes (TC_1, TC_2, TC_3,TC_4) used as Text containers. As you see they show only a variable, which allows me to display them as well for the rest of the project. The content will change if the value of the variable is changed. That is the 'trick'.
       
  3. Slides Content2...Content4 have no objects at all.
  4. Slide End has an Interaction (Accordion)

Tip!!: 

Be careful when creating the Text Containers TC_1... to make them big enough to show the largest text you'll have to put in, and when inserting the variable to change its length (default value = 15) so that it will show all the text

 

Events - triggers

Content slides: On Enter for those slides will trigger an advanced action Enter_Connectx (where x is the number of the content slide). The primary goal of that action is to populate the variables shown in the text contaners TC_n.  It will also hide some objects. The template has an alternative if you do not need that condition for the next button, and the alternative action is EnterConnectx . Those actions are different for each content slide. 

End slide:  On Enter will trigger the action EnterEnd that will hide all the objects that were displayed on the content slides and the Next button.

Bt_One, Bt_Two, Bt_Three, Bt_Four: On Success will trigger advanced actions Show_One, Show_Two, Show_Three, Show_Four. The template has also the alternatives ShowOne, ShowTwo, ShowThree, ShowFour if you do not need the condition for the Next button to appear only after having viewed all text.

BtHideAll: will trigger a standard advanced action that hides all text containers.

Variables

I created these user variables:

  • v_slide will store the content slide number that is displayed in the shape button BtHideAll; default value = 0 but I reinitialized it to 1 on the Content1 slide as well (in case user gets back to that slide)
  • v_one, v_two, v_three, v_four: variables that will contain the text for the corresponding text containers TC_1, TC_2, TC_3 and TC_4; default value=0
  • v_show1, v_show2, v_show3, v_show4: with default value 0 will be used to track if a text container has been viewed because then they'll get the value 1 (toggle)

No system variables were used in this case.


Advanced actions

Enter_Content1: a standard advanced action, triggered on entering the first content slide. It is different from the other content slides, because I assign the value 1 to the variable v_slide. The screenshot is self-explanatory: re-initialisation of the variables v_show1...4 that are reused on each slide, hiding the Next button and Captions, initialising v_slide.  The cumbersome part is assigining the text to the variables. I suggest to put the text in a text caption off stage and use copy/paste. 

Enter_Content2, ....and all subsequent content slides trigger a similar advanced action as the first content slide with the exception of the v_slide assignment that is replaced by incrementing v_slide using the Expresison statement.

EnterEnd: standard action that hides a lot of objects

HideAllCaptions: very simple standard advanced action:

Show_One and similar actions Show_Two... Show_Four

This is a conditional action with two decisions:

  1. Always: a mimicked standard action that will show the appropriate Text Container, hide the other text containers and toggle the variable v_show1
     
  2. Next? is the real condition, checking the values of the toggles v_show1....v_show2 and showing the Next button when all have been set to 1. You do not need Else actions.
     

Captivate 5/5.5 solution

You can create the same solution in those versions, with those changes:

  • You do not have object groups, so some actions will have a lot more statements because you have to hide each object by a separate statement
  • On first content slide, replace the Text Containers by Text Captions that can also be displayed for the rest of the project and placed on top.
  • On first content slide, replace the shape button BtHideAll by two objects:
    • a text caption including the variable v_slide, displayed for the rest of the project and on top
    • a click box on top of that text caption that triggers the action HideAllCaptions; that click box cannot be displayed for the rest of the project but you can copy it and paste it to all subsequent content slides in one action. since it will always trigger the same action
  • On first content slide, replace the shape buttons Bt_One... by simple buttons. Again, they cannot be displayed for the rest of the project but they will always trigger the same advanced action. So, use the same copy/paste work flow as described for the previous click box.

 

Template (Captivate 6)

No link to a template, sorry. Although I like blogging and sharing, I dislike the lack of communication using this blog medium. Please, if you want me to send you the template in person, you'll have to contact me and provide an e-mail address. Either you try to reach me on Twitter (will follow you so that a DM with address is possible) or you use a private message on the user forums for Captivate. Would love to hear the reason of your request...

Limit Review to Incorrect Answers (Captivate 6)

Update: you can find a new version, HTML compatible and using newer features in this post=µ:



Intro

Because this question "While in Review Quiz process, is it possible to review only the slides which have been answered incorrectly?" popped up already multiple times on the user forums, I thought it could be interesting to create an easy solution. The solution will not work with random question slides, because the On Enter Slide event is not available for such slides. 

Example

Play this movie to see the result. It has 5 question slides of different types, some with partial scoring, most with penalties. Only one attempt on Question level but two attempts are allowed on Quiz level. I dragged the Review button under the Retake button on the Score slide, to avoid confusion After the second attempt you can click the Review button on the Score slide, and only the questions that have been answered incorrectly will be visible, the correctly answered questions are skipped automatically.

Slides and events

The movie has 8 slides: Title, Instruction, 5 Question slides and the Score slide. Here is a screenshot of the Advanced Interaction panel (F9):

In this panel you see that I used the Success and Failure events of the Question slides, they always trigger the same advanced action Questx, where is x is the number of the Question. I also used the On Enter events for the Question slides and for the Score slide.

 

Variables

In the actions I will use the system variable cpQuizInfoLastSlidePointScored that stores the score of the last Question slide, immediately after the two-step process to submit the answer. Because this variable is reused for every question, I have to copy its value to a user variable for each slide. For this purpose I created as many user variables as the number of questions, labeled:

v_quest1, v_quest2, .... v_quest5 with a default value of 0

Too bad that we do not have a system variable that indicates when the user enters Review mode. So I created another user variable, a boolean that has an initial value of 0 but will get the value 1 when in Review mode.

v_review boolean (0,1)

To check this mode I will use the system variable cpQuizInfoAttempts. This variable stores the number of the present attempt on Quiz level when the first question of that attempt is started. But I will check only on entering the score slide (see Advanced Actions, EnterScore).

 

Advanced actions

Quest1, Quest2, Quest3, Quest4, Quest5 (standard advanced actions)

Those actions are triggered both by the Success and Last Attempt events for the corresponding question slide. They have only two statements:

  1. will store the value of cpQuizInfoLastSlidePointScored in a user variable; this variable is the only word to be edited in the duplicates 
  2. because a standard action is not releasing the play head, I preferred to add the statement 'Go to Next Slide' over 'Continue' to avoid waiting time for the user

You see two screenshots: the action accordion of the Quiz Properties panel for question slide 2 and the advanced action Quest2.

EnterQ1, EnterQ2, EnterQ3, EnterQ4, EnterQ5 (conditional advanced actions)

These are triggered by the On Slide Enter event for each Question slide. The condition (IF) to be checked is an AND combination of two:

  1. Is the user in Review mode? This is done by checking the value of the variable v_review.
  2. Has the user a positive score for this question? Done by checking the value of the corresponding variable v_questx (where x = number of the question). Since some questions have partial scoring, and there are also penalties, this doesn't mean that the question was answered totally correct. If you want to skip only for totally correct answers, you have to change this second condition, asking if the score was equal to the maximum score for that question (cpQuizInfoPointsPerQuestionSlide stores that information, so the condition would then be: IF v_quest(x) is equal to cpQuizInfoPointsPerQuestionSlide). 

If both conditions result in True, the slide will be skipped ('Go to Next Slide'), else the play head just continues. Here the screenshots for the second question slide:

EnterScore (conditional advanced action)

This action is triggered on entering the Score slide and will store the value 1 in the user variable v_review when the last Quiz attempt has been taken.  At that moment the system variable cpQuizInfoAttempts will be equal to the maximum number of attempts. There is no system variable for that maximum number, so you'll have to check it and type it in as a 'literal' in the condition. 

Here is a screenshot of that action, only the IF/Then part. For Else a simple Continue statement is OK. You'll see I have also a second decision, used to show the correct feedback on the score slide. As I mentioned before, I'm a bit embarrassed by the fact that the default feedback message shifts always to Times New Roman font. So I replaced it by showing/hiding a smart shape used as text container. 

Conclusion

The proposed work flow can also be used for versions 5 and 5.5. The actions are rather simple, and the only cumbersome work is the duplication, editing (although limited always to changing one variable name) and attribution to the correct event. One could create a template to avoid having to recreate at least one original action and variable. 

Statements (Advanced Actions) in Captivate 6 (list)

Intro

Recently at DevLearn 2012 I coached some Captivate users for Advanced actions in a preconf workshop. Besides a cookbook, which I will not publish publicly, I also offered them a table describing all available statements in the Advanced Actions dialog box. The list with system variables has been explained in a previous article, with a link for a free download of that list. This post will describe the Statements list that you will also be able to download for free at the end.


Table

The list with statements has 4 columns

  • Statement: as it appears in the dropdown list of the first column in advanced actions, I used the same sequence as provided there.  Sometimes statements will be greyed out in the list because they are not available in that situation.
  • Explanation: trying to explain what exactly is the meaning of the statement

  • Comments: has more explanation, warnings and tips about the statement

  • Simple action?: shows if the statement is also available as simple action in the action accordion for an event; some are only available for certain events, which explains the subdivision of this column in:
    • On Enter (slide event)
    • On Exit (slide event)
    • Object (Success or Last Attempt for an interactive object)

I added a small table on page 2 with actions that are only available as simple actions, and not in the dropdown list for advanced actions. If you do not understand the comment about 'No action' (last line), please watch this video about the difference between a simple and an advanced action.


Link

I posted the pdf on acrobat.com; use this link  to download your free copy. Would love to see your comments.

Buttons on Question/Score Slides in Captivate 6?

Intro

On Thursday 4th of October I presented a webinar about my favourite new feature in version 6: shapes used as buttons. In this blog you could already read how to use those shape buttons on Master slides or timed for the rest of the project. Using them on question slides is a bit more tricky as I explained in the webinar. Question slides are always like difficult kids to handle, and this didn't change with regard to shape buttons. 

Individual Shape button

Inserting a shape on an individual question slide is not a problem, and there is no limltiation: you can even insert a button from the Buttons category (that is already converted to a button and has an action attached to it).

Some tips:

  • Be careful if you provide a pausing point for the shape button. A question slide has its pausing point by default at half its duration. This pause will be released after the second step in the submitting process (1st = Submit, 2nd = Y or click on slide). If the shape button pauses before the Question slide pause, clicking on it to do something (like showing a text caption, an image, playing audio) will not be possible after the second step of the submitting process is completed. If you have the shape button pausing after the question slide pause, the playhead will stop at that pausing point after the submit/Y process has been done which could confuse the user.
  • If the objects that pop up when clicking the shape button do cover up the question, do not forget to provide a possibility to hide them again, either with the same or with another button.
  • It will probably be necessary to reset everything when returning to the slide (if this could happen, perhaps for a second Quiz attempt or Review). You can use the On Enter event of the slide for that purpose.
  • It can be annoying to select an object on a Question slide that is not one of the native Question slide objects that have always priority. It is much easier to select them in the Timeline than on stage.

Shape buttons for multiple question slides

As you know from previous blog posts, the real power of shape buttons is that they can be used on master slides or timed for the rest of the project so that they can be used on multiple slides without having to copy/paste and to edit all (advanced) actions because the ID's of objects change on each slide. But here there are some problems for using those work flows on question slides as I discovered. Here is the history of my exploration, if you want to skip immediately to the example and how it was created, feel free:

  1. If you check the Timing dropdown list for a shape button on a question slide you'll see that the option 'Show for rest of project' is NOT available.Difficult kid.... you know :-) This means that the work flow where you extend the life of a shape button on a first question slide to all question slides is impossible.
     
  2. However it is possible to put a shape button on a Question master slide (you have to put them on all the master slides that you need for the questions). This work flow remains possible but has its restrictions: the shape button has no ID which means that it cannot be hidden/shown on discrete slides, it cannot be timed, and if you choose a pause (not to be recommended in this case) it will always be at the end of the slide. 

  3. When opening the dropdown list for the actions in the Action accordion, you'll have a new surprise: some options are dimmed, not available. You cannot show/hide anything, nor apply an effect. It is logical that Disable/Enable are dimmed as well, because none of the question slide objects can be controlled, and a shape button itself cannot be enabled/disabled. It is the only interactive object allowed on a question slide.
     
  4. But when you choose 'Execute Advanced Actions' and open the dialog box, you'll have another surprise: here the three actions banned from the simple actions list are available. That is a relief, isn't it? But weird...

  5. So I tried out an example - you'll see it in the movie. I wanted to offer the user a shape button that would pop up a text container (shape) showing the value of the present question slide (points attributed to it) and the score obtained until that question. For both data there is a system variable: cpQuizInfoPointsPerQuestionSlide and cpQuizInfoPointsscored. So this text container can be the same for every Question slide. The way to go is to create that Text container, display it for the rest of the project. That way it has a unique ID and can be popped up with the same advanced action on each question slide. Bummer, new surprise: you cannot time any object on a question slide, not even a text container, for the rest of the project. Why do I not use a simple text caption? A text caption can indeed be timed for the rest of the project, but.... as most objects on an Question slide it will always been stacked under the default Question slide objects like answers. And I want the popup message to be on top. And yes, this is indeed only possible with shapes used as text containers!

  6. "Never give up", trying to find a workaround. I put the text container shape on the slide before the first question slide (it is hidden anyway at the start), and.... it shows up on each question slide. So issue solved, kid (question slide) is 'tamed' by Lilybiri :-).

  7. Now up to the score slide, want to replace the review message by something that the user can pop up by clicking on a button. Trying to add a shape button to the score slide, and that is possible! I can add a rollover smart shape as tooltip without any problems. Now I add some hidden text container shapes, and I can use the Arrange menu to pull them to the front of the stack. Great! Created an advanced action to pop up the right text based on the Quiz result, works fine. But... the text containers will be behind the score text captions, another disappointment because I was able to use the Arrange menu. I also tried out to put the shape button with the action on the master slide used for the score slide, but same result: no way to get my text containers on top of the default text of the score slide. The simplest solution would be to create your own score slide, using the quizzing system variables of course.

Example movie

Watch this example: each question slide (3) has an Information button, toggling a text shape on/off. You'll read there the number of points attributed to the present question and the total score obtained so far. There is a button on the score slide (with tooltip) to show a review message.

Setup 

Slide 1 (Title): has the text bubble QstInfo, that is invisible, timed for the rest of the project and put on top:

Master slides for Questions (here MCQ and Hot Spot) have a shape button (used the 'i' button from the buttons category) top right, that triggers an advanced action Quest_Info. The button doesn't pause. 

First Question slide (Q1) has a line shape StopLine that will be used to create the toggle aspect. It is timed for the rest of the project as well and placed on top like the Text bubble QstInfo on the first page.

Score slide: I deleted the review messages in Quiz, Settings, Quiz Result Messages and tucked the Review placeholder out of the way. I added a shape button InfoBt (from the buttons category as well) with another rollover shape as tooltip. Created two shapes with image and text that are initially invisible: OKReview and NotOKReview. The shape button InfoBt triggers a conditional advanced action Review

Advanced Actions

Quest_Info triggered by the shape button on the question Master slides is a conditional advanced action with one decision. To create the toggle aspect I used the approach explained in Toggle Shape Buttons - scenario 3, which needs a user variable v_visib. The more elegant scenario 4 from that article is impossible because the button is on a master slide.

Review is triggered by a shape button on the Score slide. It is again a conditional action with one decision, and self-explaining:

Useful?

I hope that my struggle with the 'difficult' question slides will have led to some tips that could be useful for you. Again, shapes prove to be a game changer, even though there are still some unexplainable quirks. I'm waiting for your comments.

Widgets in Adobe Captivate (list)

Intro

If you have been visiting my blog you'll know that I wrote quite a lot of articles about using the Widgets that are available in the Captivate box (both in versions 5, 5.5 and 6). There is not much documentation about those widgets available. So I decided to list up the widgets, possible use cases and sometimes a link to blog posts that are explaining more in detail the use of that widget. And of course, added my own comments. Feel free to download the list, link is below.

Structure list

I grouped the widgets this way:

  1. Static widgets without variables (those widgets are supported for HTML5 output)
  2. Static widgets with variables (supported as well)
  3. Interactive widgets (not supported for HTML5 output)
  4. Question widget (not supported)

In the table you'll also see if the source code is available for the widget, which is the case for all, except the A3C widget.

Link

Download the list from acrobat.com using this link. No need to have an Adobe ID.

Would appreciate if you let me know this list is useful, or if you want to add more comments. It is limited on purpose to the widgets that are included with Captivate. If you are looking for external widgets, I recommend visiting the Widget Treasury.

Intermediate Score Slides

Update: 

An upgraded post, which takes advantage of the new features in more recent versions, have been posted. Check it out:

Intermeidate Score Slides in 2020

Intro

Even in Captivate 6 only one quiz per file is possible, although you can have a pretest as well in the same fle. A question that often appears on the forum like the one in this thread: "...I'm adding a quiz for each of the individual sections within a file (3 in total). I'd like for the user to see how well they've done in each section, but there is only one score page in my project and it only comes up when the quiz has been completed". 

In this post I'll try to explain a possible solution, with custom score slides after each section similar to the default score slide that pops up after the last question slide of the file. Have first a look at the example movie to see the result.

Example

You'll find three sections with only a quiz in this example: Geography, Politics, General (subject = Belgium). Of course, normally you'd have also content slides in those sections but I suspect that regular readers of my blog do not need those any more. You can take the quizzes in any order. When you have finished all quizzes, a button will appear that will navigate you to the Total Score slide, which is the default Score slide. I think my custom score slides are prettier :-)

Scores of the different sections, question slides can be found in this Advanced Interaction view:

Slides

You have seen this sequence of slides:

  • Slide Intro with Continue (Shape) button
  • Slide Choice where you can choose the subject (3 shape buttons with simple Jump to actions); after a quiz the user is navigated back to this slide and completed quizzes are marked; when all quizzes are done the (shape) button Total Score (Jump to last slide) appears on this slide;
  • Slide Group Geography: with 3 Question slides (Q1_Geo, Q2_Geo, Q3_Geo) and a slide GeoScore; maximum possible score = 10p
  • Slide Group Politics: with 3 Question slides (Q1_PolQ2_PolQ3_Pol) and a slide PolScoremaximum possible score = 15p
  • Slide Group General: with 4 Question slides (Q1_GnrlQ2_GnrlQ3_Gnrl, Q4_Gnrl) and a slide GnrlScore  maximum possible score = 20p
  • Slide TotalScore   

Variables

To keep track of the score and the number of correctly answered questions for the partial quizzes, I created user variables. The percentage is calculated and stored in another variable. In the example those variables are shown only on the intermediate Score slides, but if wanted a summary can be offered at the end, showing the results for all sections.

Since there are 3 sections, I have 3 trios of variables, none has a default value to start with:

  • v_geoscore, v_geoqst, v_geoperc will store values of score/correct questions/percentage for the Geography quiz
  • v_polscore, v_polqst, v_polperc will store values of score/correct questions/percentage for the Politics quiz
  • v_gnrlscore, v_gnrlqst, v_gnrlperc will store values of score/correct questions/percentage for the General quiz

Another variable v_null (empty variable) was used to check if a Quiz had a result to mark the Quizzes as done in the second slide Choice, and eventually present the button to advanced to the Total Score.

Advanced Actions

With this article I focus first on the intermediate score slides. I didn't calculate the maximum possible score, nor the total number of questions, but just typed them in.

To populate the defined variables (score, number correct questions, percentage) I used the Quizzing system variable cpQuizInfoLastSlidePointScored. This variable is reused after each slide, so I can only get use it immediately after each question slide. That is the reason for the advanced action, triggered on entering the question slides, starting with the second question slide. The action is the same for all question slides in a section. Here is an example for the section Geography:

Conditional advanced action Ent_Q_Geo

This action is triggered On Enter for slides Q2_Geo (for the first question slide) and Q3_Geo (for the second question slide).

I adopted the (almost) the same way as Captivate to count the number of correct questions: for questions with partial scores, the question is counted as correct if only part of the question is correct. Not totally the same way, because I require that the score has to be positive, because with Captivate depending on the penalties even a negative score is possible for a question with partial scores and one part correct, rest incorrect. That is the reason for the IF: score of the previous question has to be positive. In that case the variable v_geoqst is incremented. Both for correct and incorrect questions the score is added to v_geoscore.

For the groups Politics and General a similar action has to be created. It will be applied to all question slides except the first of the section.

Conditional advanced action Ent_Q_Geo

To add the result of the last question slide, I used an On Enter action for the score slide, that is different because it has also to calculate the percentage to be shown (v_geoperc) and to show the proper text caption for Success/Failure.

This action has two decisions: 

QPrevCorrect: has the same statements as Ent_Q_Geo plus the statements to calculate the percentage. As mentioned I did type in the maximum possible score (10, 15 or 20 for the 3 quizzes). 

 

Passed?: shows the proper text (used a smart shape as text container), based on the result.

 

Conclusion

This article did focus on how to create intermediate score slides.  I will not explain in detail the work flow I used for the choice slide to mark the visited quizzes, which was done with another conditional action. I used also the new discovered functionality that you can have two smart shape buttons in an exact same location and switch between them (see toggle shape buttons)

Workshop Advanced Actions - DevLearn 2012

Preconf Workshop Advanced Actions

Intro

 If you are a regular visitor of this blog, you will be surprised that this time you'll not find a tutorial. I am so looking forward to be able to train for the first time "IRL" about the subject I have been exploring since a couple of years in this blog: Advanced actions to extend Adobe Captivate's functionalities. And while preparing this workshop (and some other presentations for DevLearn) I wanted to share my excitement with you.

Training approach

My students are well aware of my ideas for efficient training, but you probably only know me from written tutorials. I'm the kind of trainer that loves throwing the student in the water, a lot more than trying to explain how to swim... and I'm persuaded that a training is a lot more efficient if the trainee has made a lot of mistakes (even stupid ones) and was able to find the reason for the mistake and enjoyed the discovery of a solution.

This approach is natural to me, since it is my personal preffered way or learning as well. You all know that finding good documentation, books about advanced actions in Captivate is a tough, almost hopeless adventure. I gave up that search a long time ago, and just plunged into them, learning from all my stupid mistakes. And then I tried to solve use cases for other users, thanks for helping me to learn more. I hope now to be able to share the results of those learning experiences in this workshop. 

Topics

We'll spend some time to discover things, using small exercises in the morning session.  Be sure: you'll get a list with tasks to choose from, both for total newbies and other attendees. And... it is not forbidden to cheat! Perhaps your neighbour has accomplished a great way to solve her/his chosen task!

  • System variables:
    • to show info and save time
    • to perform action
  • User variables (take control)
  • Variables associated with TEB and widgets
  • Snippets (bit hidden) = small advanced actions
    • attached to available shape buttons
    • how to edit to extend their power
  • Custom navigation for your project
  • Shape buttons: powerful and new
  • Simple vs Standard action
  • Conditional action with one decision
  • Condtional action with multiple decisions
  • Events
  • Reusing actions,variables with template

And let's design a simple game in the afternoon session, after all we are in Las Vegas, not? You will be using the discoveries of the morning and learn some good practice, tips and tricks:

  • analysis of possible situations: 
    • collaboration with colleagues
    • worksheet with example analysis
  • choosing events, variables
    • avoiding pitfalls
    • reusing variables
  • labeling can save a lot of time
    • beware - I'm a labeling freak
  • conditional actions: use of flow chart
    • useful and a necessity for complex condtitions
  • work flow for creation actions and testing
    • using copy/paste intelligently
  • timesaving tips/tricks

What do you think?

As usual, I'm hoping to read some comments on this writing. Even if you will not be able to participate in this training. Add your ideas, would appreciate it more than ever. I'm so looking forward to this workshop. 

I'm copresenting as well on the DevLean conference with two great friends : 

Engage Learners with Widgets and Effects in Adobe Captivate  with Joe Ganci

Best of Two Worlds: Integrating ZebraZapps Interactions in Captivate  also with Joe Ganci

Rapid Development Tool Showdown: Captivate vs. Lectora  with Rebecca Goldberg

System variables in Captivate 6

Update: using CP2017 or CP2019?  There is a new version of the table in this article

Intro

Update: for readers using Captivate 7-9, updated list with system variables in this article.

Quite a while ago I wrote some articles about using variables in Captivate 5. And they had links to complete lists with the system variables available in that version. Nothing much changed for 5.5 but now in version 6 there are not only a bunch of new variables, but the old variables starting with 'rd' have disappeared (from lists). At the end of the article you'll find the link to download a pdf with all the system variables, grouped in categories. For each variable I offer you the explanation (not always the same as in the Variables dialog), the type (number, text, Boolean or other), Default value (if available), comment (sometimes with a link to an example). 

In this article I will focus on some tips, and on the new variables in the categories.

1. Movie Control

This category is very important, because most of the system variables here can be controlled by using simple or advanced actions. One exception: cpCmndPlaybarMoved is an internal variable, read-only.

Deprecated old variables starting with 'rd' have been replaced, in the list those names are orange instead of white. Their functionality remains the same. 

  • cpCmndGotoFrame & cpCmndGotoFrameAndResume
  • cpCmndNextSlide & cpCmndPrevious
  • cpCmndPause & cpCmndResume

Warning: in version 5.5 both variables cpInfoCurrentSlide and rdInfoCurrentSlide (see next category) existed, now the last one is not available in dropdown lists any more. But they were not identical: numbering for cpInfoCurrentSlide starts with 1, whereas it starts with 0 for rdInfoCurrentSlide! In a some of my blog posts about 5/5.5 I used this statement to Replay a slide in advanced actions:

Assign cpCmndGotoSlide = rdInfoCurrentSlide    (in CP5/5.5)

This worked fine because both variables started with index 0. In 6.0 you can still create the same statement, by choosing the option 'literal' instead of 'variable' and typing in the rd-variable (not available in the list). If you do not like typing, you have to replace the previous statement by:

Expression cpCmndGotoSlide = cpInfoCurrentSlide - 1  (in CP6)

This explains the perhaps confusing snippets (small advanced actions) attached to the shapes in the button category. Have a look at the buttons Start (snippet: startSlide) and End (snippet: lastSlide).

New variables: only one cpCmndTOCVisible allows you to show/hide the TOC if this is in Overlay mode. It is a Boolean variable, with default value = 0, which means that the TOC is not visible.  Too bad that this variable was not added in the dropdown list for "Assign" in the Actions accordion. This list only shows these variables like in previous versions:

  • cpCmndShowPlaybar
  • cpCmndMute
  • cpLockTOC
  • cpCmndCC


2. Movie Information  

All the variables in this category are read-only. They are often used in combination with the Movie control vars described above.

Deprecated old variables: marked again in orange in the table:

  • cpInfoCurrentFrame
  • cpInfoFPS
  • cpInfoFrameCount & cpInfoSlideCount

Not replaced: rdInfoCurrentSlide  (see Warning in 1. Movie Control)

New variablesnone

 

3. Movie MetaData

Those variables are also read only. Most values are looked for in the fields of the Project Information dialog box. Two mystery variable are cpInfoCourseID and cpInfoCourseName.  The explanation in the Variables dialog box points to the same Project Information, but no fields are available there. I also checked if they point perhaps to the SCO information, but seems not to be the case either. Perhaps the mystery will be cleared ... in version 10? 

No new variables, no deprecated ones neither in this category.

These variables are useful to insert in Text Captions on (master) slide or in templates, instructing the user to fill in the fields in Project Information.

 

4. System Information

Logically those variables are also read-only, can be useful in the same way as the variables of the previous category. Sorry for the comments about certain variables that seem to assume that all Captivate users should be American. 

No new variables, no deprecated ones neither in this category.

 

5. Quizzing

All variables in this category are (still) read only. With a lot of new features in Quizzing, there are several new system variables available. Not enough for me, as you can detect from some of my comments in the table. 

There are no deprecated old variables, all were already cp-variables.

New variables

cpInQuizScope: Quiz scope is now dynamic, whereas in previous version the scope was very 'rigid', linear, starting with the first slide having a scored object (question slide or scored interactive objects) and finishing with the score slide or - in case of no score slide - with the last slide having a scored object. No way to jump out of that sequence of slides, which caused a lof ot frustration. In Captivate 6 the scope starts the same way, but now the scope will extend dynamically when the user jumps out of the sequence to view a content slide. It will only end when the user views the score slide. This system variable, if you insert it in a text caption (on master slide or timed for all the project) will show you whether you are in a quiz scope. It will have the value 0 (default) before the first slide with a scored object. Then its values switches to 1, will remain so until the score slide has been viewed.

cpQuizInfoNegativePointsOnCurrentQuestionSlide: Penalty is now possible, and this variable will show the maximum Penalty on each question slide, it is a reused variable. Its positive companion is cpQuizInfoPointsPerQuestionSlide. Do not confuse with the points scored by the user for a question slide, which will be stored after the slide in the variable cpQuizInfoLastSlidePointScored.

cpQuizInfoPretestPointsscored:  this will be populated with the score obtained for pretest question slides only. Its counterpart for the real test is cpQuizInfoPointsscored. This last variable is visible on the score slide.

cpQuizInfoPretestScorePercentage:  is the pretest version of cpInfoPercentage (which is for the real test, visible on the score slide).

cpQuizInfoPartialScoreOn: for questions where you choose the option partial scoring this variable will have the value 1, whereas the default value (no partial scoring) is 0.

Missing variables

I really think some more variables should be available. If you have a look at the Advanced Interaction view (F9) for a project that has a pretest as well as a normal test, you will see that the value of Total Points is the sum of the maximum possible scores for both pretest and test:

This shouldn't be a problem, you can see clearly the difference in this view between the pretest and normal test questions. But I have problems with:

  1. cpQuizInfoTotalProjectPoints/cpQuizInfoTotalQuizPoints: both variables will have the same value after the project, although they are not populated at the same moment. BUT: this will be the same total as you see in the Advanced Interaction view. This means that you do not have the separate values of the maximum for the Pretest and for the Test, and that there is no system variable available for the maximum score that is visible on the Score slide (which is for the Test only). If you want to create your own score slide, you'll have to do some maths yourself or by advanced actions. Same if you want to show a score slide for the Pretest alone (which is by default not available).
    I would like to have a system variable for the maximum score of the Pretest (that is used by CP to calculate cpQuizInfoPretestScorePercentage) and for the maximum score of the Text (use by CP for cpInfoPercentage).
  2. cpQuizInfoTotalQuestionsPerProject/cpQuizInfoTotalUnansweredQuestions: again, the numbers will be the sum for Pretest and Test. And the values shown on the score slide are for the Test only. System variables to create a custom score slide are not available, whether you want one for the Pretest or for the Test.

  3.  cpQuizInfoTotalCorrectAnswers: happy to tell you that here only the Test questions are counted, not the Pretest questions. However, if you have activated partial scoring, you have to know that a question is counted correct always when at least part of the question is correct. Depending on the settings, this can mean that a question is considered correct even if it has a negative result (example: many answers, one correct, lot of penalties for all the incorrect answers). That seems a bit weird.

Link

The PDF is no longer available, please download the table with system variables in CP8, link is in the top of this post. There are indications about changes with former versions.

Reset Effects in Captivate 6

Intro

For a recent webinar about conditional advanced actions I recreated a file in Captivate 6 to check a Sequence of clicks, as described in the article. You can play with this file in the Example section. In this version I used a lot of custom motion path effects to put the cards on a stack. If the sequence is not correct, there is a reset button to offer the user a new attempt. And that meant that the motion effects had to be reset. I was very happy to find an easy way for this work flow, and that is the goal of this article.

Example

Play with this movie that has only 4 slides: on the first slide you choose between two ways of playing and will be navigated to either the second or third slide depending on the choice. On slides 2 and 3 in case of wrong answer you can reset the cards to their original position, on slide 2 this will happen with the Next button, after you checked the sequence with the Question Mark button. On slide 3 you have a reset button? Last slide will only be reached in case of a correct answer. Want to cheat? The sequence is 57142

Work flow

The work flow is pretty simple: you have to return to the very first slide, and using an advanced action on entering that first slide, redirect again to the slide just left. And the objects that had moved will be back in their original place, the effect is reset. I tried out different other work flows like navigating to the previous slide, but for some reasons it only is functional if you return to the very first slide. In the example movie, the On Enter action for that first slide is a bit more complicated because I have some more actions to be done, but in the next example I keep it really simple, just having the focus on resetting the effects.

Second example with details

Description

This example has 5 slides: Intro, TimeBased, ButtonTrigger, AATrigger and Summary. On slides 2,3,4 you'll find an effect applied to one object, first time-based, then triggered by a button and at last one triggered by an advanced action attached to another button. On slides 2 and 4 other objects with effects will appear, which was not possible for the slide with the button that triggers an Effect, because you can only apply one effect that way.

Shape buttons

I used default buttons from the Shape Button category, but changed the triggered actions. On the Intro slide there is only a Next button (used a rollover shape as tooltip). On slide 2 you'll find 3 buttons, timed for the rest of the project (and hidden on the last slide Summary). Each of them has a tooltip as well, and they all have a pausing point near the end of the slide, but play button pauses a little bit before the others:

Reset button: the default action for this button is 'StartSlide', and this is what I wanted it to do.

Play button: has a different functionality, depending on the slides

  • on slide 2 (TimeBased), slide is paused on entering, and this Play button will just release that pause by the statement 'Assign cpCmndResume with 1'. The playhead will continue, and the three objects that start on different moments will get visible with their effect.
  • on slide 3 (ButtonTrigger): no need to pause on entering, I covered the original play button with a transparent shape button that triggered the Effect on the hexagon by a simple action, thus limited to one object with effect.
  • on slide 4 (AATrigger): no need to pause on entering; again I covered the original play button  with a transparent shape button that triggered an Advanced action NewApply with two statements: "Apply Effect..." and "Continue". This button pauses at exactly 1secs, whereas the other objects appear after that time (see timeline). The Continue statement is needed to release the play head so that the other objects appear with their effect.

Advanced Action EnterIntro

This action, triggered by the On Enter event for the first slide (Intro), has to be conditional. It has to check if this slide is visited for the first time. To achieve this I created a user variable v_visited (no default value, so empty to start with) that will be set to 1 when the slide is visited for the first time. On all following visits, the user is navigated back to the last visited slide, the slide on which he clicked the Reset button. And that makes the magic happen: the object that was moved by the applied effect is back in its original location. The conditional action is rather simple:

IF v_visited is equal to 1

THEN Go to Last Visited Slide

ELSE Assign v_visited with 1

When returning to the last visited slide, all objects will be in their original place. Even if you have clicked twice the Play button! Try it out with the example movie. You'll see a different behaviour depending on the slides:

  1. On Slide 2 (TimeBased): pressing the Play button a second time will not have any effect, since the play head has stopped at the pausing point of the Next/Reset button and all effects have been played.
  2. On Slide 3 (ButtonTrigger): pressing the Play button another time will replay the Effect, since it is triggered by that button. But motion effects are always relative to the present position of the object. So.... the hexagon will move outside of the stage. 
  3. On Slide 4 (AATrigger): if you press the Play button again, the hexagon will move again (outside of the stage), but not the other objects. Their effects were time-based and the play head is at a position after those effects. If I had applied the effect to those objects by the Advanced action as well, they would have played. But then it was not possible to start the effects at different times.