Skip to content

Instantly share code, notes, and snippets.

@rynbyjn
Created May 12, 2011 23:09
Show Gist options
  • Save rynbyjn/969650 to your computer and use it in GitHub Desktop.
Save rynbyjn/969650 to your computer and use it in GitHub Desktop.
AS3 Air Accelerometer base class with Signal for shaking the device
package com.client.projectname.device
{
import com.greensock.TweenLite;
import org.osflash.signals.Signal;
import flash.events.AccelerometerEvent;
import flash.sensors.Accelerometer;
/**
* Adds accelerometer functionality for various types of accelerometer events.
*
* @author Ryan Boyajian
* @version 1.0.0 :: Apr 13, 2011
*/
public class AccelerometerAccess
{
private static const SHAKE_THRESHOLD :Number = .666;
private static const SHAKE_DELAY :Number = 1000;
private var _acc :Accelerometer;
private var _lastX :Number = NaN;
private var _lastY :Number = NaN;
private var _lastZ :Number = NaN;
private var _isSupported :Boolean = false;
private var _isMuted :Boolean = true;
public var shake :Signal = new Signal();
public function AccelerometerAccess()
{
}
/*
* API
**************************************************************************************************** */
public function init( $requestedUpdateInterval :Number = NaN ) :void
{
if( Accelerometer.isSupported ) {
_isSupported = true;
_acc = new Accelerometer();
if( !_acc.muted ) {
_isMuted = false;
if( !isNaN( $requestedUpdateInterval ) ) _acc.setRequestedUpdateInterval( $requestedUpdateInterval );
start();
}
}
}
/**
* Starts listening to the accelerometer event.
*/
public function start() :void
{
if( isSupportedAndNotMuted ) _acc.addEventListener( AccelerometerEvent.UPDATE, updateAccelerometer );
}
/**
* Stops listening to the accelerometer event.
*/
public function stop() :void
{
if( isSupportedAndNotMuted ) _acc.removeEventListener( AccelerometerEvent.UPDATE, updateAccelerometer );
}
public function get isSupportedAndNotMuted() :Boolean
{
return _isSupported && !_isMuted;
}
public function toString() :String
{
return 'com.oakley.ocp.utils.AccelerometerAccess';
}
/*
* INTERNAL
**************************************************************************************************** */
/**
* Receives the event from the device if supported and not muted.
*/
private function updateAccelerometer( $e :AccelerometerEvent ) :void
{
// set initially if they are NaN
if( isNaN( _lastX ) || isNaN( _lastY ) || isNaN( _lastZ ) ) resetLastValues( $e );
// get the change since last update
var dx :Number = abs( _lastX - $e.accelerationX );
var dy :Number = abs( _lastY - $e.accelerationY );
var dz :Number = abs( _lastZ - $e.accelerationZ );
// determine shake only if two axis are past the threshold
if( ( dx > SHAKE_THRESHOLD && dy > SHAKE_THRESHOLD ) || ( dx > SHAKE_THRESHOLD && dz > SHAKE_THRESHOLD ) || ( dy > SHAKE_THRESHOLD && dz > SHAKE_THRESHOLD ) ) {
// stop listening after a shake is found
stop();
this.shake.dispatch();
// start listening again after a delay
TweenLite.delayedCall( SHAKE_DELAY, start );
}
// reset
resetLastValues( $e );
}
/**
* Resets the previous values of x, y, and z.
*/
private function resetLastValues( $e :AccelerometerEvent ) :void
{
_lastX = $e.accelerationX;
_lastY = $e.accelerationY;
_lastZ = $e.accelerationZ;
}
private function abs( $value :Number ) :Number
{
return ( $value < 0 ) ? $value * -1 : $value;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment