[Flash 15+]

April 2015

BlankTemplate – Action Binder (first draft)

The actionBinder handle Keyboard, GameInput, and the AirGamepad (that transform any Android device into a remote gamepad).

Notes for AirGamepad :
– The swc can be found here in the AIR Sdk ( frameworks\libs\air\gamepad.swc )
– Strangely with android Adobe Air 17 I am not able to launch it, but you can DL the version 16 from the archive
– In Air 18, the gamepad is back :)

Example skin, that mimic the good old Nes game controller :)
Setp 1)
On AIRGamepadEvent.CONNECT event I replace the default image
Airpad Connected

//trace("createImageAndShowConfig request !");
// generate an image on the device
var dim:Point = new Point(airGamePadRef.width, airGamePadRef.height);

var tf:TextField = new TextField();
tf.defaultTextFormat = new TextFormat("Arial", 48, 0xFFFFFF, true, null, null, null, null, TextFormatAlign.CENTER);
tf.width = dim.x;
tf.height = 200;
tf.text = "Gamepad connected !";

var ba:ByteArray = new ByteArray();
var dat:BitmapData = new BitmapData(dim.x, dim.y, false, 0x0);
dat.draw(tf, new Matrix(1, 0, 0, 1, 0, dim.y * 1 / 3));
dat.encode(dat.rect, new JPEGEncoderOptions(80), ba);
dat.dispose();

airGamePadRef.drawImage(ba);

_configPanel.show();

Setp 2) building the resolution free gamepad skin on the fly and send it to the device
Airpad display

protected function _createAndApplySkin():void
{
//trace("_createAndApplySkin request !");
// clean old skin if any
_clearDisplayList();

// get android screen res
var dim:Point = new Point(airGamePadRef.width, airGamePadRef.height);

_SW = dim.x;
_SH = dim.y;

// drawing
this.graphics.beginFill(0xD1D2CD);
this.graphics.drawRect(0, 0, _SW, _SH);
this.graphics.beginFill(0xDADBD5);
this.graphics.drawRect(0, 0, _SW, int(_SH * (3 / 18)));
this.graphics.endFill();

var tf:TextField = new TextField();
tf.defaultTextFormat = new TextFormat("Impact", _SH * (3 / 36), 0xCE0005, false, true);
tf.autoSize = TextFieldAutoSize.LEFT;
tf.text = "AIR Advantage ";
tf.selectable = false;
tf.x = 10;
tf.y = 10;
addChild(tf);

var tfGameName:TextField = new TextField();
tfGameName.defaultTextFormat = new TextFormat("Impact", _SH * (1 / 36), 0x484d53);
tfGameName.autoSize = TextFieldAutoSize.LEFT;
tfGameName.text = Config.GAME_NAME;
tfGameName.selectable = false;
tfGameName.x = 10;
tfGameName.y = int(_SH * (3 / 18) - tfGameName.textHeight);
addChild(tfGameName);

_params = new Bitmap(new Params());
_params.height = _params.width = _SH * (3 / 36);
_params.x = _SW - 20 - _params.width;
_params.y = 20;
addChild(_params);

_vPad = new VirtualPad(int(_SW * (6 / 18)));
_vPad.x += (_configPanel.rightHanded) ? int(4 / 18 * _SW) : int(14 / 18 * _SW);
_vPad.y += int(6 / 9 * _SH);
addChild(_vPad);

_vBtnB = new VirtualButton(int(_SW * (4 / 18)));
_vBtnB.x += (_configPanel.rightHanded) ? int(10 / 18 * _SW) : int(3 / 18 * _SW);
_vBtnB.y += int(6 / 9 * _SH);
addChild(_vBtnB);

_vBtnA = new VirtualButton(int(_SW * (4 / 18)));
_vBtnA.x += (_configPanel.rightHanded) ? int(15 / 18 * _SW) : int(8 / 18 * _SW);
_vBtnA.y += int(6 / 9 * _SH);
addChild(_vBtnA);

_startBtn = new VirtualRoundedButton(int(_SW * (3 / 18)));
_startBtn.x += (_configPanel.rightHanded) ? int(10 / 18 * _SW) : int(3 / 18 * _SW);
_startBtn.y += int(3 / 9 * _SH);
addChild(_startBtn);

_selectBtn = new VirtualRoundedButton(int(_SW * (3 / 18)));
_selectBtn.x += (_configPanel.rightHanded) ? int(15 / 18 * _SW) : int(8 / 18 * _SW);
_selectBtn.y += int(3 / 9 * _SH);
addChild(_selectBtn);

_applySkin();
}

protected function _applySkin():void
{
//trace("_applySkin request !");
var ba:ByteArray = new ByteArray();
var dat:BitmapData = new BitmapData(_SW, _SH, false, 0xCC0000);
dat.draw(this);
dat.encode(dat.rect, new JPEGEncoderOptions(100), ba);
dat.dispose();

// send the skin on the mobile device
airGamePadRef.drawImage(ba);

// -- Wand Listeners
airGamePadRef.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin);
airGamePadRef.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove);
airGamePadRef.addEventListener(TouchEvent.TOUCH_END, onTouchEnd);

// accelerometer
if (_configPanel.accelerometer)
{
airGamePadRef.addEventListener(AccelerometerEvent.UPDATE, _onAccUpdate);
}

VirtualPad, VirtualButton and VirtualRoundedButton are regular bitmapFilled Shapes