Shared or Advanced? Use case: Hide/show custom navigation

Why this use case?

I have been writing multiple articles about Shared actions (and Advanced actions), have presented webinars, trained developers.. 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 recently 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 (being European I am respectful of his privacy), I will not point to the thread but explain the use case:
  • 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, which 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 three 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 tricky

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
  Continue

ELSE

  Show Gr_Buttons
  Continue

You see that I grouped the three buttons in Gr_Buttons, contrary to the user who had several Hide commands.

Whiy is this tricky?  First of all, if you change the sequence of slides, add or delete slides, you’ll have to check the advanced action and change the literals (slide numbers). Moreover this long condition has to be attached On Enter for each slide, has to be evaluated on each slide, I don’t like that type of long conditions.  If you need to use this action for another course, you have to edit the condition, take into account the number of slides where you have to hide, and the exact slide numbers. Copying an advanced action from one course to another course is always a pain if the action is attached to a slide event, which is the case here .

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:


Extra

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

NavShowHide

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 can have any objects, not only buttons. It is only necessary, that the group is displayed for the rest of the project.

Developing this shared action took a lot of exploring and testing because of two reasons:

  • If you use a lot of literals you have to choose carefully which one can be come a parameter to avoid issues with the action. That is very important if the same literal is used in multiple decisions. It led to my choice of having an empty variable. This kind of problem never happens for advanced actions. You need a different mindset, but that is of course my personal opinion based on lot of testing since shared actions appeared years ago.

  • Sequence is very important in any action, same as for advanced actions. Lot of consultancy jobs where I had to debug actions were due to ignoring this, combined with the typical behavior that you cannot break out of an advanced/shared action as is possible with programming languages.

I would like to explain this in depth, but not with a blog post. A webinar/training or live presentation is the only way to get this done. I expect this to remain a daydream…. very frustrating.

Random Questions; Do's and Don'ts

Intro

It may be a coincidence but recently multiple questions appeared s about using random question slides

  • :Why is it impossible to control custom objects on slides in question pools like Show/hide for a custom feedback in Review mode?
  • How can you create and use a timer for a quiz which has random questions,, and have actions done when a certain time has elapsed? Or show warnings when time has almost elapsed?
  • How can I use remediation for random slides?

There are of course the usual questions like: can I use random question ir Pretest, as Knowledge Check slides (now also in Interactive video), or quiz slides on hotspots  in a VR project?  Can I have a new subset of random ausetions at a new attempt...

In this post I want to explain why some of those workflows are impossible. For some use cases I have a workaround, will mention it but not offer it for free.

Tips for Question pools

You are for sure aware of the fact that all quiz slides, whatever the type, are based on the quizzing master slide (4)s, and the results slide on another master slide. Whether you are working with a responsive or a  non-responsive project, make sure to set up those master slides fully before creating the pools. That means; checking the object styles and edit them when necessary, check the sizes of the embedded objects. One example: if you expect to have long answers, make the answer area as big as possible, maybe by decreasing the height of the feedback messages and other objects. Do never delete an embedded object (they have no individual timeline). If you can uncheck some in the Quiz Preferences, that is fine. Do not forget to check the Default labels under Quiz Preferences. Please do never override object styles. This is eve more important for pools than for normal quiz slides. once I had to edit the master slides quite a lot in consultancy job because the developer has deleted embedded objects. Several pools were connected with the project. Updating the course after having edited the master slides took quite long, needed kot of coffee breaks.

I also prefer to use GIFT files (or the new CSV files) over editing all quiz slides individually. RE-importing a GIFT file is a lot less work than having to edit each individual quiz slide. It is even more important if you need the course in multiple languages.

You probably want all learners to have the same possible total score? In that case you'll need to give the same max score to each question in the pool.  Or use multiple question pools, each with a different score. I feel a T/F question is not 'deserving' the same score as a complicated MCQ  question. Keep the easier questions with a lower score in one pool, the more complicated in another pool.

Examples with (eventually) workarounds

1. New subset of random questions for new attempt in same session

As I understand the workflow with random questions generated from question pools on runtime: each random question placeholder will be replaced by one question from the associated pool based on a random number. That random number will then be excluded for the next random question. At the end all the random question have been generated and are treated like normal quiz slides, based on the setup in Quiz Preferences. They become static, the generating process will not be repeated when a new attempt on Quiz level is started. To confirm my suspicion I added a custom object to the pool questions, that object only appears when you insert new random questions, not on existing questions: there is no dynamic link between the pool and the inserted questions.

