Scratch animation and sound

scratch animation and sound for random motion and sound effects

In this lesson, we are adding animation and sound to our aquarium project. The animation for this project includes fish swimming in and out of the scene. It includes animation for the diver as he floats in the tank. We are adding underwater bubble sounds for the project background noise.

You don’t have to be involved in the overall project. This lesson stands on its own. You can include the animation and sound from this project in the overall project later. I will demonstrate how to do that in the final part of the lesson.

Use the link below to get the basic part of the aquarium lesson. The link to the basic project includes basic dialogue and questions.

https://scratch.mit.edu/projects/476015580

Fish Sprites

The project includes the diver and aquarium background. There are three additional sprites. Three fish sprites will be part of our animation. We will add more fish later. The fish sprites are hidden for now. We will use code to reveal and animate them.

sprites section

Select the first fish sprite—fish01.

selected sprite

Code, in Scratch, is attached to elements like Sprites and backgrounds. I like this concept because it makes it easier to create lengthy stories with code blocks. If you went through the multiple language lesson, you understand how daunting it can be to deal with lots of code blocks.

The code we develop for sprites applies to those sprites exclusively. For example. the code from the diver applies to that sprite and does not affect the code we are going to develop for this sprite.

Backdrop grid

The sprites rest on a backdrop and coordinate plane. This coordinate is much like the coordinate plane used in math. The coordinate plane has an X and Y axis; it has four quadrants.

coordinate grid

The measurements in these quadrants are in negative and positive integers. Those measurements are in pixels. The coordinate plane measures 640 by 480 pixels. The center of the coordinate plane is zero. Measurements radiate left and right—up and down.

Let’s take a brief look at how the coordinate system works. Every point in the coordinate system is measured by a pair of numbers. The numbers represent the intersection of the x and y coordinates.

Use the image below. The top right quadrant is the first quadrant. There is a rabbit silhouette sitting at the intersection of 4 pixels to the right and 4 pixels up. There is a duck in the second quadrant. It sites at coordinates -5 and 4. The squirrel silhouette sits at coordinates -6 and -2.

coordinate plane with figures

The measurements are both positive and negative. Measurements to the left and down are negative. Measurements to the right and up are positive.

Scratch coordinates

The lesson project has two other sprites. One is called Frame and the other Circle. Select the Frame sprite and click the show button. Select the Circle sprite and click the show button.

selected sprite

A white coordinate frame appears on the stage. A red circle with a white border appears in the first quadrant.

frame and red circle

Move the circle around in the first frame. Look in the Sprite setting panel. To the right of the sprite's name is a pair of coordinate numbers. These numbers represent the current location of the sprite. The position is determined from the center of the sprite. Move the circle sprite from quadrant to quadrant. Observe how the coordinate numbers update.

coordinates

Place the circle in the center. This is the point of origin. The values for x and y are zero.

red circle in center of frame

Sprite limits

Move the circle to the left side. Move it as far left as you can. Sprites cannot be taken off the stage. Some part of a sprite must always be on the state.

red circle at left edge of stage

Look at the x-coordinate value; mine is at -240. This is as far as I can drag the sprite to the left.

x-coordinate value

We can try to push the sprite farther to the left by manually entering the x-coordinate value. Type -300 into the x-coordinate field. Press the Return key.

updated x-coordinate value

The value will not go beyond -240. Scratch will not allow the Sprite to be manually removed from the stage. This is an important thing to keep in mind as we begin our project.

The canvas measures 640 pixels wide by 480 pixels tall. The actual boundary of the stage is -320 on the left and 320 pixels on the right. The top boundary is 240 pixels and the bottom boundary is -240 pixels.

The x-coordinate of -240 is specific for this sprite to keep some element of the sprite on the stage. The measurement for all sprites is based on the center of the sprite.

Click the hide button to hide the circle sprite. Leave the frame showing for now.

scratch-animation-sound-12.jpg

Basic animation

Fish will travel from one end of the aquarium to the other. They will enter the scene on one side and exit on the other. We will begin with the basics and develop more intricate animation as we go along.

We have gone through this coding process in other lessons. We add instructions, one at a time, to develop a full program.

Select the fish01 sprite; click the Show button. The sprite is at the coordinate position (60,60).

hide sprite button

Go to the Motion section. Look for the —Go To x… y…— code block. The code block has the same coordinates as the sprite. The code block uses the current coordinate position for the parameters. This is designed to help with the creation of our code.

code block

Move the sprite to the left and off the stage. Drag it as far as it will go.

tip of fish sprite visible

