File:Positioner.js
(function() {
"use strict";
/**
* Initially layouts all interface elements
* @module cloudkid
* @class Positioner
*/
var Positioner = function(){};
// Set the protype
Positioner.prototype = {};
/**
* Initial position of all layout items
* @method positionItems
* @static
* @param {createjs.DisplayObject|PIXI.DisplayObject} parent
* @param {Object} itemSettings JSON format with position information
*/
Positioner.positionItems = function(parent, itemSettings)
{
var rot, pt, degToRad;
if(CONFIG_PIXI)
degToRad = Math.PI / 180;
for(var iName in itemSettings)
{
var item = parent[iName];
if(!item)
{
Debug.error("could not find object '" + iName + "'");
continue;
}
var setting = itemSettings[iName];
if(CONFIG_PIXI)
{
item.position.x = setting.x;
item.position.y = setting.y;
pt = setting.scale;
if(pt)
{
item.scale.x *= pt.x;
item.scale.y *= pt.y;
}
pt = setting.pivot;
if(pt)
{
item.pivot.x = pt.x;
item.pivot.y = pt.y;
}
rot = setting.rotation;
if(rot)
item.rotation = rot * degToRad;//Pixi rotations are in radians
}
else
{
item.x = setting.x;
item.y = setting.y;
pt = setting.scale;
if(pt)
{
item.scaleX *= pt.x;
item.scaleY *= pt.y;
}
pt = setting.pivot;
if(pt)
{
item.regX = pt.x;
item.regY = pt.y;
}
rot = setting.rotation;
if(rot)
item.rotation = rot;
}
//item.name = iName;
if(setting.hitArea)
{
var hitArea = setting.hitArea;
if(CONFIG_PIXI)
{
item.hitArea = Positioner.generateHitArea(hitArea);
}
else
{
item.hitShape = Positioner.generateHitArea(hitArea);
}
}
}
};
/**
* Create the polygon hit area for interface elements
* @static
* @method generateHitArea
* @param {Object|Array} hitArea One of the following: <br/>
* * An array of points for a polygon, e.g.
*
* [{x:0, y:0}, {x:0, y:20}, {x:20, y:0}]
*
* * An object describing a rectangle, e.g.
*
* {type:"rect", x:0, y:0, w:10, h:30}
*
* * An object describing an ellipse, where x and y are the center, e.g.
*
* {type:"ellipse", x:0, y:0, w:10, h:30}
*
* * An object describing a circle, where x and y are the center, e.g.
*
* {type:"circle", x:0, y:0, r:20}
* @param {Number} scale=1 The size to scale hitArea by
* @return {Object} A geometric shape object for hit testing, either a Polygon, Rectangle, Ellipse, or Circle,
* depending on the hitArea object. The shape will have a contains() function for hit testing.
*/
Positioner.generateHitArea = function(hitArea, scale)
{
if(!scale)
scale = 1;
var library;
if(CONFIG_PIXI)
library = window.PIXI;
else
library = window.createjs;
if(isArray(hitArea))
{
if(scale == 1)
return new library.Polygon(hitArea);
else
{
var temp = [];
for(var i = 0, len = hitArea.length; i < len; ++i)
{
temp.push(new library.Point(hitArea[i].x * scale, hitArea[i].y * scale));
}
return new library.Polygon(temp);
}
}
else if(hitArea.type == "rect" || !hitArea.type)
return new library.Rectangle(hitArea.x * scale, hitArea.y * scale, hitArea.w * scale, hitArea.h * scale);
else if(hitArea.type == "ellipse")
return new library.Ellipse((hitArea.x - hitArea.w * 0.5) * scale, (hitArea.y - hitArea.h * 0.5) * scale, hitArea.w * scale, hitArea.h * scale);//convert center to upper left corner
else if(hitArea.type == "circle")
return new library.Circle(hitArea.x * scale, hitArea.y * scale, hitArea.r * scale);//x & y are center, pixi documentation lies
return null;
};
var isArray = function(o)
{
return Object.prototype.toString.call(o) === '[object Array]';
};
namespace('cloudkid').Positioner = Positioner;
}());