Workaround: you need to close the session, and restart the course. If you are transmitting to a LMS with bookmarking (Resume data), the number of attempts will be taken into account.

2. Random questions for Pretest/Knowledge Check slides

There is no possibility to use question pools for these slides, at this moment (log a feature request please) 

Workaround: use normal random quiz slides for them. For Pretest slides you'll not be able to store the data in the Pretest quizzing variables. If you have real quiz slides in the course, you have to be careful. You can convert the imported random slide in a Survey question (could be used of KC slides), or you can uncheck the option 'Reporting'. In both cases the score and percentage on the results slide will be correct, but some quizzing systerm variables will still take into account all questions as you coudl read in my blog about Quizzing System variables. 

3. Random questions in VR projects

You cannot use random questions on hotspots in a VR project. 

Workaround: insert 360 slides i a normal cptx project. Insert random question slides in that project. Use a  Guided status for the hotpsots which show content. The last hotspot can be used to navigate to the random question slides. Beware: when inserting 360 slides in a normal cptx-project the opion to have Overlay  Question slides attached to hotspots disappears. More info in this article.

4. Random questions in Interactive Video

Overlay Knowledge Check slides are supported for Interactive Video. But like normal KC slides, they cannot be random.

Workaround: Use norma random slides which cannot be used as overlay slides. However, you can use bookmarks to navigate to the slides, then navigate back to the video. I will post a blog about this workflow in the near future. 

5. Controlling custom objects in random slides

You can add custom objects to pool questions or even to the master slides, but be careful: for HTML output the stacking order will always be respected (I had a workaround for SWF output). That means that the embedded Quizzing objects will always be on top of the custom objects. Embedded objects do not have an individual timeline, not on the quizzing master slide nor on the quiz slide. You should never delete those embedded objects,  Some  can be unchecked in the Quiz Properties panel (examples: Clear button, Back button, Feedback messages), others not (Question title, Question, Submit button...).

You can have an Advanced/Shared action on a pool question for the On Enter event (quiz slides never have an On Exit event).  A user wanted to use that action to make a custom object visible only in Review mode, using the quizzing system variable cpInReviewMode. That is a workflow which works perfectly on normal quiz slides. The variable is available for pool questions as well, but.... you cannot reference custom objects on the quiz slide. The added custom objects will never appear in the dropdown list for Show, Hide, Disable, Enable.... The user thought this to be a bug, but I don't agree and will try to explain my intuition.

When you add a random quiz slide to a project, as I mentioned it will be generated from the associated question pool. I suspect this to be a copy/paste act.: based on a random number a copy of a pool question is placed in the Captivate project. You probably have experienced in the past the effect of copy/paste to labels? Since every object needs a unique name, the names of the objects on the inserted random question will have a name 'similar' to the name in the original pool question but not the same name.  The advanced action should have been self-edited to reflect that name change. That seems not to be possible, hence the fact that custom objects do not appear in dropdown lists for pool questions. Same happens when you copy/paste a normal slide which has Advanced  attached to the slide events: in most cases those actions will be broken.  It is one of the reasons I always recommend to use Shared actions whenever possible, especially for slide event actions. It is a lot easier to repair the action in that case. However, for random questions that is not possible, you cannot attach a Shared action to a random question, you have to rely on the actions in the pool questions. 

Workaround: I do have a workaround which works perfectly, but I will not offer that one for free. 

6. Using Timer for random slides.

Captivate has a TImer and Hourglass interaction with similar features. You can also time using system variables and advanced/shared actions or JS. 

To use them for random slides, you need to insert the interaction before the first random slide on a normal slide which can be very short. However those interactions are not working very 'exactly', hence I always combine them with system variables.  No details about my workflow. 

7. Remediation workflow

A user asked if remediation would work for random slides, and there my answer is No. It looks very logical to me why this is an impossible workflow using question pools and random questions. Remediation means you have to link to a content slide from the quiz slide on Failure. The content slide needs to have the special command 'Return to Quiz' on a custom Next button. That action will only work when the learner gets to that content slide from a quiz slide, in other situations the Next button will proceed to the Next slide.