Place the —go to x…y…— code block on the canvas. This is where we want the fish to begin the motion animation.

The x-coordinate value is far beyond the 320-degree edge of the canvas. This is because the fish sprite is much larger than the circle sprite. The center of the sprite is farther away from the edge of the stage.

code block on canvas

Replace the x-coordinate value with -400.

updated parameter value

Click the code block to run or execute this block of code.

code block clicked

The code block will try to move the sprite -400 pixels to the left. The settings for the code block place the sprite’s x-coordinate at -379. That’s as far as it will go.

This shows that we can push the sprite far off the stage and Scratch will keep the minimum edge of the sprite on the stage.

We want to begin with the least amount of the sprite showing on the stage. This creates the illusion that the fish is swimming in from an unseen area of the aquarium.

We want the fish to travel to the opposite side of the stage. The opposite side is at the x-coordinate 400. We will use 400 to try and push the sprite from the stage as much as we can.

Place a —glide…seconds to x…y…— on the stage and connect it to the bottom of the previous block.

glide code block

Change the x-coordinate value to 400. Click the first block to run these instructions.

code blocks clicked

The sprite will dash for the opposite side of the stage. Part of the fin is still visible on the stage.

fish fin showing

That is a little too fast. Change the glide seconds parameter to 5-seconds. Click the code blocks to run the instructions.

updated code block parameter

We want the fish to keep swimming in and out of the aquarium window. Go to the Control section; place a Forever loop around the code. Click the Loop to watch the fish move endlessly from left to right. Click the Stop button.

forever loop

The fish is large. We can keep the fish this large or adjust the size. We are going to adjust the size to create the illusion that some fish are smaller or farther away than others. The same is true to create the illusion for some fish to be closer or larger.

Go to the Looks section. Place the —set size to…— block inside the loop and before the other blocks.

set size code block

Change the size percentage to 50; run the code to see the effect.

The fish is moving from left to right but it doesn't look natural. Fish don't swim in straight lines. The x-coordinate measures the horizontal left and right. The y-coordinate measures the up and down or vertical distance.

We can change the y-coordinate value but we would wind up with the same problem. The fish would always begin and end in the same location. We need to set a range of exit points for the animation. The points need to be random so the animation doesn’t look like it is cycling through instructions. It is, but we can create the illusion that it is not.

Go to the Operators section. Place the —pick random…to…— block into the glide y-coordinate parameter.

operator over parameter

The height of the stage is 480 pixels. The coordinates range from -240 to 240 pixels. The range doesn’t have to be that extreme. Type -100 and 100 into the parameters. Run the instructions and observe what happens.

The random number generator selects a number between -100 and 100. That number is used for the y-coordinate.

values in random code

The fish will enter from the same location on the left and move to some exit point on the right. That exit point is usually lower than the one from where it started. This is better but it still isn’t very natural looking. The fish needs to enter from random locations on the left too.

Place a —pick random— code block into the y-coordinate parameter for the —go to— code. Set the parameters to -100 and 100. Run the code.

random number generator with values

The fish is now entering and exiting at different locations.

The fish is moving across the stage at a fast pace. The speed needs to be adjusted randomly so it moves slowly sometimes and fast at other times. Place a random block into the glide seconds parameter. Set the range values at 5 and 10 seconds.

random generator with values

Let’s adjust the size of the fish. Fish come in all sizes. Fish also appear larger when they are close than when they are far away. Adjusting the size will give us some of this illusion.

Place a random block into the size parameter. Set the range values to 50 and 70 percent.

random generator with size values

The random code block is useful for adding depth and complexity to our three basic code blocks. The range values in the random blocks are my suggestion. Adjust the values to get the results you prefer in the animation.

I didn’t think there was enough variation in the size of the fish. I adjusted the size range values to 20 and 80 percent. I thought the fish was moving too fast. I adjusted the glide range values to 8 and 15 seconds.

updated time range

The fish keep moving in front of the diver. I prefer they swim behind to minimize the distractions.

fish in front of diver

Go to the Look section. Place a —go to…layer— block before the Forever loop.

code block in place

Select the back layer.

layer selector

The fish is now swimming behind the diver.

fish behind diver sprite

If you have ever been to an aquarium, you know that fish don’t swim perfectly horizontally. They swim at slight angles.

Hide the frame sprite. We don’t need it anymore.

Move the fish sprite so it is near the center of the stage.

sprite near center of stage

Look at the Sprite Setting section. The direction setting for the sprite is at 90-degrees.

sprite direction field

Click inside the direction field. Use the dial to rotate the fish to 95 degrees.

