2017-12-20 29 views
0

enter image description here는 액션 스크립트 3 플래시 CS6

안녕 모두, 내가 벽돌의 크기에 따라 2 차원 패턴을 만들고 싶습니다 과 사각형 또는 선을 사용하여 2D 반복 패턴을 만들 수 있습니다. 이 예에서는 190 길이 X 60 높이입니다. 400 길이 X 300 높이의 미리보기 영역이 있습니다. 미리보기 영역의 마스크가 있으므로이 미리보기 영역 외부의 모든 항목은 숨겨집니다. 지금까지 첫 번째 사각형/벽돌을 미리보기 이미지 클립의 자식 무비 클립으로 미리보기 영역 sizewise 및 locationwise에 올바르게 표시하는 코드가 있습니다. 그러나 첨부 된 이미지에 표시된 패턴을 얻기 위해이 벽돌 영화 클립을 복제하거나 복제하는 쉬운 방법을 찾을 수 없습니다. 이 동작은 버튼의 클릭 이벤트에서 발생합니다. 어떤 종류의 도움이라도 대단히 감사하겠습니다. 이전에 표시된 미리보기를 위해이 미리보기 영역을 먼저 정리하고 싶습니다. removechild에 for 루프가 있지만 한 번에 하나씩 만 제거합니다. 미리 감사드립니다.

//Checks if all required textfields have valid data -- if yes then true else false 
if(Vdata == true){ 
    //Here I should check and clean the preview area and any children previously added. 
    var Pview_mc:MovieClip = new MovieClip; //Main moiveclip which holds all rectangles. 
    Pview_mc.name = "Pview_mc"; //name the instance so that easy to remove later on. 
    var rectangle:MovieClip = new MovieClip; // initializing the variable 
    rectangle.graphics.lineStyle(0, 0x990000, 1); //defines line style (thickness, colour, alpha) 
    rectangle.graphics.drawRect(0, 0, Number(Txt_ST.text),Number(Txt_HT.text)); // (x spacing, y spacing, width, height) 
    Pview_mc.addChild(rectangle); // adds rectangle to Pview_mc movieclip 
    Preview_Area.addChild(Pview_mc); // adds the Pview_mc to the Preview_Area MovieClip 
    rectangle.y = rectangle.y-Number(Txt_HT.text); // positions the rectangle. 
} 

답변

1

벽돌 패턴 그리기 기능을 신속하고 더럽게 구현했습니다. 최적화되지 않았으므로 원하는 패턴 만 그립니다.

간단히하기 위해 나는 자식 개체를 사용하지 않고 직접 MovieClip으로 그립니다. 이 함수는 각 호출에서 패턴을 지우고 그립니다. 다음 이미지는 가능한 결과를 보여줍니다.

draw_bricks() result

그리기 기능 :

// graphics  - Object to draw to 
// origin_x  - Center of the top left brick 
// origin_y  - Center of the top left brick 
// brick_count_u - Number of bricks along the x-axis 
// brick_count_v - Number of brick along the y-axis 
// brick_w  - Brick width 
// brick_h  - Brick height 
// gap   - Brick gap 
function draw_bricks(
    graphics  :Graphics, 
    origin_x  :Number, 
    origin_y  :Number, 
    brick_count_u :int, 
    brick_count_v :int, 
    brick_w  :Number, 
    brick_h  :Number, 
    gap   :Number) :void 
{ 
    graphics.clear(); 
    graphics.lineStyle(0.0, 0x00FF00, 1.0); 
    // 
    // For every brick along y-axis 
    for (var v :int = 0; v < brick_count_v; v += 1) { 
     // 
     //   [ row ordinate ]---| 
     //        | 
     // [ base offset ]---|   | 
     //     |   | 
     //     v   v 
     var brick_y :Number = origin_y + ((brick_h + gap) * v); 
     // 
     // For every brick along x-axis 
     for (var u :int = 0; u < brick_count_u; u += 1) { 
      // 
      //   [ odd row offset ]---| 
      //        |  [ column abscissa ]---| 
      // [ base offset ]---|   |       | 
      //     |   |       | 
      //     v   v       v 
      var brick_x :Number = origin_x - (brick_w * 0.5 * (v % 2)) + ((brick_w + gap) * u); 
      // 
      // Draw brick centered at {brick_x, brick_y} 
      graphics.drawRect(brick_x - brick_w * 0.5, brick_y - brick_h * 0.5, brick_w, brick_h); 
     } 
    } 
} 

사용법 :

var bricks :MovieClip = new MovieClip; 
addChild(bricks); 
draw_bricks(bricks.graphics, 0.0, 0.0, 8, 8, 190.0, 60.0, 10.0); 

실제로이 벽돌 벽의 표시 객체 계층 구조를 필요로하지 않는 경우 내가 사용하는 것이 좋습니다 이 방법은 제거하거나 crea를 필요가 없기 때문에 모든 "벽돌 객체"를 사용하면 마스크 된 단일 표시 객체를 새로 고칠 수 있습니다.

참고 : 각 축에 대해 최적의 브릭 카운트를 계산해야합니다.
참고 : 플래시 x 축의 점은 오른쪽이고 y 축은 아래를 향합니다.

+1

Alexander에게 감사드립니다. 나는 그것이 빠르고 빠르지 않다고 말한다. 그것은 매우 적절하고, 명확하고, 단순한 논리입니다. 굉장해. 나는이 코드를 초급자이고 프로그래밍에 대해 공식적인 학습을하지 않았기 때문에 제안에 기반하여 많은 작업을해야합니다. 그러나 당신의 본보기는 완벽한 출발입니다. 코드를 변경하여 최종 패턴을 원하는 위치에 배치하여 더 명확하게 만듭니다. 일단 최종 결과가 나오면 게시 할 것입니다. 이 패턴은 바로 첫 번째 패턴입니다. 최소한 총 20 가지 패턴이 있습니다. y 축은 빨아 들인 acad와 반대입니다. – user5943436