Why is this not possible with random questions? A question pool can be used in many files, how ca you exactly define the name or the slide number of the content slide to link to?  You need an absolute navigation link to that content slide, which is totally impossible.

Workaround: do not use a pool, but insert all the questions (with link tot the content slides) in the course. Navigate to a question based on a random generated number (with JS). Make sure that you don't reuse the same random number twice, nor that the non-selected questions can be visited. Turn on Branch Aware in the Quiz Preferences to have a correct value for the quizzing variables on the score slide. A lot of work!

 

 


4 Tips for Interactive Video

Intro

Interactive video is one of the new features in CP2019 (version 11). Over 10 years ago I did choose for Captivate because it had a lot of possibilities for interactivity in any cptx-project, Some users do think that 'interactive video' is the way to go, but to me it is a nice addition especially to make existing passive video a little bit more engaging. To avoid confusion, because already did see a lot of theoretical posts here that talk about normal interactive projects, not about interactive videos, I will continue to point at published cptx- projects as ‘interactive movies’ to show the difference with less interactive 'interactive video'. A standalone interactive video can be nice. However I honestly believe that the combination of interactive video slides with static interactive  slides in a cptx project is more powerful. Later on I will try to show with use cases what I mean. These tips are for 'interactive video' only. 

The first version of interactive video offers the possibility to insert:

  • Bookmarks: which out of the box can be used with the new command ‘Jump to bookmark’ to realize some branching often based on answer to  knowledge check slides.

  • Overlay content  slides: which appear at certain frames of the video on top of the video (can take up part of the screen, with  in a dimmed version of the video in the background). Most Captivate features can be used on those content slides, including advanced/shared actions.

  • Overlay Knowledge Check slides: which are based on the quizzing master slides.  Their appearance is the same as for the content overlay slides. Scored quiz slides are not possible.Contrary to the overlay Quiz slides in a 360 slide, these Knowledge Check slide do honor the used theme, their style can be full controlled. However, you cannot use scored Quiz slides in overlay (which is possible in a 360 slide). 

I will post lin the future a full description of the timeline of interactive video slides, and line up the differences with a normal video. An interactive video is always a slide (synchronized) video, never an event video. Consequence: interactive video is not possible in a fluid box which can only support event video, nor in the state of a multistate object.

In this blog post, I’ll offer some tips for using and enhancing the present functionality of interactive video. I posted an interactive video, as illustration in this article . Explanation of the tips is based on that example, I recommend to watch it if you didn't had time yet.

Tips

Tip 1: Prepare Master Slides for Overlay slides

Interactive video supports two types of Overlay slides; Content overlay slides and Knowledge Check  overlay slides. Both types can have the same size as the project size, but I prefer to have a smaller size for the overlay slides, so that the video itself remains visible in the background (dimmed). That can be done by using a duplicate of the Blank slide, on which you insert a shape with a smaller size than the slide, as background for your content or questions. As with normal content master slides, you can create as many as you need.  Have a look at the 3 master slides used for the example video mentioned before:

Next to the Blank master slide you see two content master slides :

  • OverlayTip: has a bubble shape, semi-transparent as background; the white space surrounding the shape will be ignored in the overlay and show the dimmed video.

  • OverlayWarn: has a different shape, less transparent and also white surrounding space.

The Quiz master slide which I used is a duplicate of the MCQ... master slide. It is necessary to use such a duplicate because you need all the embedded objects with their functionality. I used a rectangular shape as background, not transparent.
Beware: 

  1. use a non-responsive theme, because the Quizzing master slides in a Fluid Boxes theme have a setup with fluid boxes. 

  2. when creating a slides based on this master slide, you need to choose Knowledge Check slides, because normal Quiz slides cannot be used as Overlay slides for an interactive video.

After insertion of 5 overlay content slides and one KC slide, the Filmstrip looks like this (watch the hierarchy symbolized by the smaller size of the overlay slides, and by the icons at the bottom). :

Tip 2:  No fixed duration but a Close button

To me Interactivity means to offer as much control as possible to the learner. Some need more time, some want to proceed quicker. That is why I don’t like the fixed duration for Overlay content slides - which is the default setting.  No problem for the Knowledge Check slides,  the Submit button (with a pausing point at 1,5secs) takes care of keeping the slide available as long as wanted. Same would be the case for a slide with a D&D interaction or when using an interactive learning interaction.

For the static content slides however you need to pause the slide. To achieve that with minimum effort,  I used a shape button on the two master slides OverlayTip and OverlayWarn.:Look at this screenshot, where the Close button is at the bottom left:

For shape buttons on a master slide, the pausing point visible at the end of the Timeline is just an indicator. It will not appear in the Timing Properties because smart master objects have no timing. However, in the default setup, the shape button will pause at the end of each slide, hence the indicator. Look under the Actions tab for the shape button on the master slide. 

The action triggered by the Success event of that button is very simple: ‘Continue‘, to release the paused playhead. Since the pausing point is at the end of each overlay content slide, it will close immediately and the video continues.

Tip 3: Information button

That button is available for the full duration of the project, from the second (video) slide on. . I described the workflow in an older post, which dates from  CP2017: Interactive Video Buttons but is still valid for the present version. It is a simple click/reveal button, which pauses the video and has a close button. That close button takes care of hiding the information and releasing the video playhead.

Tip 4: Navigation Menu

With the Menu button the learner has a TOC to bookmarks available, to review only parts of the video. I described my workflow in this post.

The menu button has a custom state, which is used to close the menu (similar to the Pause/play button of the example video). It triggers this action:

The menu items are hyperlinks triggering advanced actions, which jump to the wanted bookmark and close the menu. As mentioned in the past, for some weird reason the option 'Execute Shared Action' is not available for hyperlinks, or I would have used a Shared action instead of duplicate Advanced actions.

Custom Play/Pause button - version CP2019

Intro

Several years ago I have already created a blog about this topic.

Meanwhile Captivate has added a lot more features: multistate objects, changes in system variables, easier commands etc. Since that question often appears on social media and the old post is also still visited daily, time to offer an easier way. It is also a use case illustraing use of a system variable, following to my recent posts about system variables.  Here you'll discover how you can use an Interactive Video to as training asset for a workflow. It is up to you: video or step-by-ste textual instructions with screenshots.

Why do I prefer a Shape Button?

Buttons have InBuilt states and can have supplementary custom statesI. You can find more info in this  article: States and State Commands

Captivate has 4 types of buttons, which  have 4 InBuilt states: ‘Normal’, ‘Rollover’, ‘Down’, and ‘Visited’. They can all have extra custom states, which allows to create nice toggle buttons showing the situation at that moment. Examples: TOC open/closed, Audio playing/muted, CC visible/invisible etc (have a look at: 1 action = 5 toggle buttons).  The three first states are included in the object style of the button or the shape, the Visited state is not included. Custom states are neither included in the button style.

Text buttons, Transparent buttons (which are not necessarily transparent), Image buttons can NOT be used on master slides, can NOT be timed for the rest of the project.  A shape button can be used on master slides, can be timed for the rest of the project. For a toggle button Play/oause this is a big advantage: you need only one shape button for your project. If you prefer one of the older button types, you would need a button on each slide.

Workflow - Interactive Video

The movie is based on a Video Demo. The CPVC-file was captured at 1280x720. It is embedded as interactive video in a cptx-rpoject with a resolution of 1024x627. The ratio widht/height is not the same because the synchronized interactive video has a top control bar. I extended the functionality of Interactive video, you'll find some tips in my next post.

I will not embed the video in this post, it would be too small. I offer you two links: the first is to the unscaled published movie, where you'll have the best quality which is important to watch the sometimes very tiny features of the Captivate UI. If you want to see it oscaled to your browser resolution, you can use the second link, which is to a rescalable version. It may look more blurry on a very big screen, but you need to use this version if you want to watch on mobile devices:

Fixed resolution: Custom Play/Pause

Rescalable: Custom Play/Pause


Workflow Step-by-Step

Step 1: Creation of the Shape button

You have to know the  situation at the start of the  course. By default (after having launched the course) this will be 'Play’ situation. Consequence: the start look of the Shape button has to be ‘Pause’.  It is not possible n Captivate to create states for a shape button on a master slide . You have to create that button on a normal slide,.
  • Create a shape and check off the option ‘Use as Button’.
  • Open the State panel, using the button ‘State View’ in the Properties panel.
  • In the Normal state, fill the shape with an image and/or text you want to show when the course is playing, to pause the course.
  • Delete the InBuilt states ‘Rollover’ and ‘Down’, using the right-click menu on those states (you cannot use a simple Delete key).
  • Add a Custom State, and name that state  (I use 'Play' as label)
  • In this custom state fill the shape with an image and/or text you want to show when the course is paused, to resume Playing.