direction wheel

The fish is now pointing down and to the right. We don’t need to rotate the angle of the fish too much. Rotating the fish too much might make it look too unnatural.

fish at selected angle

Rotate the fish in the other direction to 80-degrees.

fish at selected angle

We want the fish to rotate between these two angles.

Go to the Motion section. Place a —point in direction…— block inside the Forever loop; place it in front of the other blocks.

code block in place

Get a random generator block from the Operators section; place it inside the direction parameter. Set the range to 80 and 95.

direction range values

Fish in aquariums don't come into view regularly. We need to stagger the interval when the fish appears.

Place a —wait…seconds— block in the Forever loop. Attach it to the end of the blocks inside. We want the fish to move across the window and wait a random amount of time before it reappears.

wait code block

Place the random generator inside the second's parameter; set the range to 5 and 10 seconds.

random number generator in parameter

Run the program. Everything is working well. We do have an odd thing that needs to be fixed. The fish sprite stops and waits at the edge of the stage.

We need to have the sprite fully disappear from the stage while it waits.

fish fin visible on stage

We can’t completely move the sprite off the stage. We can hide it. Place the Hide block from the Looks section before the Wait block.

hide code block

Run the program; you will see this introduces a new bug. The sprite is hidden and does not reappear. Place the Show block at the beginning of the code in the loop.

show code block

This is all looking great. One more problem. The fish is always coming in from the left and exiting right. We need fish to enter and exit from both sides.

To solve the problem we need to change the entry and exit x-coordinates. We want to change the values, you guessed it, randomly. We need to randomly select either the left or right side of the stage.

x-coordinate values highlighted

We need an —If…then…Else— code block. The code needs to compare a value to make a decision.

We need to create a variable to store the decision and pass it to the relevant code.

Go to the Variables section; click the Make a Variable button.

make a variable button

Set the variable name to x-value; click the OK button.

variable name

The variable is created and selected. The checkmark causes the variable to display the contents on the stage. Leave it on for now.

variable code block

Place the variable in an empty area on the canvas. Place a Set variable on the canvas too.

code blocks on canvas

Go to the Control section. Place an —If…Then…Else— code block between the Show code and the rest of the code. You might need to move blocks out of the loop to accommodate the condition statement.

code block in loop

Place an Equality operator from the Operators section into the condition parameter.

operator in parameter

Place the random number picker into the left side of the Equality operator.

random number generator in parameter

Set the random number generator range from 1 to 2; we only need one of two possible choices. Set the comparison value to 1.

random range values

Place the Set variable block inside the If section. Set the variable to the x-value variable.

variable selector

If the selected number is 1, we want to enter from the left. Set the variable to -400.

variable value

If the selected number is 2, we want to enter from the right. Right-click on the Set variable block; select Duplicate.

duplicate option

Place the duplicate inside the Else section. Set the value to a positive 400.

variable value

Right-click the x-value variable; make a duplicate.

duplicate option

Place the duplicate variable into the —go to x…— parameter.

variable in parameter

The value for the other side needs to be the opposite value. For example, if the beginning x-coordinate value is 400, the end x-coordinate value for the glide needs to be -400. The same is true if the value is -400; the exit value needs to be a positive 400.

We can easily do this with math. We will use the Negative Property of Multiplication.

Place a multiplication operator into the glide x-coordinate parameter.

operator in parameter

Place the x-value variable into the left side of the operation; type -1 into the right side.

variable in parameter

Run the program. Everything is working nicely, but the fish swimming backward when it enters from the right. There's a clownfish in every class. Sorry, bad joke.

variable value

We are going to take care of this with a costume change.

Click the Costumes tab.

costumes tab

The sprite has only one costume. We are going to make one in a few clicks. Right-click on the costume; select duplicate.

duplicate option

This costume will face in the opposite direction; click the Flip Horizontal button. That’s it.

horizontal flip button

Click the Code tab. Go to the Looks section. Add a —Switch costume to…— code block after each Set variable block.

costumes code blocks

Set the first Switch costume block to Costume1; set the other to Costume2.

selected costume parameters

Run the program. The fish is entering from one side or the other. It is swimming across to the opposite side. It is facing the correct direction. Just about everything with the animation has some random aspect.

More fish to the animation

That is all we are going to do for this animation. Connect the Green Hat block from the Events section to the beginning of the code.

green flag code attached

We need to apply the same animation code to the other sprites. Drag the Green Flag Hat block down to the Sprites section. Place it over the fish02 sprite and release.

code over sprite

