Fork Heaps on GitHub
Menu

Example Pad

«    »

Heaps includes gamepad support

class Pad extends hxd.App {

  var flow : h2d.Flow;
  var l : Array<PadUI>;
  var tf : h2d.Text;

  override function init() {
    l = [];
    flow = new h2d.Flow(s2d);
    flow.padding = 20;
    flow.layout = Vertical;

    tf = new h2d.Text(hxd.res.DefaultFont.get(), flow);
    tf.text = "Waiting for pad...";

    hxd.Pad.wait(onPad);
  }

  function onPad( p : hxd.Pad ){
    tf.remove();
    var ui = new PadUI(p, flow);
    l.push( ui );
    if( !p.connected )
      throw "Pad not connected ?";
    p.onDisconnect = function(){
      if( p.connected )
        throw "OnDisconnect called while still connected ?";
      ui.remove();
      l.remove( ui );
    }
    flow.reflow();
  }

  // if we the window has been resized
  override function onResize() {

  }

  override function update(dt:Float) {
    for( ui in l )
      ui.update();
  }

  static function main() {
    hxd.Res.initEmbed();
    new Pad();
  }

}

class PadUI extends h2d.Object {

  var tfName : h2d.Text;

  var bg : h2d.Graphics;
  var main : h2d.Graphics;
  var left : h2d.Graphics;
  var right : h2d.Graphics;

  var lt : h2d.Graphics;
  var rt : h2d.Graphics;

  var buttons : Map<String,{ tf : h2d.Text, bg : h2d.Bitmap }>;

  var pad : hxd.Pad;

  public function new( p : hxd.Pad, parent : h2d.Object ){
    super( parent );

    pad = p;

    bg = new h2d.Graphics(this);
    bg.lineStyle(1,0xFFFFFF,0.5);
    bg.drawRect(0,0,660,160);
    bg.lineStyle(1,0xFFFFFF,1);
    bg.drawRect(20,20,100,100);
    bg.drawRect(140,20,100,100);
    bg.drawRect(260,20,20,100);
    bg.drawRect(300,20,20,100);
    bg.endFill();

    var fnt = hxd.Res.customFont.toFont();

    tfName = new h2d.Text(fnt,this);
    tfName.text = pad.name;

    main = new h2d.Graphics(this);
    main.lineStyle(1,0x00FF00,1);
    main.drawCircle(0,0,4);
    main.endFill();

    left = new h2d.Graphics(this);
    right = new h2d.Graphics(this);

    for( g in [left,right] ){
      g.beginFill(0xFF0000);
      g.drawCircle(0,0,2);
      g.endFill();
    }

    lt = new h2d.Graphics(this);
    lt.x = 260;
    rt = new h2d.Graphics(this);
    rt.x = 300;
    for( g in [lt,rt] ){
      g.beginFill(0x00FF00);
      g.drawRect(0,0,20,100);
      g.endFill();
      g.scaleY = 0;
      g.y = 120;
    }

    buttons = new Map();

    var x = 0.;
    for( n in ["A","B","X","Y","LB","RB","LT","RT","back","start","dpadUp","dpadDown","dpadLeft","dpadRight"] ){
      var t = new h2d.Text(fnt,this);
      x += 20;
      t.x = x;
      t.y = 140;
      t.text = n;
      t.alpha = 0.1;
      var bg = new h2d.Bitmap(h2d.Tile.fromColor(0xFFFFFF, hxd.Math.ceil(t.textWidth), 8), t);
      bg.y = 10;
      bg.alpha = 0;
      buttons.set(n, { tf : t, bg : bg });

      x += t.textWidth;
    }
  }

  var wasPressed = false;
  public function update(){
    var conf = pad.config;
    main.x = 20 + 50 + pad.xAxis * 50;
    main.y = 20 + 50 + pad.yAxis * 50;

    left.x = 20 + 50 + pad.values[ conf.analogX ] * 50;
    left.y = 20 + 50 - pad.values[ conf.analogY ] * 50;
    left.setScale( 1 + 3 * pad.values[conf.analogClick] );

    right.x = 140 + 50 + pad.values[ conf.ranalogX ] * 50;
    right.y = 20 + 50 - pad.values[ conf.ranalogY ] * 50;
    right.setScale( 1 + 3 * pad.values[conf.ranalogClick] );

    lt.scaleY = -pad.values[ conf.LT ];
    rt.scaleY = -pad.values[ conf.RT ];

    for( k in buttons.keys() ) {
      var bid = Reflect.field(conf, k);
      var but = buttons[k];
      but.tf.alpha = 0.3 + (pad.buttons[bid] ? 0.7 : 0);

      if( pad.buttons[bid] != pad.isDown(bid) )
        throw "Button " + bid + " = " + pad.buttons[bid] + " but isDown = " + pad.isDown(bid);

      var bg = but.bg;
      if( pad.isPressed(bid) ) {
        bg.alpha = 1;
        bg.color.setColor(0xFF00FF00);
      } else if( pad.isReleased(bid) ) {
        bg.alpha = 1;
        bg.color.setColor(0xFFFF0000);
      } else if( bg.alpha > 0 )
        bg.alpha -= 0.05;
    }

    if( !wasPressed && pad.isDown(conf.A) && pad.values[conf.LT] > 0 && pad.values[conf.RT] > 0 )
      pad.rumble( pad.values[conf.LT], pad.values[conf.RT]*0.5 );
    wasPressed = pad.isDown(conf.A);

    if(hxd.Key.isDown(hxd.Key.ESCAPE)) {
      hxd.System.exit();
    }
  }
}

View source on Github Open in new tab