Here is a screenshot of the states I created in the video:

Step 2: Location Shape button

Once the button is ready, you have to decide where to put it, and take out the Pausing point. Reason: you want this button to be available all the time, but not a pausing point like you need for a Submit or a Next button. There are two possibilities for its location;

1. On Master slides

If you want to use the Play/pause button on all slides, and you are creating a non-responsive project or a responsive project with breakpoint views, the easiest way is to copy/paste the button to the Main master slide. The daughter master slides can inherit the button. Careful: in some themes the Title master slides is not using the main master slide objects, you’ll need the button also on that master slide in that case.

There is a problem with this possible workflow due to the fact that shape buttons on master slides do not have an ID, and that means they cannot be used with the Chang State command. You can not show a custom state for shape buttons on master slides. As a workaround (not explained here in detail), you can combine the functionality of that button, with a two-state image which is on the first slide, timed for the rest of the project. That image will have an ID and you change the state of that image. The shape button on the master slide needs to be transparent (you can keep a stroke if you want) so that the images will be visible.

For a fluid boxes responsive project, you cannot use the main master slide (cannot have fluid boxes). You will need to insert the button on each used master slides where you want that functionality.

To turn off the pausing point: open the Actions tab of the button, and uncheck the option ‘Pause project until user clicks’.

2. Timed for the rest of the project

The alternative for the master slides, is to have the Play/pause button on the first slide, and time it for the rest of the project, always on top. That has to be done in the Timing Properties of the button. At that same place you can also turn off Pausing:

For a Fluid Boxes project: object timed for the rest of the project is normally not possible. I explored and found it iw possible but with the requirement that you use the same master slide for all content slides.

Step 3: Create Advanced Action

The success event of the button has to trigger a rather simple advanced action. Check the ‘Conditional Tab’ and create this action:

Explanation: I am checking the value of the Boolean variable cpCmndPause (see article). If that value = 0, the course is playing.

In that situation I will use the command ‘Pause’ (‘Pause’ is exactly the same as ‘Assign cpCmndPause with 1) and change the state of the button SB_PausePlay to the Play state.

If the course is paused however, that variable would not have the value = 0 (but = 1) and the ELSE commands are done: the state of the button is reset to Normal, and the playhead is released by the command ‘Continue’ (which is the same as Assign cpCmndResume with 1, which is also setting cpCmndPause back to 0).

Warning: not everything is ‘paused’!

As I explained more in detail in my sequence of blogs about the timeline, even an absolute pause (‘Pause’) will not pause everything.  Here in short the most important:

  • Animations of all type (animated GIF, SWF, OAM….).
  • Event video if it is playing
  • Audio which was started with the command ‘Play Audio’

For more information:

Pausing Captivate's Timeline

Pausing Timeline and Audio

You would have the same  situation  with the Pause button on default Captivate playbars. It is not due to the fact that this is a custom button.


Discover/Use Captivate's System Variables - Part 2

Intro

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.

Terminology

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

Toggle

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: 

1 action = 5 toggle buttons

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’?

More?

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.

Discover/Use Captivate's System variables - Part 1

Intro

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 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 of System Variables - table

You can download the table from this link.

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 second post.  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.

What Now?

Have a look at my next blog post, where you'll start to take control of your courses with the system variables of the Movie Control category. It is a good 'step up' to challenge your next goal: using advanced/shared actions.


About State Commands and a Progress Bar

Intro

Recently a user posted a question about using the 'Go to Next State' command used in Advanced actions. You can read our discussions in this thread.

Time to write out some tips for multistate objects. This blog wants to give an answer to the user, and has its focus only on that solution. I plan to publish more about the basics of states and their commands later on.  To me personally the introduction of multistate objects is in the list of my favourite features in Captivate, closely following Shared/Advanced actions and Shape buttons.

Example movie

Watch this published rescalable interactive movie. The second slide has three shape buttons, navigating to three slides where you can read and confirm reading, or click hotspots, or answer questions. Each of your actions will result in changes to the progress bar on that second slide. Beware: whenever you have clicked an interactive object it will be disabled!


Terminology Multistate objects

InBuilt States and Custom States

