Created
May 12, 2011 23:09
-
-
Save rynbyjn/969650 to your computer and use it in GitHub Desktop.
AS3 Air Accelerometer base class with Signal for shaking the device
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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