Простое тестирование попадания будет простым решением, но оно может столкнуться с проблемами, если имеется много кнопок и только ограниченное пространство для них.В зависимости от ситуации, лучшим (и более сложным) решением может быть растеризация пространства и размещение кнопки (почти) в каждой ячейке со случайным сдвигом:
// environment variables
const numButtons:int = 16;
const maxButtonWidth:int = DummyButton.MAX_WIDTH;
const maxButtonHeight:int = DummyButton.MAX_HEIGHT;
const width:Number = stage.stageWidth;
const height:Number = stage.stageHeight;
// pseudo-random positioning
// ratio is needed for a proportional grid
var areaRatio:Number = width / height;
var maxButtonRatio:Number = maxButtonWidth / maxButtonHeight;
// compute buttons per column and row (take aspect ratios into account)
var cols:int = Math.floor(Math.sqrt(numButtons) * (areaRatio / maxButtonRatio));
var rows:int = Math.ceil(numButtons / cols);
// available space for each button within a grid segment
var spaceX:Number = (width - maxButtonWidth * cols) / cols;
var spaceY:Number = (height - maxButtonHeight * rows) / rows;
// throw an error if buttons won't fit (based on maximum dimensions)
if (cols < 1 || rows < 1 || spaceX < 0 || spaceY < 0) {
throw new Error("buttons do not fit into area");
}
// for every button
for (var i:int = 0; i < numButtons; i++) {
var row:int = Math.floor(i / cols);
var col:int = i % cols;
var button:Sprite = new DummyButton();
// coordinate = grid segment + random shift
button.x = col * (maxButtonWidth + spaceX) + Math.random() * spaceX;
button.y = row * (maxButtonHeight + spaceY) + Math.random() * spaceY;
stage.addChild(button);
}