You can add custom states to any object, static or interactive.  In those states you can have many object types: graphics, video, audio... but no interactive objects nor hyperlinks.  The Normal state is the default state, which will always appear unless you have changed to a custom state using a command (in a simple or an advanced/shared action). You have a lot of freedom for custom states: contrary to the InBuilt states, nothing is locked tto the default normal state. You can have objects in a custom state that are in a totally different position from the Normal state. Custom states are always controlled by commands, not by a situation. If you want a custom state to remain for future visits to the slide where the multistate object is sitting, you need to check the option 'Retain state on slide revisit'.

Inbuilt States exist for these object types:

  • All types of buttons Shape buttons, Image buttons, Transparent buttons and Text buttons.  You have four of those styles: Normal, Rollover, Down and Visited. The first three are part of the button style.  You don’t have the same freedom for location of those states, they are locked to the Normal state (look for the Lock indicator).
  • Drag sources and Drop targets on a D&D slide. For more information see: InBuilt states for D&D

I will only talk about shape buttons here. Contrary to custom states Inbuilt states appear automatically in a situation: when not hovering over button (Normal), when hovering over button (Rollover), when pressing button (Down) and when after clicking/tapping (Visited, if it has been created). You can only control Normal and Visited by a commandif necessary, not the Rollover/Down states.. 

State commands

These commands are available both in a simple action (dropdown list in Actions) and in the Advanced Actions dialog box, to be used in advanced or shared actions:

  • Change State of …. to 
  • Go to Previous State  …..
  • Go to Next State ….

When you use these commands as a simple action, from the dropdown list inthe Actions tab, they can only be applied to multistate objects on the same slide as the event triggering the action (Slide event, interactive button events) The Hypelink even thas only the first command (Change State). 

If you insert one of the commands in an advanced/shared action they seem to be able to apply also to multistate objects on other slides. That is indeed the case for the ‘Change State’ command, but is NOT functional for the commands Go to Next/Previous States. I have logged this as a bug, because you are able to choose multistate objects on other slides, however without any effect. That was the reason of the question in the forums, described in the Intro. 

You could see in the Example movie that I have a workaround. How?

Solution with variable and While loop

YOu will need one user variable v_counter,  to track the number of clicks while being on other slides than slide 2 with the Progress indicator SS_Progress (a multistate object). This progress indicator starts with a Normal state which is a shape with Alpa and Stroke = 0.

That variable starts with a default value = 0. The clicks on the OK buttons in slide 3, on the hotspots in slide 4 and on the correct answers in slide 5 do increment the variable, besides other commands. 

When returning to slide 2 (which has the progress indicator) using the shape button ‘Back to….’ (is on the used content master slide) an advanced action On Enter for that slide is launched, using the While loop:

Example: if the user has performed 3 actions on any slide, v_counter would be 3. The while loop will then be done 3 times, which means the 4th state of the progress indicator will appear. At the same time, the variable will be set back to 0 at the end of the loop. The learner can continue to visit another slide, and the variable is ready to track again.

This is just an example, many variations are possible. Maybe you want to allow visits and actions to consecutive slides before returning to the main slide, this can easily be achieved. Or have feedback appearing on the main slide after all slides have been visited, based on the obtained progress.. 

More?

I didn’t explain all actions in this post. The slide with the hotspots is based on a recent article about Hotspots in a 2D image.

Maybe you are wondering if I used the Visited state or a custom state for the OK buttons (slide 3) or the hotspots? What the quickest workflow is to create the states for the Progress bar? Did I use shared actions or advanced actions, and why did I choose that way? Why did I disable the buttons? If you are interested, I can explain… on demand. 

Hotspots in non-VR project? Workflow 1

Why?

This is not a blog post for intermediate or advanced users. Since CP2019 is released, with the hotspots for 360 images and videos in a VR project or a normal project, I see the same question appearing regularly: why cannot we have that feature for a 2D image? Hence my idea to offer you some possible workflows with a step-by-step explanation and a free downloadable project file. This first post shows a project where the functionality of VR hotspots is being duplicated as close as possible:

  • When user clicks a hotspot, text, image and/or audio will appear, and automatically disappear after a specified time (here you can also use video, which is not possible in a VR project)
  • The hotspots get a checkmark after having been clicked.

However only the status ‘Exploratory’ is used, not the ‘Guided’ status. I would be able to reproduce that as well, but the workflow will be more complicated.

Example movie

