【发布时间】:2010-05-22 10:29:58
【问题描述】:
我正在尝试使用as3 创建一个honeycomb,但我在单元格定位方面遇到了一些问题。
我已经创建了单元格(不是使用代码)和for cycled 将它们发送到funcion 并将我认为需要的参数发送给它(蜂窝单元格已经在中心的精灵容器上舞台)。
要查看循环的结构和传递的参数,请参见下面的示例,我在placeCell 中计算的唯一内容是我应该直接在名为function 的内部获得的角度
alt text http://img293.imageshack.us/img293/1064/honeycomb.png
注意:角度是颠倒的,但这并不重要,并且颜色在示例中仅用于视觉划分案例。
我的循环调用placeCell 并传递cell、current_case、counter(索引)和蜂窝cell_lv(单元级别)。
我认为这是我需要的,但我不擅长几何学和三角学,所以我不知道如何正确定位单元格:
import flash.display.Sprite;
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
function createHoneycomb (cells:int):void {
var honeycomb:Sprite = new Sprite ();
addChild (honeycomb);
var cell_lv:int = 1;
var increment:int = 6;
var tot_cur_cells:int = 1;
var current_case:int = 0;
var case_counter:int = 1;
var case_length:int = 1;
var max_cases:int = 6;
var nucleus:Sprite = new cell (); // hexagon from library
honeycomb.addChild (nucleus);
for (var i:int = 1; i <= cells; i ++) {
if (case_counter < case_length) {
case_counter ++;
} else {
current_case ++;
if (current_case > max_cases) current_case = 1;
case_counter = 1;
}
if (i == tot_cur_cells) { // if i reach the current level
if (i > 1) cell_lv ++;
case_length = cell_lv;
tot_cur_cells += (increment * cell_lv);
}
var current_cell:Sprite = new cell (); // hexagon from library
honeycomb.addChild (current_cell);
placeCell (current_cell, case_counter, current_case, cell_lv);
}
function centerHoneycomb (e:Event):void {
honeycomb.x = stage.stageWidth / 2
honeycomb.y = Math.round (stage.stageHeight / 2);
}
stage.addEventListener (Event.RESIZE, centerHoneycomb)
stage.dispatchEvent (new Event (Event.RESIZE));
}
function placeCell (cell:Sprite, counter:int, current_case:int, cell_lv:int):void {
var margin:int = 2;
// THIS IS MY PROBLEM
var start_degree:Number = (360 / (cell_lv * 6));
var angle:Number = (start_degree * ((current_case - 1) + counter) - start_degree);
var radius:Number = (cell.width + margin) * cell_lv;
cell.x = radius * Math.cos (angle);
cell.y = radius * Math.sin (angle);
// end of the problem
if (angle != 0) trace ("LV " + cell_lv + " current_case " + current_case + " counter " + counter + " angle " + angle + " radius " + radius);
else trace ("LV " + cell_lv + " current_case " + current_case + " counter " + counter + " angle " + angle + " radius " + radius);
}
createHoneycomb (64);
如果您复制并粘贴此代码,it works 但您需要创建一个六边形并将其作为单元格在 actionscript 库中调用
我该如何解决?
我也想过用开关和箱子来对齐,但我觉得这样做有点麻烦
【问题讨论】:
-
把cell()的代码也放上去,有趣的问题,希望能帮到你...
-
“我已经创建了单元格(不是使用代码)”.. 他将其创建为库中的资产,可能使用多边形工具。