-1

アプリケーションを開発していますが、ナビゲーションに問題があります。ステージ上にランダムなボタンを配置していますが、一部が重複することは避けられません。この問題を解決したいのですが、方法がわかりません。誰も私を助ける考えがありますか?

AS3

for (var i:int=0; i<16; i++){
var mc_sq:MovieClip = new mc_square();
mc_sq.y = Math.round(Math.random()* 200);
mc_sq.x = Math.round(Math.random()* 300);
mc_sq.buttonMode = true;
addChild(mc_sq);
}
4

2 に答える 2

0

次のコードはテスト済みで動作します

var items:Array = [];

var numItems:Number = 16;

for(var i:int; i < numItems; i++) {
    var mc:Mc = new mc_square();
    mc.buttonMode = true;
    addChild(mc);

    while(!freezone(mc)) {
        mc.x = Math.random() * 200;
        mc.y = Math.random() * 300;     
    }
    items.push(mc);
}

function freezone(mc:MovieClip):Boolean {
    var hit:Boolean = false;
    items.forEach(function(item:MovieClip, i:int, a:Array):void {
        if(mc.hitTestObject(item)) {
            hit = true;
        }
    });
    return !hit;
}
于 2011-03-03T13:07:02.970 に答える
0

単純なヒット テストは簡単な解決策ですが、多くのボタンがあり、これらのスペースが限られている場合は問題が発生する可能性があります。状況によっては、スペースをラスタライズし、ボタンを (ほぼ) すべてのセルにランダムなシフトで配置することが、より良い (そしてより複雑な) 解決策になる場合があります。

// 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);
}
于 2011-03-03T14:14:55.913 に答える