Watch the result in this movie with 3 slides. After the title slide you’ll see the hotspot slide. The last slide lists up the steps explained below, if you want to create the workflow from scratch. I will also offer you the project file, you can also copy/paste the hotspot slide to your project, thus allowing to skip some steps.

Copy/Paste Slide

You can download the project file (created in version 11.0.1.266) from this link.

You can copy/paste the hotspot slide (slide 2) to your project. Replace the image. You can edit the design of the hotspots (names start with HS_), change the content of the states in the Multistate object labeled SS_Info.

Have a look at the Library, folder Shared Actions. You’ll see that it has been used 6 times, once for each hotspot. If you change names of the states in the multistate object, you will have to edit that parameter. Same for the duration. The other parameters are always the same for each hotspot: the name of the multistate object and its Normal state.

Steps, from scratch

Create hotspot

I used a shape button as hotspot. It has several advantages over the older type of buttons. You can choose any shape or create a custom shape (here I used just a circle), you can fil it with any color from your Theme Colors as solid color or in a gradient (I used a gradient) or even fill the shape with any image. Moreover you can type text in the shape. I kept the hotspot very simple: just a question mark. But you can replace the text or the fill as you like. It is important that the shape button – hotspot has at least two InBuilt states: the Normal and the Visited state. You could also use the Rollover and Down state, which I deleted in the example file/movie. This is the state panel of the hotspot:

Duplicate hotspot

I labeled the used style as ‘Hotspot’. However, the Visited state is not part of the style (which I regret a lot). For that reason I did duplicate the hotspots (CTRL-D). In the project the names start with HS_.  In the example movie you’ll see 6 hotspots.

Contrary to the hotspots in a VR project, these hotspots have a timeline. I kept the default setup: duration of  3 seconds and pausing at 1.5secs. That pausing point is where where the playhead will pause, exactly like for the hotspots on a VR slide.

Multistate object for popups

I put all the popups in one multistate object which is also a shape: it has 1 state more than the number of hotspots. The Normal state has to be ‘invisible’ by setting the Alpha for Fill = 0 and the stroke width = 0. Each of the following states has the assets for one popup. You will see that I have states with only a text container (background in any color, partially transparent), but some have also an image, audio and one even has an event video (which is not possible on a 3D slide).  You can choose any location, it is not locked to the Normal state location. In the example file, the Object states for this shape looks like this:

Import Shared Action ‘HotspotWorkflow1’

Use File, Import, External Library and open the file you downloaded. Find this shared action in the floating Library panel which will be opened. Drag that action to the Library of your project in the folder Shared Actions. More info about external libraries in this post.

Add shared action to hotspots

Select a hotspot. In the Actions tab of its Properties panel, for the Success action choose ‘Execute Shared Action’. Click on the tiny button {p} to define the parameters which are:

  • Multistate object with the popups (labeled SS_Info) in my example file. That parameter is the same for all hotspots.
  • State: having the info to pop up for that particular hotspot
  • Time you want to leave the popup on screen, can be different for each hotspot
  • Normal state of the multistate object, is same for all hotspots.

Here is one example screenshot for the hotspot referring to the Virtual Reality project:

Conclusion

Maybe you’ll already feel that this workflow could be optimized. I would prefer to give the learner control over the time he needs to watch the popups by adding a close button. Or maybe cover up the distracting background in a lightbox style? What about the next button only appearing when all hotspots have been clicked? Or a warning if not every hotspot has been visited when the learner clicks the Next button? Lot more workflows are possible, let me know which one you would prefer?

Hotspots in non-VR project - workflow 2

Intro

A week ago I published a first showcase, explaining how to replicate the hotspot workflow for VR projects on a 2D image. This second article about using hotspots for a 2D image is not duplicating as closely that same feature: instead of showing the popups for a duration defined by the developer, this workflow will offer a close button for the popups. The learner decides when to close a popup and proceed (eventually) to the next hotspot. I also used a technique, often labeled as 'lightbox': to have the popup stand out of the rest of the content, it will have a semi-transparent cover in the background dimming the rest of the slide.

Example movie

I used the same image (welcome screen) and content for the popups as i the first workflow. Only  some small color changes and changes in the location have been applied . Watch this 3-slide movie: after the title slide (doubles as poster image) you can test the new hotspot slide, and the last slide gives a short Step-by-step list if you want to use this slide in your project. 

