Поиск координат нарисованных объектов во Flash AS3 - PullRequest
0 голосов
/ 06 января 2010

Я делаю настольную игру во Flash; как часть процесса полного знакомства с Flash AS3.

У меня есть JPEG оригинальной доски. Это содержит ~ 1000 кругов, между которыми игроки могут перемещать фигуры. Довольно стандартная настольная игра. Круги не в любом случае регулярно расположены.

Пока что я нарисовал круги во Flash вручную и расположил их там, где они должны быть. Это выглядит великолепно - я вижу все свои места.

Теперь я хочу создать эти круги программно. Я хочу быть в состоянии сделать это, чтобы я мог настроить внешний вид пробелов (в зависимости от состояния игры). Со временем я захочу иметь возможность масштабировать / панорамировать всю игровую доску.

Мой вопрос заключается в том, есть ли способ пометить каждый круг уникальной ссылкой, а затем просмотреть и записать местоположения?

Я думаю, что-то вроде Javascript DOM "getElementsByTagName" или аналогичного.

На данный момент я вижу только два варианта:

  1. Преобразовать каждый кружок в символ и дать ему уникальное имя класса, чтобы я мог получить к нему доступ из кода
  2. Пройдите и запишите X / Y каждого круга (добавьте в мою базу данных местоположений платы, которые у меня уже есть), чтобы я мог построить их программно

Я довольно новичок во Flash, но я из технического уровня. Под этим я подразумеваю, что мне не нужно объяснять все до мелочей; скорее мне просто нужен кто-то, чтобы указать мне правильное направление! Спасибо!

1 Ответ

3 голосов
/ 06 января 2010

Во-первых, вы можете поместить круги динамически, либо совершенно случайно, и вы получите перекрывающиеся элементы, либо поместить их в сетку с небольшим случайным смещением . Возможно, у вас есть отдельный флаг , который будет генерировать круги снова и снова при щелчке , пока вы не будете удовлетворены конфигурацией, а затем выложит код сценария действия для этого с помощью ключа . Вроде как быстрый и грязный редактор уровней.

var circlesNum:int = 20;
var circleRadius:Number = 10;
var circles:Array;
var row:int = 4;
var col:int = 5;
var space:int = 5;
var randomOffset:int = 5;
var randomShift:Number;

function generateCircles(event:MouseEvent = null):void{
    circles = [];
    while(numChildren > 0) removeChildAt(0);
    for(var i:int = 0 ; i < circlesNum; i++){
        var circle:Shape = new Shape();
        circle.graphics.lineStyle(1);
        circle.graphics.drawCircle(0, 0, circleRadius);
        circle.name = 'circle'+i;
        randomShift = Math.random() * randomOffset - randomOffset * .5;
        circle.x = ((circleRadius * 2 +space) * (i % col)) + randomShift;
        circle.y = ((circleRadius * 2 +space) * (i % row)) + randomShift;
        circles.push(circle);
        addChild(circle);
    }
}
function generateCode(event:KeyboardEvent = null):void {
    var code:String = 'var circles:Array = [';
    for(var i:int = 0 ; i < circlesNum; i++){
        if(i < circlesNum-1) code += '{name: ' + circles[i].name + 'x: ' + circles[i].x + ',y: ' + circles[i].y + '},\n';
        else                 code += '{name: ' + circles[i].name + 'x: ' + circles[i].x + ',y: ' + circles[i].y + '}];';
    }
    trace(code);
}

stage.addEventListener(MouseEvent.MOUSE_DOWN, generateCircles);
stage.addEventListener(KeyboardEvent.KEY_DOWN, generateCode);

Вы можете назвать каждый экземпляр клипа круга и использовать actioncript для получения координат.

//assuming circles is a movieclip containing all your circles
var code:String = 'var circles:Array = [';
for(var i:int = 0 ; i < circles.numChildren; i++){
    if(i < circles.numChildren-1) code += '{name: ' + circles.getChildAt(i).name +'x: ' + circles.getChildAt(i).x + ',y: ' + circles.getChildAt(i).y + '},';
    else                          code += '{name: ' + circles.getChildAt(i).name +'x: ' + circles.getChildAt(i).x + ',y: ' + circles.getChildAt(i).y + '}];';
}
trace(code);

Если вам нужен только X / Y каждого круга, вы можете использовать JSFL (javascript flash), чтобы пройтись по вашим кругам и выплюнуть координаты.

Вот пример:

var doc = fl.getDocumentDOM();
var sel = doc.selection;
var selStr = 'var circles:Array = [';
if(sel){
    var elNum = sel.length;
    for(var i = 0 ; i < elNum ; i++){
        if(i < elNum-1) selStr += '{name: '+ sel[i].name +', x: ' + sel[i].x + ',y:' + sel[i].y + '},';
        else            selStr += '{name: '+ sel[i].name +', x: ' + sel[i].x + ',y:' + sel[i].y + '}];';
    }
    fl.trace(selStr);
}

Перейти к Файл> Создать> Файл Flash Javascript и вставьте это. Вы можете сохранить его как GetSelectionXY.jsfl в папке Commands , а затем назначить сочетание клавиш , если вы найдете это удобным.

В противном случае выберите свои круги (может быть удобно, чтобы все они были в одном слое, и просто выберите слой) и выполните команду (с помощью кнопки / стрелки воспроизведения).

Должно плевать что-то вроде:

var circles:Array = [{name: c1, x: 286.95,y:172},{name: c1, x: 180.95,y:320},{name: c1, x: 92.95,y:126},{name: c1, x: 184.95,y:190},{name: c1, x: 392.95,y:112},{name: c1, x: 316.95,y:226},{name: c1, x: 84.95,y:207},{name: c1, x: 84.95,y:85}];

на панели вывода .

Самая простая версия , вероятно, будет с jsfl , вы можете просто использовать DrawingObjects, без фрагментов ролика, просто переместить их, а затем нажать волшебную комбинацию клавиш. Более гибкая версия будет мини-редактором grid thingy .

НТН * * тысяча пятьдесят один

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...