wip/rubber band

 
var game = new Phaser.Game(800, 600, Phaser.AUTO, 'phaser-example', { preload: preload, create: create, update: update, render: render });

function preload() {

    game.load.spritesheet('balls', 'assets/sprites/balls.png', 17, 17);

}

var balls;

var draggingBand = false;
var draggingSprite = null;
var dragPoint;
var dragDelta;

var band;
var bandDisplay;

var selection = [];
var target = null;

function create() {

    game.stage.backgroundColor = '#08538a';

    balls = game.add.group();

    for (var i = 0; i < 40; i++)
    {
        var sprite = balls.create(game.world.randomX, game.world.randomY, 'balls', 1);
        sprite.inputEnabled = true;
        // sprite.input.enableDrag();
        sprite.events.onDragStart.add(startDrag, this);
        sprite.events.onDragStop.add(stopDrag, this);
    }

    band = new Phaser.Rectangle();

    bandDisplay = game.add.graphics(0, 0);
    bandDisplay.lineStyle(1, 0xffffff, 1);

    dragPoint = new Phaser.Point;
    dragDelta = new Phaser.Point;

    game.input.onDown.add(startRubberBand, this);
    game.input.onUp.add(stopRubberBand, this);
    game.input.addMoveCallback(updatePointer, this);

}

function startRubberBand (pointer) {

    //  Check this, otherwise they've clicked on a Sprite
    if (pointer.targetObject === null)
    {
        draggingBand = true;

        band.x = pointer.x;
        band.y = pointer.y;
        band.width = 1;
        band.height = 1;

        selection.length = 0;
        balls.forEach(clearSelection, this);
    }

}

function clearSelection (item) {

    item.frame = 1;
    item.input.disableDrag();

}

function stopRubberBand (pointer) {

    draggingBand = false;

    //  Normalise the rubber band, so the intersects check works
    if (band.width < 0)
    {
        band.x += band.width;
        band.width = Math.abs(band.width);
    }

    if (band.height < 0)
    {
        band.y += band.height;
        band.height = Math.abs(band.height);
    }

    if (!band.empty)
    {
        //  Get all the sprites inside or touching the rubber band
        balls.forEach(addToSelection, this);
    }
    
}

function addToSelection (item) {

    var bounds = item.getBounds();

    if (Phaser.Rectangle.intersects(bounds, band))
    {
        item.frame = 0;
        item.input.enableDrag();
        item.originPoint = new Phaser.Point(item.x, item.y);

        selection.push(item);
    }

}

function updatePointer (pointer) {

    if (draggingBand)
    {
        band.width = pointer.x - band.x;
        band.height = pointer.y - band.y;
    }
    else if (draggingSprite !== null)
    {
        dragDelta.set(pointer.x - dragPoint.x, pointer.y - dragPoint.y);

        for (var i = 0; i < selection.length; i++)
        {
            if (selection[i] !== draggingSprite)
            {
                selection[i].x = selection[i].originPoint.x + dragDelta.x;
                selection[i].y = selection[i].originPoint.y + dragDelta.y;
            }
        }
    }

}

function startDrag (sprite, pointer) {

    if (selection.indexOf(sprite) > -1)
    {
        dragPoint.set(sprite.x, sprite.y);
        draggingSprite = sprite;
    }

}

function stopDrag (sprite, pointer) {

    draggingSprite = null;
    
}

function update() {
}

function render() {

    bandDisplay.clear();

    if (draggingBand)
    {
        bandDisplay.lineStyle(1, 0xffffff, 1);
        bandDisplay.beginFill(0xffffff, 0.1);
        bandDisplay.drawRect(band.x, band.y, band.width, band.height);
    }

    // game.debug.text(dragPoint, 32, 32);
    // game.debug.text(dragDelta, 32, 64);

}