A physics engine is a scripting method used for creating the physics, or movement, in a project. This movement can include jumping, side-motion, wall-jumping, and more. Physics engines are commonly designed once and used for many projects or borrowed by other users to save the time of recreating one. This article contains an example physics engine which can be used in a Scratch project.
|Note:||This physics engine is not the only possible one to create.|
- Move horizontally on tilted and flat surfaces
- Collide with a specific color (which can be modified to be a sprite)
The following script would be placed into the sprite which performs the physics.
|Warning:||This script contains some bugs, so make sure to read the bugs noted under the script before deciding to use it.|
when gf clicked set [x velocity v] to (0) //sets the horizontal speed to "0" set [y velocity v] to (0) //sets the vertical speed to "0" forever if <key [right arrow v] pressed> then //when you intend for the sprite to move right change [x velocity v] by (1) //"x velocity" is the horizontal speed, and changing it by "1" makes the sprite move more right end if <key [left arrow v] pressed> then //when you intend for the sprite to move left change [x velocity v] by (-1) //makes the sprite move more left end set [x velocity v] to ((x velocity) * (0.9)) //for a gradual slowdown and to prevent the speed from reaching too high change x by (x velocity) //the actual, physical movement if <touching color [#1B2BE0]> then //if colliding with either a ramp or wall change y by (([abs v] of (x velocity)) + (1)) //the faster you move, the more velocity it has to go up a slope if <touching color [#1B2BE0]> then //if the slope is too steep change y by ((0) - (([abs v] of (x velocity)) + (1))) //go back down it change x by ((0) - (x velocity)) //go to the previous x position at the bottom of the slope set [x velocity v] to ((x velocity) / (2)) //slow down after collision with wall or steep slope end end if <key [up arrow v] pressed> then change y by (-1) //truly, the sprite is 1 pixel above the platform, meaning it has to move down 1 to check if it's "on it" if <touching color [#1B2BE0]> then //if on the platform set [y velocity v] to (10) //gives the speed needed to jump end change y by (1) //go back up 1 pixel since the sprite went down 1 before to check if it was on a platform end if <(y velocity) < (3)> then //when reaching the top of a jump or falling downward change y by (-1) //to check if on the platform if <not <touching color [#1B2BE0]>> then //if not on the platform change [y velocity v] by (-1) //gravity exerting a faster downward force end change y by (1) //because before the sprite moved down 1 pixel, and now it must go back in place end set [y velocity v] to ((y velocity) * (.9)) //for gradual movement change, as in realistic physics change y by (y velocity) //the previous scripts set the speed, but now the sprite physically moves vertically if <touching color [#1B2BE0]> then //if colliding with a floor or ceiling change y by ((0) - (y velocity)) //reverses the direction set [y velocity v] to ((y velocity) / (2.5)) //greatly reduces vertical speed after collision to the sprite nearly stops end if <<key [down arrow v] pressed> and <not <touching color [#1B2BE0]>>> then//if sprite is not touching the ground change y by (-1)// moves the sprite down one pixel to ensure it is touching the floor wait until <not <key [down arrow v] pressed>> end
There is a bug where after you jump, if there is a wall too close to the sprite, then there is some velocity "left over" and the sprite jumps up and down quickly. It can be worked around by going to the edge of the platform so the sprite goes down slightly and then moving it back up on the platform.
Additionally, there is a bug where occasionally the sprite is unable to jump at all. To work around this, press the down arrow to move down one pixel.
- Making Objects Move in Scrollers
- Shooting Projectiles
- Simulating Gravity
- Wall Sensors