Select the fish02 sprite. Look at the coding canvas. The code was copied to this sprite. Click the green flag. Watch the animation of two fish on the stage.

two fish swimming

Stop the program. Drag the code from this sprite to the fish03 sprite. Watch three fish swimming in the aquarium with the diver.

three fish swimming

Let’s add more fish to the aquarium. Use the link below and download several fish sprites. The sprites are in a Zip folder.

Download Zip file
(The fish images are courtesy of freepik.com)

Go to the Sprites section; hover over the Add Sprite button and choose the Upload option.

upload sprite option

Select all the Sprites; click the Open button.

all sprite files selected

The sprites are added to your Sprite library. The sprites are hidden until we begin the program.

Select one of the sprites. Look at the coding canvas. The sprite has the code we created in the lesson. I did this to save you time. Now you can enjoy an aquarium filled with fish. Click the Green Flag; enjoy.

lots of fish on stage

Diver animation

The diver is very still. It’s time we added animation to our diver.

Select the diver sprite. Place a —go to x…y…— block on the coding canvas. The diver is at position (-92,-100). We want the diver to remain in the general area. The diver doesn't need to be swimming around. The diver needs to look like he is floating in the water.

block on stage

Place a —glide to x…y…— block on the canvas. Don't connect it to the previous block.

blocks on stage

The diver needs to move around the starting position in random motions. Place a Random number generator into each of the glide parameters.

random blocks in parameters

We don't want the diver to stray too far away. The starting x-coordinate is -92. We will allow the diver to stray up to 20 pixels from this location. We need a range for the random number generator in the x-coordinate. Enter -72 for the lower range and -112 for the upper range.

range values in fields

Enter -80 and -120 into the y-coordinate random number generator range.

range values in fields

Get a Forever loop and place the Glide code into the loop. Connect the —Go to— code to the loop. Placing the Go to code outside the loop centers the diver at the beginning.

code blocks connected

Click the code and observe the diver moving from side to side.

The diver is moving too fast. Set the glide duration to 3-seconds. Connect the Green Flag Hat to the code.

green flag hat block connected

I have an animated Gif for you below.

Bubble sounds

The diver is underwater. We should hear some underwater sounds coming from the aquarium. Select the Sounds tab.

sounds tab

Hover over the Add Sound menu; select the Choose a Sound option.

choose sound option

Type bubbles into the search box; click the Bubbles sound.

bubbles sound icon

Click the Play button to listen to the bubbling sound.

play controls and play button

I like the sound. I would like to modify the sound so it sounds like bubbles coming from deep underwater.

Click the Slower button four times. Note how the sound is deeper. This is closer to the sound of bubbles underwater. The settings are automatically saved.

slower button

Click the Code tab.

Place a —Start Sound— code block inside the Forever loop of the animation. Place the block at the beginning of the loop. Make sure the Bubbles sound is selected.

start sound code

Click the green flag to run the program.

This lesson is complete. We have animated fish in the aquarium. The diver is animated. Bubble sounds are coming from the aquarium.

Sharing code

This is part of a much larger project. Programmers often create smaller parts of a larger program. The parts are assembled into the larger program.

This larger project includes multiple languages. It’s easy to integrate the code we created into the larger project. The code is part of each sprite.

Go to the Sprites section; select a sprite. Right-click the sprite; select the export option. This downloads the sprite to your computer. Repeat the process for each fish you want to include in the larger project.

Switch to the larger project and upload the sprites. It works just like the sprites I shared with you for import earlier.

sprite export option

The divers sound is a little different. Exporting the diver will export all the extra code. We don’t need this code in the larger project.

We will create a temporary sprite to hold the diver animation and sound.

Go to the Create Sprite button and select the Paint option.

paint sprite option

Set the name of the sprite to “diver float and sound”.

sprite name field

Select the Code tab. Select the diver sprite. Find the sprite we created. Don’t click on the sprite. Make sure you can see it in the Sprite section.

Drag the diver's motion and sound code. Take it and drop it onto the sprite. Click the diver float and sound sprite. Make sure the code is part of the sprite. Export this sprite to your computer.

code over empty sprite

Open the larger project; select the diver float and sound sprite. Make sure the diver sprite is visible. Drag and drop the code onto the diver sprite.

code over diver sprite

The code is added to the existing diver code.

new code with existing code

Look at the animation below to see how the new code is integrated into the larger project.

Right-click the diver float and sound sprite; select delete.

Please take the time to answer the quick survey below. Thank you.

Previous
Previous

Text Sprites for Scratch Projects

Next
Next

Multiple language dialogue in Scratch projects