在Flash AS3中查找绘制对象的坐标

时间:2010-01-06 09:38:39

标签: flash actionscript-3

我正在使用Flash制作棋盘游戏;作为完全掌握Flash AS3的过程的一部分。

我有原始棋盘的JPEG。这包含〜1000个圈子,玩家可以在它们之间移动棋子。非常标准的棋盘游戏。圆圈以任何方式有规律地间隔开。

到目前为止,我已经手动绘制了Flash中的圆圈,并将它们放置在需要的位置。这看起来很棒 - 我可以看到我所有的地方。

我现在要做的是以编程方式创建这些圆圈。我希望能够做到这一点,所以我可以调整空间的外观(取决于游戏状态)。最终我还希望能够缩放/平移整个游戏板。

我的问题是,有没有办法用独特的参考标记每个圆圈然后循环并记录位置?

我在想的东西有点像Javascript DOM“getElementsByTagName”或类似的东西。

目前我只能看到两个选项:

  1. 将每个圆圈转换为符号并为其指定一个唯一的类名,以便我可以从代码
  2. 访问它
  3. 通过并记下每个圆圈的X / Y(添加到我已经拥有的董事会位置数据库),这样我就可以编程方式绘制它们
  4. 我对Flash很新,但我确实来自技术背景。我的意思是我不需要每一个最后的基本细节解释;相反,我只需要有人指出我正确的方向!谢谢!

1 个答案:

答案 0 :(得分:3)

您可以将圆圈动态放置在第一位,或者完全随机,并且您将获得重叠的元素,或者将它们放置在具有小的随机偏移的网格中。也许有一个单独的fla 会一次又一次地生成圆圈,直到您对配置感到满意为止,然后使用a吐出动作脚本代码键即可。有点像一个快速而肮脏的关卡编辑器。

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);

您可以为每个圆形影片剪辑实例命名,并使用actionscript来获取坐标。

//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);
}

转到文件&gt;新&gt; Flash Javascript文件 并粘贴。您可以将其保存为命令文件夹中的 GetSelectionXY.jsfl ,如果您觉得这很方便,则可以指定键盘快捷键

否则,选择您的圈子(可以方便地将所有圈子放在一个图层中,然后只选择图层)并运行命令(使用播放按钮/箭头)。

应吐出类似的东西:

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

HTH