Try it out: quick workflow

You can download the project file from this link

If you do not need to have more than 6 hotspots, and you are happy with the resolution of the project (1024x627) and its Theme (Pink Icing), you can quickly use the hotspot slide using these steps:

  1. Create a blank project, with that resolution and theme. Create your title slide, and eventually a poster image as explained in his older article
  2. Copy the hotspot slide from the sample project and paste it into your project. The object names will get an extra number, but you don't have to bother about that. The advanced and shared action is automatically adapting to the new names.
  3. Select the Image..  'WelcomeScreen.png' and replace it by your image (Properties panel).
  4. Move eventually the hotspots to the right location. If you need less than 6 hotspots you can hide some of them in output. Deleting is also possible. Start by hiding or deleting the last hotspot(s). The sequence of the hotspots is starting with HS_Responsive (first in first row), going to the right and then to the second row. Last hotspot is for the PPT.
  5. Open the multistate object SS_Info.. which is just on top of the 'Cover' (needs to be there). Click the State view button in the Properties panel to open the Object State panel.
  6. Leave the Normal state alone. Replace the content in the other states by your content (follow the sequence described under 4.)  You don't need to rename the states, nor to delete the last unused ones (just leave them as they are).
  7. Start testing with 'Preview HTML in Browser' (F11).

 

How to use Custom Effect in Actions?

Intro

Almost 8 years ago I posted this article on my personal blog: Editing Motion Paths and Using Custom Effects. 

Since that time Effects have been improved a lot, advanced and shared actions can make life much easier. Time to upgrade that blog post, meanwhile testing the behavior of effects in HTML output in CP2019. While Flash was always to be trusted, that is not the case for HTML output. And indeed, I bumped onto a problem with the Scale effect, and sometimes the Rotate to effect. When those problems are solved, I will post a published movie. The workflow to use Custom effects in a shared or advanced action is however still the same since many versions. It is a bit complicated, I have answered many questions about it in the forums. I will write it out now step by step.

When do you need  a custom effect?

Effects have been improved in some ways. Some parameters can be defined in the Advanced Actions dialog box. Look for the start time of an effect, its duration and more numeric fields (alpha, rotation, ease in/out, alpha….). However when using a combination of effects over and over again, you can create one custom effect which saves that combination and can applied in one step including the sequence and duration of the different effects. Another practical example are the motion effects, where you need to edit the motion path, which is certainly the case for more complicated custom motion paths.  This screenshot shows an example of a complicated combination of effects on the Timeline. It was meant to be applied to simulate a swimming fish:

Step by Step

Step 1:  Create and save effect

Create the effect or combination of effects on any object as a ‘Self)time based animation and test it out thoroughly (Preview HTML in Browser for a non-responsive project) in several browsers before saving it with a custom name.

You don’t need to save it in a specific folder. I use to save it with the project I am working on as is the case in the screenshot above. Effects are stored in XML-files.

Step 2: Apply the custom effect as time-based animation

If you would try to use the saved effect in a shared/advanced action it will no be available. If this is the first custom effect you ever created, there will not even be a Custom category to choose from You need first to delete all the individual effects applied to the object (above it was to the object SV_Fish (a SVG image). Then apply the custom effect as a (Self) time based animation again, but now with ‘one’ effect chosen with the browse button.

When looking at the timeline you’ll see exactly the same result as in the screenshot at the beginning: all the effects in the correct sequence and with the duration you had chosen.

The result of this second application is that the Category ‘Custom’ will now have been created, and it will have the new custom effect ‘Swimming’.

Step “: use in advanced or shared action

If you only wanted to apply this action using an interactive object, you could use a simple action. The field Category will now have the Custom category.

However often effects are used in Advanced or Shared actions in combination with other commands. In this example the Fishes are originally hidden, so I need to Show them and apply the effectn eventually also have an audio clip playing separately.

The two buttons on this example will trigger the same shared action. Both fishes are hidden in output at the start. When creating the advanced action, the category Custom can now be used, and the available parameters (start, duration) could be edited, but mostly you’ll not want to do that.

Because I needed to use this action twice, maybe also later in other projects unchanged or as template for other actions, I preferred a shared action which will have only one parameter: the object itself. An effect cannot be a parameter. However, the effect can not only be applied to one object, but also to a group. I can replace one fish by a group of fishes.