模仿某公司地图二维建筑绘制方法

我的源代码:

 

建筑物类:

需要传入两个参数:一个建筑物地基的所有顶点组成的数组(按顺时针或逆时针顺序),和建筑物的相对高度

package 
{
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.geom.Point;
    /**
     * ...
     * @author taotao5453
     */
    public class BuildingShape extends Sprite
    {
          
        /**
         * 构造
         * @param   _pointArr 建筑地基点数组(按顺时针或逆时针顺序),
         * @param   _height 建筑物高度
         */
        private var pointArr:Array;
        private var buildingHeight:int; 
        private var wallNum:int; //墙面数,和建筑地基点数相等
        private var wallColor:uint = 0xcccccc;//墙色
        private var topColor:uint = 0xffffff;//定色
        private var s:Shape = new Shape  ;
        public function BuildingShape(_pointArr:Array, _height:int=20) 
        {
            if (_pointArr == null || _pointArr.length == 0) {
                return;
            }
            this.pointArr = _pointArr;
            this.buildingHeight = _height;
            wallNum = pointArr.length;
              
            this.addChild(s);
            drawBuildingWall();
            drawBuildingTop();
        }
          
        /**
         * 绘制建筑每面墙
         * 
         */
        private function drawBuildingWall():void
        {
            var pp1:Point;
            var pp2:Point;
            var pp3:Point;
            var pp4:Point;
            for (var m:int=0; m<wallNum; m++)
            {
                //画每面墙
                s.graphics.beginFill(this.wallColor);
                pp1 = pointArr[m];
                pp2 = pointArr[m+1] || pointArr[0];
                pp3 = new Point(pp2.x, pp2.y - buildingHeight);
                pp4 = new Point(pp1.x, pp1.y - buildingHeight);
                  
                s.graphics.moveTo(pp1.x, pp1.y);
                s.graphics.lineTo(pp2.x, pp2.y);
                s.graphics.lineTo(pp3.x, pp3.y);
                s.graphics.lineTo(pp4.x, pp4.y);
            }
            s.graphics.endFill();
        }
          
        /**
         * 绘制建筑顶部
         * 
         */
        private function drawBuildingTop():void
        {
            s.graphics.lineStyle(0,this.wallColor);
            s.graphics.beginFill(this.topColor, 0.9);
            var pn:Point;
            for (var n:int=0; n<wallNum; n++)
            {
                pn = pointArr[n];
                if (n==0)
                {
                    s.graphics.moveTo(pn.x, pn.y - buildingHeight);
                }
                else
                {
                    s.graphics.lineTo(pn.x, pn.y - buildingHeight);
                }
            }
            s.graphics.endFill();
        }
          
    }
  
}


测试 调用建筑物类
package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.geom.Point;
      
    /**
     * ...
     * @author taotao5453
     */
    public class Main extends Sprite 
    {
          
        public function Main():void
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
          
        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
              
            var p1:Point = new Point(0,0);
            var p2:Point = new Point(70,50);
            var p3:Point = new Point(100,30);
            var p4:Point = new Point(65, -5);
            var p5:Point = new Point(120, -60);
            var p6:Point = new Point(100, -80);
              
            var pArr:Array = new Array(p1,p2,p3,p4,p5,p6);
              
            var b:BuildingShape = new BuildingShape(pArr, 30);
            b.x = 100;
            b.y = 200;
            this.addChild(b);
        }
          
    }
      
}


你可能感兴趣的:(模仿某公司地图二维建筑绘制方法)