storyline
50 TopicsHow I Built This Broomstick Brew Game in Storyline 360
As a kid, I always looked forward to Halloween. In my opinion, it’s one of the best holidays—although my dentist would probably disagree. Besides collecting an abundant amount of candy in my plain white pillowcase (the old-fashioned candy bucket), it was the one time of year I got to be extra creative and plan my costume. This year, I decided to put my creative ideas into Storyline 360 and build this Broomstick Brew Game as a fun Halloween treat. I’ve had a few people ask how I created the different components of the game, so I want to share my process. 1. Create a Storyboard With each of my projects, I like to storyboard my vision. Sometimes I sketch my ideas on sticky notes or on this Visual Storyboard Template I created. Drawing it out helps me see the big picture, so I can fill in missing pieces or scratch out ideas that don’t work. Once I have a solid idea of how to go about my vision, I bring the storyboard to life in Storyline 360. I add all the slides I need and title each slide and their layers. For this example, I planned on having three slides: Title, Game, and Results. If you’re not used to storyboarding before you get started, you can learn more about that here: 11 Best Practices for E-Learning Storyboarding. 2. Find Imagery With my ideas storyboarded, I have a better idea of what assets I need to build the game. Although I like to create my own graphics from time to time, I realized that if I did that for this game, I probably wouldn’t have it ready until Halloween 2021. So I turned to Content Library 360 and the web for free resources to save development time. I started my image search using Content Library 360, where I found this spiderweb icon. I was able to customize the color easily in Storyline 360, since you can edit the color of Content Library 360 icons just like you can with any shape. If you’re not finding exactly what you need, you can also search online for other free resources. For this project, I found a variety of images on Freepik. When I saw a background image with a style I liked, I looked up the artist for similarly themed graphics by clicking on their username. You can also use the search bar if you want to add a descriptive word with your search. If it’s an option, using graphics from the same artist is a good way to keep the look and feel consistent. Depending on the project, you might have to edit some of the graphics—maybe updating the color scheme or removing something from an image. That’s another reason I really like Freepik—they include the Adobe Illustrator file. This makes it super easy to customize the images to fit your needs. Sourcing these assets instead of creating them from scratch saved me a ton of time. For more tips on sourcing assets, dig in to this article: Getting the Assets You Need for Your Online Course. 3. Add Audio Another element I like to add to my projects is sound. There’s just something about the right track or sound effect that makes a project come alive. For this project, I made a list of all the music and sounds effects I needed. I searched YouTube Audio Library for music tracks and Freesound.org for sound effects. I listened to several audio files before deciding which ones to include. If you’ve never used sound effects in your e-learning before, be sure to check out this helpful article: Tips for Using Sound Effects in E-Learning. 4. Build the Slides Once I had all my assets, it was time to build my three slides using a variety of animations and triggers. Let’s walk through how I built each slide. Slide #1: Title Slide The opening slide sets the tone for the entire experience. It’s the first thing learners see when they launch a course. I wanted to make sure this slide reflected the look and feel of the game. Images Since I had the image source files, I was able to pull bits and pieces from the illustrations—the witch, two trees, a spider, rocks, a cauldron, and the sky—and animate them to create this slide. You can see all of these images used throughout the project, but in different ways. Repurposing assets is a great way to save time and make everything look cohesive. Animations With my images in place, I was ready to add animations. Using relevant animations can enhance the experience and connect people to the content. Let’s look at some of the animations I included on this slide. Since this game is about a witch, it made perfect sense to have the witch fly onto the screen to introduce the title of the game. To create this effect, I added an arc motion path to the witch and a wipe-from-right animation to the Broomstick Brew text. The opening slide wouldn’t be complete without some brewing. After all, this is a game about making Broomstick Brew. So, I added floating cauldron bubbles using multiple line motion paths. It felt empty to have the brew boiling but no witch, so I decided to have the witch fly back onto the screen and float over the cauldron. I used the fly-in entrance animation to have the witch enter the slide and a freeform motion path to create the floating-in-place effect. I also added an arc motion path so that when the player selects the play icon, the witch flies off the screen. Timeline/Triggers When timing animations and placing them on the timeline, I often think about it like a story that has a sequence of events. Animations also tell a story, so it’s critical to time them just right. I strategically positioned each image that had animations on the timeline to play out when it made the most sense. I added several triggers to move the different images (witch 1, witch 2, the spider, and cauldron bubbles) along their designated motion paths when the timeline started on each one. For example, here’s what the triggers look like for the cauldron bubbles. And here’s a glimpse of what the timeline looks like. I made sure I evenly distributed the different-size bubbles at various times so it looked more realistic. If you let the slide play out, you might have noticed the floating witch and the cauldron bubble animations never stop. However, the slide is only 9.25 seconds long. So how did I achieve the GIF-like animation? I created a jump-to-time trigger that jumps to a certain time on my timeline when it ends. I didn’t want the entire slide to play over again, so I timed it to jump to the place where I wanted the animation to loop. Audio As mentioned in the last section, I used the jump-to-time trigger to create an animated GIF, so you might be wondering: How do you get the music to continue playing when the slide jumps to another part in the timeline? I simply added the music to a different layer and then created a trigger on the base layer to show the music layer when the timeline starts. This little trick allows the user to still see the animations on the base layer, interact, and see the animation loop, all while still hearing the audio on the music layer play continuously. Here’s a look at all the layers I used for this slide. When the user clicks the play icon, it shows the transition layer with the wipe-from-right entrance animation and then jumps to the next slide. Slide #2: Game Slide It’s game time! But first, let’s look at all the different components that went into making this slide. Layers This slide includes several layers. I’ll refer to the different layers throughout my process. I do want to note that it probably would’ve been more efficient to separate this game slide into two separate slides—instructions and game—since I had to do quite a bit of troubleshooting to get everything to work. #usererror #lessonlearned Luckily, I was able to use the disabling triggers feature in Storyline 360 to easily experiment with different triggers and figure out how to make it all work. Let’s dive into the different game components. Instructions The very first thing you see on the game slide is the “How 1” layer, which includes a purple transition (Exit—Wipe From Right) and then displays the instructions on how to play. Buttons Do the purple buttons look familiar? That’s because I used one on the first slide. When I created the button in Photoshop, I purposely left it blank so I could use the same button throughout my project and just add different Content Library 360 icons to it. I also added a subtle hover state by lowering the brightness level. (Find out more about button states here: Everything You Need to Know About States in Storyline 360.) And this is what it looks like. This saved me a lot of time since I didn’t have to make my own icons or import multiple button images into Storyline. I only had to make one custom button, and within Storyline 360 I was able to quickly and easily customize it across my project. After clicking through the instructions, there’s a countdown timer and then the game begins! Background To make it look like the witch is flying through the forest, I opened the background files up in Adobe Illustrator, combined them, changed the colors, and moved a few items around so it looked like one long scene. Once everything looked good, I split the extra-long image into smaller parts to keep the high quality, since the maximum dimensions for images in Storyline 360 is 2,048 x 2,048 pixels. I inserted the images into Storyline 360 and pieced them together to make it look like one long background. It’s safe to assume I zoomed in/out quite a few times to build this game.😆 I used a similar technique for the starry purple/blue sky, but made the graphic less wide overall since I planned on adding an animation later to make it move at a slower pace for a parallax effect. With the land and sky backgrounds set, I temporarily locked each group on my timeline to prevent myself from accidentally clicking on it while I imported and worked on other images. Witch Next, I inserted the witch image. Since the game takes place at night, I wanted the witch to stand out against the dark background. To achieve this, I used the glow effect. This made the witch appear much more noticeable (and magical). To make the witch move, I added two line motion path animations to the object—up and down. For each path, I selected Relative Start Point so the object would move from where it left off. I edited the duration of each motion path to 00.10 seconds to make the witch move fairly quickly. I wanted to limit the witch’s movements to five total vertical areas before she went off the screen. To determine the length of each motion path, I divided the height of the slide (720) by the total range of movement I desired (5), which resulted in a motion path length of 144. I selected the blue dotted line for each motion path and edited their lengths in the animations tab. To set the flying-up-and-down movement in motion using the keyboard, I created two triggers. If a player moves the witch beyond the 5 vertical areas, I created a trigger on the base layer to show the out-of-bounds layer. The game pauses until the witch flies back. To give this game an extra spin, I added an animation to the witch to spin counterclockwise when she hits a creature. To achieve this, I added a crash state to the object. You might be thinking: But you can’t add animations to states. And you’re right . . . sort of. Although you can’t add animations to objects already in a state, you can still cut the object from the desired state (CTRL+X), paste it onto the slide (CTRL+V), add the animation, and then cut and paste it back into the state. That’s exactly what I did. Now the object had an animation attached to it within that state. I also included -5 in orange text to let players know they lose 5 points every time they crash. Here are what the crash triggers looked like once I had all of my assets imported into Storyline 360. On the base layer, I included the following trigger. On the crash layer, I included the following trigger. I also imported a crash audio file to let the player know they’ve been hit. The timeline on this layer only lasts one second. Potion Bottles Since the goal of the game is to collect potions, I wanted them to stand out against the dark background. Just like I did with the witch, I added a glow effect to each of the four potions. As the witch collects each potion, they disappear. I achieved that effect by adding a disabled state to each potion and removing the image. Then, I created triggers for each potion to change states when the witch intersected with it. As an example, here’s what the trigger looks like for the mushroom potion. After creating triggers for all four potions, I duplicated them. I copied and pasted triggers from one potion to another and tweaked them in the triggers panel. Here’s the triggers panel for the mushroom potions. I scattered all 33 potions across the land. This is a good reason to always plan ahead. The disabled states remained attached to each new potion. Had I just inserted the potions into my project and immediately duplicated them, I would’ve had to individually click each one and edit their state 33 different times. Boo to that idea! 👻 I strategically placed each potion within one of the five vertical zones so the witch could only collect potions within each zone. The five transparent shapes helped me to see where to place each potion—on bridges, gravestones, branches, rocks, lily pads, etc.—to make them look like part of the scene. To give the player a sense of achievement, I created a trigger to play a positive sound effect every time they collected a potion. Similar to the backgrounds, I grouped the potions together (CTRL+G) and temporarily locked the group on my timeline to prevent myself from accidentally clicking on it while I imported and worked on other images. Crows Now it was time to import creatures. I started my search looking for a crow. I found the above image and reworked the Adobe Illustrator file to create two types of crows. Flying—I used the top crow in the image above and added a line motion path. Eating—I combined the two remaining crows to create an animated GIF in Photoshop and then imported it into Storyline 360. I duplicated the crows and placed them throughout the first part of the game in areas I thought would make the game challenging. I later realized there was an odd white line around the transparent crow GIF. I learned that Photoshop assumes the background will be white, so it fades the semi-transparent edges toward white. I had to go back into Photoshop to save a version that fades to a darker color. Thankfully I didn’t have to replace each and every crow manually. I used the Media Library replace feature to replace the incorrect crow GIFs with the updated one all at once. Ghosts My ghoul (goal) for finding the right ghost was to find something that was easy to tweak. I found the above image and selected the ghosts I wanted to use. In Adobe Illustrator, I simply removed the background and imported my two favorite ghosts into Storyline 360. To make them a bit see-through (they are ghosts, after all), I edited the transparency to 21%. I added an arc motion path to the first ghost and a circle motion path to the remaining ghosts. Spiders It’s not every day you go searching for spiders. Thankfully, this one wasn’t real. I sifted through a bunch of spider images and eventually chose the one above, because that big spider smile was ridiculously perfect. For the game, I flipped it upside down and placed it on the spiderweb icon I found in Content Library 360. As an obstacle, I thought it would be fun to have the spider move down. I created a straight line using the same color as the spiderweb, grouped it with the spider, and added a line motion path. Bats For the last creature, I decided to add a bat. I found an animated bat GIF online, but it had too many movements. I only wanted the bat to have two flying motions. Using the bat GIF I found, I redid the GIF in Photoshop with the same technique I used for the crow, and created my own version. Although I didn’t need to add any animations to the bat, since it was already a GIF, I decided to add a line motion path to a few of them to make the end of the game more challenging. Once I had all the creatures on the slide, I grouped each of them by name. Since there were A LOT of objects on this slide, naming and grouping similar objects together helped me keep my triggers and timeline organized as I tested and tweaked a few things. Scoring System I had a difficult time deciding how easy or challenging to make the game. I ended up making it really hard because people are always saying don’t make games too easy. I now realize I may have taken that a little too far. 😆 Here’s a breakdown of the scoring system. I wanted to keep scoring simple. I created one variable to capture the total score. For every potion collected, it would increase the score by 2. To achieve this, I created a trigger on the base layer. If the player crashed into a creature, 5 points is deducted from the score. It’s as simple as that. I also included the score at the top using variable references. Make It Work Together With all my assets on the slide, it was time to make them move seamlessly across the screen. To move the land, creatures, and potions all at the same time and speed, I first grouped them together. I zoomed WAY out of my slide view and added a line motion path animation to the game group. I dragged the group left until the right side of the group reached the slide area. I edited the easing direction to None. And changed the duration to 58 seconds. For the sky group, I also added a line motion path animation. I dragged the group left until the right side of the group reached the slide area. Similar to the game group, I edited the easing direction to None and changed the duration to 58 seconds. With the duration the same as the game group, the sky group still moved at a slower pace (creating a parallax effect) because the group and motion path was less wide. The game is all set! When the witch reaches the end of the slide, there’s a subtle fade to the house layer, where the door opens and the witch enters. Once the door closes, it transitions to the next slide using a purple oval shape with an Entrance—Grow animation. Slide #3: Results Slide On the last slide, the player gets to view their brew rating and results. I used images, animations, and audio to continue the experience. Images I switched out the background and repurposed some of the assets—such as the cauldron, pop-up box, buttons, potions, and witch—to bring it all together. Animations With my images in place, I was ready to add animations. As mentioned earlier, using relevant animations can enhance the experience and connect people to the content. Let’s look at some of the animations I included on this slide. The scene before this shows the witch entering a door, after which the door shuts, so it made sense to have her fly into this scene and drop the potions she’s collected into the cauldron. To create this effect, I added two motion path animations to the witch—an arc motion path to fly in and a line motion path to fly out. I also added line motion paths to each potion (to create a falling effect) and to each bubble (to create a floating effect). States I enjoy adding little details throughout the game to make the experience a bit more interesting. If you look closely when the witch is over the cauldron, her hand comes up as if she is pulling the potions out of her pockets and then dropping them to make the brew. I achieved this effect by adding a custom state. Timeline/Triggers I strategically positioned each image that had animations on the timeline. I added several triggers to either change the state or move the different images (witch, potions, and cauldron bubbles) along their designated motion paths when they reached a certain point on the timeline. Similar to the first slide, I used the jump-to-time trigger to loop the animations on this slide. Audio As mentioned earlier, to get the music to continue playing when the slide jumps to another part in the timeline, I added the music to a different layer and then created a trigger on the base layer to show the music layer when the timeline starts. Results These days, it seems we rate everything by five stars. Since the player is making broomstick brew, I thought it would be a fun element to add a star rating to show how they did. Take a look at the triggers I created that show how I used the score variable to determine how many stars a player earned. And that’s how I created the Broomstick Brew Game! If you haven’t already played, go ahead and give it a try and share your score. I know I covered a lot. Did I miss anything you’d like to know more about? I’d love to hear your feedback in the comments below. Don’t forget to follow us on Twitter for more helpful advice on everything related to e-learning. If you have any questions, please share them in the comments.499Views0likes48CommentsStoryline custom focus control
========================================================================= Update 4th Feb 2025 Added a second argument that will determine if the target elements content will be announced to the screen reader, using the aria-live=assertive attribute. ========================================================================= There have many been times, when using Storyline to develop content, it has not been possible to get the kind of screen reader focus control that I have needed. Using layers for this can only get you so far. I developed a JavaScript function that allows you to send the screen reader focus to the text field that you want, via any trigger. Adding the following JavaScript to your projects Slide Master will make it available throughout your module: // Check if function has been defined already if (typeof window.setFocus === "undefined") { // Get reference to the Storyline Player var $player = GetPlayer(); // Set the amount of time to delay before attempting to send focus to the target element (milliseconds) 1000 = 1 second. var $interval = 200; // window.setFocus = function ($target, $announce = false) { // Get the target element, based on the passed argument setTimeout(function () { var $div = document.querySelector('[data-acc-text^="' + $target + '"]'); var $id = "acc-" + $div.dataset.modelId $div = document.getElementById($id); if($announce) { $div.setAttribute("aria-atomic", "true"); $div.setAttribute("aria-live", "assertive"); } // Send focus to target, after defined $interval $div.focus(); }, $interval); } } Once the function is defined in your Slide Master, you can then call the function on the page using a JavaScript function, which can be triggered by any Storyline trigger such as timeline start, timeline end, button click etc. // The second argument will determine if the content should // be announced to assistive technology using aria-live=assertive // This will announce the text contents to the screen reader window.setFocus("Customer in the queue", true); // This will just send focus to the element. window.setFocus("Customer in the queue", false); The first argument, which is passed in the "" quotes, is the text contents of the text field you are targeting. You do not have to include all the text, just enough to ensure it is unique. For example, if you have two text fields: "Customer in the queue talking on their phone." "Customer in the shop staring into space." Passing the words "Customer in the" would not be specific enough, as there would be two text fields found. However, passing "Customer in the queue" would send the focus to the text field that contains the text "Customer in the queue talking on their phone." The second argument (true or false) determines if the target elements contents should be announced to the screen reader when it receives focus.232Views1like9CommentsHow To Embed An ElevenLabs Conversational AI Widget Into SL360 Using JS!
Hi Heroes, It feels like something new and exciting is always around the corner in the world of generative AI technology, and this week ElevenLabs put themselves firmly in the driving seat of the agentic AI revolution with their new Conversational AI toolkit. If you haven't heard of this yet, check out this video which explains it all: https://www.youtube.com/watch?v=v-EYzZCLF48&ab_channel=ElevenLabs The interactive, animated widget that this toolkit provided is easy to embed anywhere, including directly within an Articulate Storyline 360 project slide! If you're interested in how to get started, I've written a blog post that includes all the steps, including an Execute JavaScript snippet you can use to effortlessly get your agent loaded into your activity: https://discoverelearninguk.com/how-to-set-up-elevenlabs-conversational-ai-widget-in-articulate-storyline-360/ I'm also currently experimenting with the API for the new Conversational toolkit to understand how I can implement it into my eLearning Magic Toolkit plugin for Storyline + WordPress, potentially opening the door for developing real-time voice activated automation all within a Storyline-built eLearning activity! Much more to come very soon. 🚀 --- My name's Chris Hodgson, an eLearning developer and software trainer based in the UK. I enjoy creating fun, unique, and engaging online experiences using Articulate software! Connect with me on LinkedIn - https://www.linkedin.com/in/chrishodgson44/137Views3likes1CommentCanadian eLearning Conference 2025
Visit with our friends and colleagues from Yukon Learning at this year's Canadian eLearning Conference in Toronto, June 12-13. Yukon will offer a workshop on Articulate Storyline 360 on Day 1, followed by a concurrent session on Day 2. Check the event website for more details.89Views0likes0CommentsExecuteScript its not working after reload/refresh in trigger.js
Hi, We have recently upgrade the storyline latest version (Build 3.92.33293.0) and we seems some changes in javascript. Earlier we had only user.js file to each slide script calling for jump on other slides. but after upgrade we can see the ExecuteScript moved to seperate file which is trigger.js file to execute the script on case basis. we noticed that trigger.js file having ExecuteScript calling only once while we cached clear and page reload but second time we just reload page its doesn't calling ExecuteScript from trigger.js file. we have added alert into ExecuteScript function it gives prompt on first time only. Can you please look into it and provide the solutions?84Views0likes2CommentsDynamic border radius experiment
This was just a little experiment to see if I could manipulate the border radius of shapes on the slide numerically using JavaScript, and the answer is yes. Not sure of any use case, but I've always wanted to be able to control the border radius numerically in Storyline as border radius is not maintained when resizing shapes. I'm not sure if this could help as there is no easy way of targeting specific shapes in a slide without knowing their unique ID. It was a bit of fun anyway. If anybody would like to play or expand on this, go for it. What I've found so far, is it will only support solid or no outlines on shapes. When you start using other styles (dot, dash) an image is used by Storyline to achieve this. window.updateCornerRadius = function(targets, radius) { targets.forEach(function(target){ const path = document.querySelector(`[data-dv_ref="ref-${target}"] path`); if (!path) { console.error(`SVG target ${target} not found.`); return; } // Extract the bounding box of the current path const bbox = path.getBBox(); const x = bbox.x; const y = bbox.y; const width = bbox.width; const height = bbox.height; // Ensure radius doesn't exceed half the width or height radius = Math.min(radius, width / 2, height / 2); // Construct a new path data string with the updated corner radius const newPathData = ` M ${x + radius},${y} H ${x + width - radius} A ${radius},${radius} 0 0 1 ${x + width},${y + radius} V ${y + height - radius} A ${radius},${radius} 0 0 1 ${x + width - radius},${y + height} H ${x + radius} A ${radius},${radius} 0 0 1 ${x},${y + height - radius} V ${y + radius} A ${radius},${radius} 0 0 1 ${x + radius},${y} Z `; // Update the path's "d" attribute path.setAttribute("d", newPathData); }); } An example of this being called. I'm using a variable, borderRadius, change trigger. const borderRadius = getVar("borderRadius"); window.updateCornerRadius(['12','15','18','21'], borderRadius);83Views2likes2CommentsBehind the Scenes: Alternative text tip and counter
Hi there! When we released Storyline 360 Update 90 back in July, we introduced the following enhancement: When writing alt text in Storyline 360, you’ll now see a dynamic character count and a tip not to exceed 150 characters. You may be wondering why, well, check out this behind-the-scenes video! If you'd like to learn more about adding alternative text, check out Storyline 360: Adding Alternative Text for Screen Readers Thanks, Ronnie Pilman, CPACC Sr. QA Engineer II60Views5likes0CommentsStoryline Zoom to fit & Accessible text
Hi everyone!👋 Our team has enabled Zoom text fitting and accessible text features in our Storyline learning courses. Should we include these features and their usage in our navigation or control guide? I’d also love to hear your best practices to ensure we are providing the most accessible courses to our learners. Thanks in advance! 🤩49Views0likes2Comments