We are going to extend my previous Simple Physics AS3 script by adding friction to the ball.
This script creates a ball and makes it bounce around in a container, changing direction when a wall is hit. The ball slows down over time due to friction.
Click ball to reset speed
View Code ACTIONSCRIPT
/** * Simple Physics with Friction * --------------------- * VERSION: 1.1 * DATE: 11/21/2010 * AS3 * UPDATES AND DOCUMENTATION AT: http://www.FreeActionScript.com **/ package com.freeactionscript { import flash.display.DisplayObjectContainer; import com.freeactionscript.Ball; import flash.events.Event; import flash.events.MouseEvent; public class SimplePhysics { // reference to container (stage, movieclip or sprite) private var _canvas:DisplayObjectContainer; // ball object private var _ball:Ball; // boundries private var _minX:int; private var _minY:int; private var _maxX:int; private var _maxY:int; // settings private var _friction:Number = .98; /** * Constructor * @param $canvas Takes DisplayObjectContainer (MovieClip, Sprite, Stage) as argument */ public function SimplePhysics($canvas:DisplayObjectContainer) { trace("SimplePhysics"); _canvas = $canvas; setBoundries(_canvas); createBall(_canvas); enable(); } /** * Creates ball */ private function createBall($container:DisplayObjectContainer):void { // get random number between -10 and 10 var newRandomX:Number = Math.random() * 10 - 10; var newRandomY:Number = Math.random() * 10 - 10; // Create new ball. Usage: new Ball(x, y, velocity X, velocity Y); _ball = new Ball(150, 200, newRandomX, newRandomY); // add mouse listener to ball _ball.addEventListener(MouseEvent.CLICK, onBallClick); // $container.addChild(_ball); } /** * On ball click handler * @param $even Takes MouseEvent */ private function onBallClick($even:MouseEvent):void { resetBall(Ball($even.target)); } /** * Enables physics engine */ private function enable():void { _canvas.addEventListener(Event.ENTER_FRAME, update); } /** * Disables physics engine */ public function disable():void { _canvas.removeEventListener(Event.ENTER_FRAME, update); } /** * Resets ball's volocity * @param $ball Takes Ball object */ public function resetBall($ball:Ball):void { // get random number between -10 and 10 var newRandomX:Number = Math.random() * 20 - 20; var newRandomY:Number = Math.random() * 20 - 20; // update ball velocity $ball.velocityX = newRandomX; $ball.velocityY = newRandomY; } /** * Sets container boundries */ public function setBoundries($container:DisplayObjectContainer):void { _minX = 0; _minY = 0; _maxX = $container.width; _maxY = $container.height; } /** * Update function that updates ball * @param $event */ private function update($event:Event):void { // Check X // Check if we hit top if (((_ball.x - _ball.width / 2) < _minX) && (_ball.velocityX < 0)) { _ball.velocityX = -_ball.velocityX; } // Check if we hit bottom if ((_ball.x + _ball.width / 2) > _maxX && (_ball.velocityX > 0)) { _ball.velocityX = -_ball.velocityX; } // Check Y // Check if we hit left side if (((_ball.y - _ball.height / 2) < _minY) && (_ball.velocityY < 0)) { _ball.velocityY = -_ball.velocityY } // Check if we hit right side if (((_ball.y + _ball.height / 2) > _maxY) && (_ball.velocityY > 0)) { _ball.velocityY = -_ball.velocityY; } // apply friction to ball velocity _ball.velocityX *= _friction; _ball.velocityY *= _friction; // update ball position _ball.x += _ball.velocityX; _ball.y += _ball.velocityY; } } } |
Here is how the previous AS3 physics example was changed to add friction.
We add a friction variable:
private var _friction:Number = .98;
And then we apply friction to the ball velocity:
_ball.velocityX *= _friction;
_ball.velocityY *= _friction;
That’s all there’s to it.
In the next example, we will add Gravity.

[...] gravity to a ball from my previous Simple Physics with Friction AS3 [...]
[...] out how to add friction in the next example. Game Examples AS3, PhysicsActionScript 3, bouncing ball, game physics, [...]