※現在、「wonderfl build flash online」求人コンテンツ制作に関してのアンケートを実施中です!みなさまのお力添えを頂いて、続々とアンケート結果が集まっていますが、まだまだ募集しております。ご協力のほど、どうぞよろしくお願いいたします!

wonderfl運営事務局
→アンケートページ(※ログインしてからお答えいただけるようになっています。)

 notice: Flash editor updated! Join the development! Thanks to MiniBuilder


forked from : checkmate's fladdict challenge for professionals [diff(386)]

FORKED
  1. // forked from swingpants's Cityscape with dot pattern windows
  2. // forked from checkmate's fladdict challenge for professionals
  3. /**
  4.  * Theme:
  5.  * Play with BitmapPatterBuilder.
  6.  * Purpose of this trial is to find the possibility of the dot pattern.
  7.  *
  8.  * by Takayuki Fukatsu aka fladdict
  9.  **/
  10.   /**
  11.  * Cityscape Maker v0.1
  12.  * 3D Cityscape, with dot pattern windows and 3D fly - To do: Camera flybys.
  13.  *
  14.  * by Swingpants
  15.  **/
  16. package 
  17.     import flash.display.Sprite; 
  18.     import flash.display.MovieClip;
  19.     import flash.display.BitmapData 
  20.     import flash.events.Event; 
  21.     import flash.display.Graphics;
  22.     import flash.display.StageQuality 
  23.     import flash.text.*; 
  24.     import flash.geom.Point;
  25.     import org.papervision3d.materials.ColorMaterial; 
  26.     import org.papervision3d.objects.primitives.Plane; 
  27.     import org.papervision3d.objects.primitives.Cube; 
  28.     import org.papervision3d.objects.primitives.Cylinder; 
  29.     import org.papervision3d.scenes.Scene3D; 
  30.     import org.papervision3d.view.Viewport3D; 
  31.     import org.papervision3d.cameras.Camera3D; 
  32.     import org.papervision3d.render.BasicRenderEngine; 
  33.     import org.papervision3d.materials.shadematerials.FlatShadeMaterial
  34.     import org.papervision3d.materials.utils.MaterialsList
  35.     import org.papervision3d.materials.special.CompositeMaterial
  36.     import org.papervision3d.materials.ColorMaterial;
  37.     import org.papervision3d.materials.BitmapMaterial
  38.     import org.papervision3d.materials.*
  39.     import org.papervision3d.lights.PointLight3D;
  40.     import org.papervision3d.objects.DisplayObject3D
  41.     
  42.     import caurina.transitions.*;
  43.     
  44.     import net.hires.debug.Stats;
  45.   
  46.     [SWF(width=480, height=480, backgroundColor=0x000000)] 
  47.     public class Professional extends Sprite 
  48.     { 
  49.         private var tf:TextField=new TextField()
  50.         public var renderer:BasicRenderEngine = new BasicRenderEngine();; 
  51.         public var camera:Camera3D = new Camera3D(); 
  52.         public var viewport:Viewport3D = new Viewport3D(600,600); 
  53.         public var scene:Scene3D = new Scene3D(); 
  54.         public var mat:ColorMaterial = new ColorMaterial(0xFF0000); 
  55.         public var cubeMat:CompositeMaterial
  56.         public var materialsList:MaterialsList = new MaterialsList();
  57.         public var cube:Cube
  58.         public var cylinder:Cylinder
  59.         public var cubeSize:int=200
  60.         
  61.         public var panelMaterial:BitmapMaterial
  62.         
  63.         public var container3d:DisplayObject3D=new DisplayObject3D()
  64.         
  65.     public var window_pattern1:Array=[
  66.                         [0,0,0,0,0,0],
  67.                         [0,1,1,1,1,0],
  68.                         [0,1,2,2,1,0],
  69.                         [0,1,2,2,1,0],
  70.                         [0,1,1,1,1,0],
  71.                         [0,0,0,0,0,0]]
  72.         public var window_pattern2:Array=[
  73.                         [2,2,2,2,2,2],
  74.                         [2,1,1,1,1,2],
  75.                         [2,1,1,1,1,2],
  76.                         [2,1,1,1,1,2],
  77.                         [2,1,1,1,1,2],
  78.                         [2,2,2,2,2,2]]
  79.         public var window_pattern3:Array=[
  80.                         [1,1,1,1,1,1],
  81.                         [1,0,0,0,0,1],
  82.                         [1,0,0,0,0,1],
  83.                         [1,0,0,0,0,1],
  84.                         [1,0,0,0,0,1],
  85.                         [1,0,0,0,0,1]]
  86.         public var window_pattern4:Array=[
  87.                         [1,1,1,1,1,1],
  88.                         [2,1,0,0,0,1],
  89.                         [2,0,1,0,0,1],
  90.                         [2,0,0,1,0,1],
  91.                         [2,0,0,0,1,1],
  92.                         [2,2,2,2,2,1]]
  93.         public var window_pattern5:Array=[
  94.                         [0,0,0,0,0,0],
  95.                         [0,0,0,0,0,0],
  96.                         [0,0,1,1,1,0],
  97.                         [0,0,1,2,1,0],
  98.                         [0,0,1,1,1,0],
  99.                         [0,0,0,0,0,0]]
  100.         public var windows:Array=[window_pattern1,window_pattern2,window_pattern3,window_pattern4,window_pattern4]
  101.                         
  102.     private var col1:uint=0xff000000;
  103.         private var col2:uint=0xff555555;
  104.         private var col3:uint=0xffDDDDDD;
  105.         private var colour_array:Array=[col1,col2,col3]    
  106.         
  107.         private var dir:int=15;
  108.         
  109.         private const maxNumLevels:int=5
  110.         private const maxBaseSize:int=125
  111.         private var buildingLevels:Array=[]
  112.         
  113.         private var buildings:Array=[]
  114.         
  115.         private var grid_width:int=5
  116.         private var grid_height:int=6 
  117.         
  118.         private var cam_horiz:Boolean=false
  119.         private var cam_pos:Point=new Point(Math.floor(grid_width/2),0)
  120.         private var cam_target:Point=new Point(cam_pos.x,Math.floor(grid_height/2))
  121.         
  122.         private var diff:Number
  123.         
  124.         
  125.         public function Professional() 
  126.         { 
  127.             scene.addChild(container3d)
  128.             
  129.             camera.x = 30;
  130.             camera.y = 100
  131.         camera.z = -15*cubeSize;
  132.             
  133.         camera.zoom = 30;
  134.         camera.focus = 60;
  135.             //camera.lookAt(container3d)
  136.             
  137.             addChild(viewport) 
  138.             
  139.             createCityGrid(grid_width,grid_height) //Build the city
  140.             addEventListener(Event.ENTER_FRAME,oef); 
  141.             
  142.             tf.textColor=0xffffff
  143.             addChild(tf)
  144.             
  145.             stage.quality=StageQuality.LOW
  146.             //var s:Stats = new Stats();
  147.             //addChild(s);
  148.         }
  149.         
  150.         public function createCityGrid(rows:int,cols:int):void
  151.         {
  152.             buildings=[]
  153.              for(var i:int=0;i<cols;i++)
  154.                 {
  155.                     for(var j:int=0;j<rows;j++)
  156.                         {
  157.                             
  158.                             var tower:DisplayObject3D=createBuilding()
  159.                             tower.x=j*maxBaseSize*2//+maxBaseSize*4
  160.                             tower.z=i*maxBaseSize*2//+maxBaseSize*4
  161.                             container3d.addChild(tower)
  162.                             buildings.push(tower)
  163.                         }
  164.                 }
  165.             container3d.x-=rows*maxBaseSize
  166.         }
  167.         
  168.        
  169.         //#######Testing logic to randomise buildings - still needs lots of tweaking########
  170.         private function createBuilding():DisplayObject3D
  171.         {
  172.             var container:DisplayObject3D=new DisplayObject3D()
  173.             var levels:int=Math.ceil(Math.random()*maxNumLevels)
  174.             var maxHeight:int=levels*maxBaseSize*(0.5+(Math.random()*0.5))
  175.             var rnd:int
  176.             var w:int=maxBaseSize*0.75 + maxBaseSize*Math.random()*0.25
  177.             var h:int=maxHeight*0.5 + maxHeight*Math.random()*0.5
  178.             maxHeight-=h
  179.             var d:int=maxBaseSize*0.5 + maxBaseSize*Math.random()*0.5
  180.             var ypos:int=0
  181.             var buildingLevels:Array=[]
  182.             
  183.             for(var i:int=0;i<levels;i++)
  184.                 {
  185.                     ypos+=Math.ceil(h*0.5)
  186.                     rnd=Math.floor(Math.random()*10)
  187.                     switch(rnd) //Ropey method of slanting the results towards the cube and restricting the tapered cylinder - need to improve...
  188.                         {
  189.                             case 0://Cube
  190.                             case 1:
  191.                             case 2
  192.                             case 3:
  193.                             case 4:
  194.                             case 5:
  195.                             case 6:
  196.                                 buildingLevels.push(buildCube(w,d,h))
  197.                                 break;
  198.                             case 7://Cylinder
  199.                             case 8:
  200.                                 if(i==0)
  201.                                     {
  202.                                         buildingLevels.push(buildCylinder(w*0.5,h))
  203.                                     }
  204.                                     else
  205.                                     {
  206.                                         w*=0.7//Reduce size of cylinder if not 1st
  207.                                         buildingLevels.push(buildCylinder(w,h))
  208.                                      }
  209.                                 break;
  210.                             case 9://Tapered cylinder
  211.                                 if(i!=0)w*=0.7//Reduce size of cylinder if not 1st
  212.                                 buildingLevels.push(buildCylinder(w,h,true))
  213.                                 w*=0.6
  214.                                 break;
  215.                         }
  216.                    
  217.                     buildingLevels[i].y=ypos
  218.                     ypos+=Math.ceil(h*0.5)
  219.                     w*=0.4+Math.random()*0.4
  220.                     d*=0.4+Math.random()*0.4
  221.                     h=maxHeight*0.2+maxHeight*Math.random()
  222.                     maxHeight-=h
  223.                     
  224.                     container.addChild(buildingLevels[i])
  225.                 }
  226.             return container
  227.         }
  228.         
  229.         private function clearBuilding():void
  230.         {
  231.             var len:int=buildingLevels.length
  232.             for (var i:int=0;i<len;i++)
  233.                 {
  234.                     container3d.removeChild(buildingLevels[i])
  235.                 }
  236.             buildingLevels=[]
  237.         }
  238.         
  239.         private function buildCylinder(r:Number=100,h:Number=1000,tapered:Boolean=false):Cylinder
  240.         {
  241.             var cyl:Cylinder=new Cylinder(createDotTexture(r,h,false),r,h,8,6,tapered?r*0.8:-1,true,false)
  242.             
  243.             return cyl
  244.         }
  245.         
  246.         private function buildCube(w:int=200,h:int=200,d:int=200):Cube
  247.         {
  248.             var cubeMatList:MaterialsList = new MaterialsList( ); 
  249.             var main_mat:BitmapMaterial=createDotTexture(w,h)
  250.             cubeMatList.addMaterial( main_mat, "left" ); 
  251.             cubeMatList.addMaterial( main_mat, "right" ); 
  252.             cubeMatList.addMaterial( main_mat, "front" ); 
  253.             cubeMatList.addMaterial( main_mat, "back" ); 
  254.             cubeMatList.addMaterial( new ColorMaterial(0x333333,1), "top" );
  255.             var cubeObj:Cube = new Cube( cubeMatList, w, h, d, 4440, Cube.BOTTOM); 
  256.             // cubeObj.replaceMaterialByName(new ColorMaterial(0xff0000,1), "top");
  257.             return cubeObj
  258.         }
  259.         
  260.     public function createBitmapMaterialTexture():BitmapMaterial
  261.         {
  262.             var dot_pattern:Array=choosePattern()
  263.              return new BitmapMaterial(BitmapPatternBuilder.build(dot_pattern, colour_array))
  264.         }
  265.     
  266.         private function createDotTexture(w:int=200,h:int=200, useBorder:Boolean=true ,win_w:int=20,win_h:int=40):BitmapMaterial
  267.         {
  268.             var sprite:Sprite=new Sprite()
  269.             var dot_pattern:Array=choosePattern()
  270.             var border_col:uint=0x666666+Math.ceil(Math.random()*9)*0x111111 //Randomise the border colour (greyscale)
  271.             
  272.             sprite.graphics.beginBitmapFill(BitmapPatternBuilder.build(dot_pattern, colour_array));
  273.             if(useBorder)sprite.graphics.lineStyle(5+Math.ceil(Math.random()*5), border_col); //If using a border then have one that is a random width from 5 to 10
  274.             sprite.graphics.drawRect(0,0,w,h)
  275.             sprite.graphics.lineStyle(5, 0xffffff);
  276.             sprite.graphics.endFill()
  277.             
  278.             var bmd_w:int=w>10?w:10
  279.             var bmd_h:int=h>10?h:10
  280.             var bmd:BitmapData = new BitmapData(bmd_w, bmd_h, false, 0x00000000);
  281.             bmd.draw(sprite)
  282.             
  283.             return new BitmapMaterial(bmd)
  284.         }
  285.         
  286.         private function choosePattern():Array
  287.         {
  288.             var rnd:int=Math.floor(Math.random()*windows.length) //Randomly select the pattern to use
  289.             return windows[rnd]
  290.         }
  291.             
  292.         private function createTexture(w:int=200,h:int=200, win_w:int=20,win_h:int=40):BitmapMaterial
  293.         {
  294.             w=w>50?w:50 //Set minimum size for width and height
  295.             h=h>50?h:50
  296.             var sprite:Sprite=new Sprite()
  297.             
  298.             
  299.             sprite.graphics.lineStyle(10, 0xffffff);
  300.             sprite.graphics.drawRect(0,0,w,h)
  301.             sprite.graphics.lineStyle(5, 0xffffff);
  302.             
  303.             var win_gap_w:Number=win_w*0.25
  304.             var win_gap_h:Number=win_h*0.25
  305.             var columns:int=(w-win_w/2)/(win_w+win_gap_w)
  306.             var rows:int=(h-win_h/2)/(win_h+win_gap_h)
  307.             win_gap_w=(w-columns*win_w)/(columns+1)
  308.             win_gap_h=(h-rows*win_h)/(rows+1)
  309.             
  310.             for (var i:int=0;i<columns;i++)
  311.                 {
  312.                     for(var j:int=0;j<rows;j++)
  313.                         {
  314.                             sprite.graphics.drawRect(win_gap_w+i*(win_w+win_gap_w), win_gap_h+j*(win_h+win_gap_h),win_w,win_h)
  315.                         }
  316.                 }
  317.             var bmd:BitmapData = new BitmapData(200200false, 0x00000000);
  318.             bmd.draw(sprite)
  319.             return new BitmapMaterial(bmd)
  320.         }
  321.         
  322.         private function rotateAndRaiseCamera():void
  323.         {
  324.             camera.y+=dir
  325.             if(camera.y>1500 || camera.y<50) dir=-dir //Swing camera up and down
  326.             camera.lookAt(container3d)          
  327.             container3d.rotationY+=1.5
  328.         }
  329.         //###########CODE TO TRAVEL THROUGH CITY STREETS
  330.         private function tweenToNextPoint():void
  331.         {
  332.             
  333.             Tweener.addTween(camera,{x:maxBaseSize*2*cam_target.x, z:maxBaseSize*2*cam_target.y,time:diff*0.75,onComplete:rotateToDirection})
  334.         }
  335.         
  336.         private function rotateToDirection():void
  337.         {
  338.             var to_x:int=cam_pos.x
  339.             var to_y:int=cam_pos.y
  340.    
  341.             
  342.             if(cam_horiz)
  343.                 {
  344.                     to_x=1+Math.floor(grid_width-1)
  345.                     if(to_x==cam_pos.x)
  346.                         {
  347.                            if((grid_width-to_x)>grid_width*0.5){to_x-=1}
  348.                                else{to_x+=1}
  349.                         }
  350.                     diff=Math.abs(cam_pos.x-to_x)
  351.                 }
  352.                 else
  353.                 {
  354.                     to_y=1+Math.floor(grid_height-1)
  355.                     if(to_y==cam_pos.y)
  356.                         {
  357.                            if((grid_height-to_x)>grid_height*0.5){to_y-=1}
  358.                                else{to_y+=1}
  359.                         }
  360.                     diff=Math.abs(cam_pos.y-to_y)
  361.                 }
  362.              cam_target.x=to_x
  363.              cam_target.y=to_y
  364.              
  365.              Tweener.addTween(camera,{rotationY:angleToPoint(cam_pos,cam_target)-90,time:0.75,onComplete:tweenToNextPoint})
  366.              
  367.              tf.text="ang:"+angleToPoint(cam_pos,cam_target)
  368.          }
  369.          
  370.          public function angleToPoint(from:Point, to:Point):Number
  371.         {
  372.             var dx:Number = to.x - from.x
  373.             var dy:Number = to.y - from.y
  374.             return Math.atan2(dy,dx) *57.29577951308232   //  180/Math.PI=57.29577951308232
  375.         }
  376.         //##############OEF LOOP
  377.         private function oef(evt:Event):void
  378.     { 
  379.             rotateAndRaiseCamera()
  380.             //rotateToDirection()
  381.  
  382.             renderer.renderScene(scene,camera,viewport); 
  383.         } 
  384.     } 
  385. /**-----------------------------------------------------
  386.  * Use following BitmapPatternBuilder class 
  387.  * 
  388.  * DO NOT CHANGE any codes below this comment.
  389.  *
  390.  * -----------------------------------------------------
  391. */
  392. import flash.display.Bitmap;
  393. import flash.display.BitmapData;
  394. import flash.display.Graphics;
  395.     
  396. class BitmapPatternBuilder{
  397.     /**
  398.      * creates BitmapData filled with dot pattern.
  399.      * First parameter is 2d array that contains color index for each pixels;
  400.      * Second parameter contains color reference table.
  401.      *
  402.      * @parameter pattern:Array 2d array that contains color index for each pixel.
  403.      * @parameter colors:Array 1d array that contains color table.
  404.      * @returns BitmapData
  405.      */
  406.     public static function build(pattern:Array, colors:Array):BitmapData{
  407.         var bitmapW:int = pattern[0].length;
  408.         var bitmapH:int = pattern.length;
  409.         var bmd:BitmapData = new BitmapData(bitmapW,bitmapH,true,0x000000);
  410.         for(var yy:int=0; yy<bitmapH; yy++){
  411.             for(var xx:int=0; xx<bitmapW; xx++){
  412.                 var color:int = colors[pattern[yy][xx]];
  413.                 bmd.setPixel32(xx, yy, color);
  414.             }
  415.         }
  416.         return bmd;
  417.     }
  418.     
  419.     /**
  420.      * short cut function for Graphics.beginBitmapFill with pattern.
  421.      */
  422.     public static function beginBitmapFill(pattern:Array, colors:Array, graphics:Graphics):void{
  423.         var bmd:BitmapData = build(pattern, colors);
  424.         graphics.beginBitmapFill(bmd);
  425.         bmd.dispose();        
  426.     }
  427. }
noswf
  1. // forked from swingpants's Cityscape with dot pattern windows
  2. // forked from checkmate's fladdict challenge for professionals
  3. /**
  4.  * Theme:
  5.  * Play with BitmapPatterBuilder.
  6.  * Purpose of this trial is to find the possibility of the dot pattern.
  7.  *
  8.  * by Takayuki Fukatsu aka fladdict
  9.  **/
  10.   /**
  11.  * Cityscape Maker v0.1
  12.  * 3D Cityscape, with dot pattern windows and 3D fly - To do: Camera flybys.
  13.  *
  14.  * by Swingpants
  15.  **/
  16. package 
  17.     import flash.display.Sprite; 
  18.     import flash.display.MovieClip;
  19.     import flash.display.BitmapData 
  20.     import flash.events.Event; 
  21.     import flash.display.Graphics;
  22.     import flash.display.StageQuality 
  23.     import flash.text.*; 
  24.     import flash.geom.Point;
  25.     import org.papervision3d.materials.ColorMaterial; 
  26.     import org.papervision3d.objects.primitives.Plane; 
  27.     import org.papervision3d.objects.primitives.Cube; 
  28.     import org.papervision3d.objects.primitives.Cylinder; 
  29.     import org.papervision3d.scenes.Scene3D; 
  30.     import org.papervision3d.view.Viewport3D; 
  31.     import org.papervision3d.cameras.Camera3D; 
  32.     import org.papervision3d.render.BasicRenderEngine; 
  33.     import org.papervision3d.materials.shadematerials.FlatShadeMaterial
  34.     import org.papervision3d.materials.utils.MaterialsList
  35.     import org.papervision3d.materials.special.CompositeMaterial
  36.     import org.papervision3d.materials.ColorMaterial;
  37.     import org.papervision3d.materials.BitmapMaterial
  38.     import org.papervision3d.materials.*
  39.     import org.papervision3d.lights.PointLight3D;
  40.     import org.papervision3d.objects.DisplayObject3D
  41.     
  42.     import caurina.transitions.*;
  43.     
  44.     import net.hires.debug.Stats;
  45.   
  46.     [SWF(width=480, height=480, backgroundColor=0x000000)] 
  47.     public class Professional extends Sprite 
  48.     { 
  49.         private var tf:TextField=new TextField()
  50.         public var renderer:BasicRenderEngine = new BasicRenderEngine();; 
  51.         public var camera:Camera3D = new Camera3D(); 
  52.         public var viewport:Viewport3D = new Viewport3D(600,600); 
  53.         public var scene:Scene3D = new Scene3D(); 
  54.         public var mat:ColorMaterial = new ColorMaterial(0xFF0000); 
  55.         public var cubeMat:CompositeMaterial
  56.         public var materialsList:MaterialsList = new MaterialsList();
  57.         public var cube:Cube
  58.         public var cylinder:Cylinder
  59.         public var cubeSize:int=200
  60.         
  61.         public var panelMaterial:BitmapMaterial
  62.         
  63.         public var container3d:DisplayObject3D=new DisplayObject3D()
  64.         
  65.     public var window_pattern1:Array=[
  66.                         [0,0,0,0,0,0],
  67.                         [0,1,1,1,1,0],
  68.                         [0,1,2,2,1,0],
  69.                         [0,1,2,2,1,0],
  70.                         [0,1,1,1,1,0],
  71.                         [0,0,0,0,0,0]]
  72.         public var window_pattern2:Array=[
  73.                         [2,2,2,2,2,2],
  74.                         [2,1,1,1,1,2],
  75.                         [2,1,1,1,1,2],
  76.                         [2,1,1,1,1,2],
  77.                         [2,1,1,1,1,2],
  78.                         [2,2,2,2,2,2]]
  79.         public var window_pattern3:Array=[
  80.                         [1,1,1,1,1,1],
  81.                         [1,0,0,0,0,1],
  82.                         [1,0,0,0,0,1],
  83.                         [1,0,0,0,0,1],
  84.                         [1,0,0,0,0,1],
  85.                         [1,0,0,0,0,1]]
  86.         public var window_pattern4:Array=[
  87.                         [1,1,1,1,1,1],
  88.                         [2,1,0,0,0,1],
  89.                         [2,0,1,0,0,1],
  90.                         [2,0,0,1,0,1],
  91.                         [2,0,0,0,1,1],
  92.                         [2,2,2,2,2,1]]
  93.         public var window_pattern5:Array=[
  94.                         [0,0,0,0,0,0],
  95.                         [0,0,0,0,0,0],
  96.                         [0,0,1,1,1,0],
  97.                         [0,0,1,2,1,0],
  98.                         [0,0,1,1,1,0],
  99.                         [0,0,0,0,0,0]]
  100.         public var windows:Array=[window_pattern1,window_pattern2,window_pattern3,window_pattern4,window_pattern4]
  101.                         
  102.     private var col1:uint=0xff000000;
  103.         private var col2:uint=0xff555555;
  104.         private var col3:uint=0xffDDDDDD;
  105.         private var colour_array:Array=[col1,col2,col3]    
  106.         
  107.         private var dir:int=15;
  108.         
  109.         private const maxNumLevels:int=5
  110.         private const maxBaseSize:int=125
  111.         private var buildingLevels:Array=[]
  112.         
  113.         private var buildings:Array=[]
  114.         
  115.         private var grid_width:int=5
  116.         private var grid_height:int=6 
  117.         
  118.         private var cam_horiz:Boolean=false
  119.         private var cam_pos:Point=new Point(Math.floor(grid_width/2),0)
  120.         private var cam_target:Point=new Point(cam_pos.x,Math.floor(grid_height/2))
  121.         
  122.         private var diff:Number
  123.         
  124.         
  125.         public function Professional() 
  126.         { 
  127.             scene.addChild(container3d)
  128.             
  129.             camera.x = 30;
  130.             camera.y = 100
  131.         camera.z = -15*cubeSize;
  132.             
  133.         camera.zoom = 30;
  134.         camera.focus = 60;
  135.             //camera.lookAt(container3d)
  136.             
  137.             addChild(viewport) 
  138.             
  139.             createCityGrid(grid_width,grid_height) //Build the city
  140.             addEventListener(Event.ENTER_FRAME,oef); 
  141.             
  142.             tf.textColor=0xffffff
  143.             addChild(tf)
  144.             
  145.             stage.quality=StageQuality.LOW
  146.             //var s:Stats = new Stats();
  147.             //addChild(s);
  148.         }
  149.         
  150.         public function createCityGrid(rows:int,cols:int):void
  151.         {
  152.             buildings=[]
  153.              for(var i:int=0;i<cols;i++)
  154.                 {
  155.                     for(var j:int=0;j<rows;j++)
  156.                         {
  157.                             
  158.                             var tower:DisplayObject3D=createBuilding()
  159.                             tower.x=j*maxBaseSize*2//+maxBaseSize*4
  160.                             tower.z=i*maxBaseSize*2//+maxBaseSize*4
  161.                             container3d.addChild(tower)
  162.                             buildings.push(tower)
  163.                         }
  164.                 }
  165.             container3d.x-=rows*maxBaseSize
  166.         }
  167.         
  168.        
  169.         //#######Testing logic to randomise buildings - still needs lots of tweaking########
  170.         private function createBuilding():DisplayObject3D
  171.         {
  172.             var container:DisplayObject3D=new DisplayObject3D()
  173.             var levels:int=Math.ceil(Math.random()*maxNumLevels)
  174.             var maxHeight:int=levels*maxBaseSize*(0.5+(Math.random()*0.5))
  175.             var rnd:int
  176.             var w:int=maxBaseSize*0.75 + maxBaseSize*Math.random()*0.25
  177.             var h:int=maxHeight*0.5 + maxHeight*Math.random()*0.5
  178.             maxHeight-=h
  179.             var d:int=maxBaseSize*0.5 + maxBaseSize*Math.random()*0.5
  180.             var ypos:int=0
  181.             var buildingLevels:Array=[]
  182.             
  183.             for(var i:int=0;i<levels;i++)
  184.                 {
  185.                     ypos+=Math.ceil(h*0.5)
  186.                     rnd=Math.floor(Math.random()*10)
  187.                     switch(rnd) //Ropey method of slanting the results towards the cube and restricting the tapered cylinder - need to improve...
  188.                         {
  189.                             case 0://Cube
  190.                             case 1:
  191.                             case 2
  192.                             case 3:
  193.                             case 4:
  194.                             case 5:
  195.                             case 6:
  196.                                 buildingLevels.push(buildCube(w,d,h))
  197.                                 break;
  198.                             case 7://Cylinder
  199.                             case 8:
  200.                                 if(i==0)
  201.                                     {
  202.                                         buildingLevels.push(buildCylinder(w*0.5,h))
  203.                                     }
  204.                                     else
  205.                                     {
  206.                                         w*=0.7//Reduce size of cylinder if not 1st
  207.                                         buildingLevels.push(buildCylinder(w,h))
  208.                                      }
  209.                                 break;
  210.                             case 9://Tapered cylinder
  211.                                 if(i!=0)w*=0.7//Reduce size of cylinder if not 1st
  212.                                 buildingLevels.push(buildCylinder(w,h,true))
  213.                                 w*=0.6
  214.                                 break;
  215.                         }
  216.                    
  217.                     buildingLevels[i].y=ypos
  218.                     ypos+=Math.ceil(h*0.5)
  219.                     w*=0.4+Math.random()*0.4
  220.                     d*=0.4+Math.random()*0.4
  221.                     h=maxHeight*0.2+maxHeight*Math.random()
  222.                     maxHeight-=h
  223.                     
  224.                     container.addChild(buildingLevels[i])
  225.                 }
  226.             return container
  227.         }
  228.         
  229.         private function clearBuilding():void
  230.         {
  231.             var len:int=buildingLevels.length
  232.             for (var i:int=0;i<len;i++)
  233.                 {
  234.                     container3d.removeChild(buildingLevels[i])
  235.                 }
  236.             buildingLevels=[]
  237.         }
  238.         
  239.         private function buildCylinder(r:Number=100,h:Number=1000,tapered:Boolean=false):Cylinder
  240.         {
  241.             var cyl:Cylinder=new Cylinder(createDotTexture(r,h,false),r,h,8,6,tapered?r*0.8:-1,true,false)
  242.             
  243.             return cyl
  244.         }
  245.         
  246.         private function buildCube(w:int=200,h:int=200,d:int=200):Cube
  247.         {
  248.             var cubeMatList:MaterialsList = new MaterialsList( ); 
  249.             var main_mat:BitmapMaterial=createDotTexture(w,h)
  250.             cubeMatList.addMaterial( main_mat, "left" ); 
  251.             cubeMatList.addMaterial( main_mat, "right" ); 
  252.             cubeMatList.addMaterial( main_mat, "front" ); 
  253.             cubeMatList.addMaterial( main_mat, "back" ); 
  254.             cubeMatList.addMaterial( new ColorMaterial(0x333333,1), "top" );
  255.             var cubeObj:Cube = new Cube( cubeMatList, w, h, d, 4440, Cube.BOTTOM); 
  256.             // cubeObj.replaceMaterialByName(new ColorMaterial(0xff0000,1), "top");
  257.             return cubeObj
  258.         }
  259.         
  260.     public function createBitmapMaterialTexture():BitmapMaterial
  261.         {
  262.             var dot_pattern:Array=choosePattern()
  263.              return new BitmapMaterial(BitmapPatternBuilder.build(dot_pattern, colour_array))
  264.         }
  265.     
  266.         private function createDotTexture(w:int=200,h:int=200, useBorder:Boolean=true ,win_w:int=20,win_h:int=40):BitmapMaterial
  267.         {
  268.             var sprite:Sprite=new Sprite()
  269.             var dot_pattern:Array=choosePattern()
  270.             var border_col:uint=0x666666+Math.ceil(Math.random()*9)*0x111111 //Randomise the border colour (greyscale)
  271.             
  272.             sprite.graphics.beginBitmapFill(BitmapPatternBuilder.build(dot_pattern, colour_array));
  273.             if(useBorder)sprite.graphics.lineStyle(5+Math.ceil(Math.random()*5), border_col); //If using a border then have one that is a random width from 5 to 10
  274.             sprite.graphics.drawRect(0,0,w,h)
  275.             sprite.graphics.lineStyle(5, 0xffffff);
  276.             sprite.graphics.endFill()
  277.             
  278.             var bmd_w:int=w>10?w:10
  279.             var bmd_h:int=h>10?h:10
  280.             var bmd:BitmapData = new BitmapData(bmd_w, bmd_h, false, 0x00000000);
  281.             bmd.draw(sprite)
  282.             
  283.             return new BitmapMaterial(bmd)
  284.         }
  285.         
  286.         private function choosePattern():Array
  287.         {
  288.             var rnd:int=Math.floor(Math.random()*windows.length) //Randomly select the pattern to use
  289.             return windows[rnd]
  290.         }
  291.             
  292.         private function createTexture(w:int=200,h:int=200, win_w:int=20,win_h:int=40):BitmapMaterial
  293.         {
  294.             w=w>50?w:50 //Set minimum size for width and height
  295.             h=h>50?h:50
  296.             var sprite:Sprite=new Sprite()
  297.             
  298.             
  299.             sprite.graphics.lineStyle(10, 0xffffff);
  300.             sprite.graphics.drawRect(0,0,w,h)
  301.             sprite.graphics.lineStyle(5, 0xffffff);
  302.             
  303.             var win_gap_w:Number=win_w*0.25
  304.             var win_gap_h:Number=win_h*0.25
  305.             var columns:int=(w-win_w/2)/(win_w+win_gap_w)
  306.             var rows:int=(h-win_h/2)/(win_h+win_gap_h)
  307.             win_gap_w=(w-columns*win_w)/(columns+1)
  308.             win_gap_h=(h-rows*win_h)/(rows+1)
  309.             
  310.             for (var i:int=0;i<columns;i++)
  311.                 {
  312.                     for(var j:int=0;j<rows;j++)
  313.                         {
  314.                             sprite.graphics.drawRect(win_gap_w+i*(win_w+win_gap_w), win_gap_h+j*(win_h+win_gap_h),win_w,win_h)
  315.                         }
  316.                 }
  317.             var bmd:BitmapData = new BitmapData(200200false, 0x00000000);
  318.             bmd.draw(sprite)
  319.             return new BitmapMaterial(bmd)
  320.         }
  321.         
  322.         private function rotateAndRaiseCamera():void
  323.         {
  324.             camera.y+=dir
  325.             if(camera.y>1500 || camera.y<50) dir=-dir //Swing camera up and down
  326.             camera.lookAt(container3d)          
  327.             container3d.rotationY+=1.5
  328.         }
  329.         //###########CODE TO TRAVEL THROUGH CITY STREETS
  330.         private function tweenToNextPoint():void
  331.         {
  332.             
  333.             Tweener.addTween(camera,{x:maxBaseSize*2*cam_target.x, z:maxBaseSize*2*cam_target.y,time:diff*0.75,onComplete:rotateToDirection})
  334.         }
  335.         
  336.         private function rotateToDirection():void
  337.         {
  338.             var to_x:int=cam_pos.x
  339.             var to_y:int=cam_pos.y
  340.    
  341.             
  342.             if(cam_horiz)
  343.                 {
  344.                     to_x=1+Math.floor(grid_width-1)
  345.                     if(to_x==cam_pos.x)
  346.                         {
  347.                            if((grid_width-to_x)>grid_width*0.5){to_x-=1}
  348.                                else{to_x+=1}
  349.                         }
  350.                     diff=Math.abs(cam_pos.x-to_x)
  351.                 }
  352.                 else
  353.                 {
  354.                     to_y=1+Math.floor(grid_height-1)
  355.                     if(to_y==cam_pos.y)
  356.                         {
  357.                            if((grid_height-to_x)>grid_height*0.5){to_y-=1}
  358.                                else{to_y+=1}
  359.                         }
  360.                     diff=Math.abs(cam_pos.y-to_y)
  361.                 }
  362.              cam_target.x=to_x
  363.              cam_target.y=to_y
  364.              
  365.              Tweener.addTween(camera,{rotationY:angleToPoint(cam_pos,cam_target)-90,time:0.75,onComplete:tweenToNextPoint})
  366.              
  367.              tf.text="ang:"+angleToPoint(cam_pos,cam_target)
  368.          }
  369.          
  370.          public function angleToPoint(from:Point, to:Point):Number
  371.         {
  372.             var dx:Number = to.x - from.x
  373.             var dy:Number = to.y - from.y
  374.             return Math.atan2(dy,dx) *57.29577951308232   //  180/Math.PI=57.29577951308232
  375.         }
  376.         //##############OEF LOOP
  377.         private function oef(evt:Event):void
  378.     { 
  379.             rotateAndRaiseCamera()
  380.             //rotateToDirection()
  381.  
  382.             renderer.renderScene(scene,camera,viewport); 
  383.         } 
  384.     } 
  385. /**-----------------------------------------------------
  386.  * Use following BitmapPatternBuilder class 
  387.  * 
  388.  * DO NOT CHANGE any codes below this comment.
  389.  *
  390.  * -----------------------------------------------------
  391. */
  392. import flash.display.Bitmap;
  393. import flash.display.BitmapData;
  394. import flash.display.Graphics;
  395.     
  396. class BitmapPatternBuilder{
  397.     /**
  398.      * creates BitmapData filled with dot pattern.
  399.      * First parameter is 2d array that contains color index for each pixels;
  400.      * Second parameter contains color reference table.
  401.      *
  402.      * @parameter pattern:Array 2d array that contains color index for each pixel.
  403.      * @parameter colors:Array 1d array that contains color table.
  404.      * @returns BitmapData
  405.      */
  406.     public static function build(pattern:Array, colors:Array):BitmapData{
  407.         var bitmapW:int = pattern[0].length;
  408.         var bitmapH:int = pattern.length;
  409.         var bmd:BitmapData = new BitmapData(bitmapW,bitmapH,true,0x000000);
  410.         for(var yy:int=0; yy<bitmapH; yy++){
  411.             for(var xx:int=0; xx<bitmapW; xx++){
  412.                 var color:int = colors[pattern[yy][xx]];
  413.                 bmd.setPixel32(xx, yy, color);
  414.             }
  415.         }
  416.         return bmd;
  417.     }
  418.     
  419.     /**
  420.      * short cut function for Graphics.beginBitmapFill with pattern.
  421.      */
  422.     public static function beginBitmapFill(pattern:Array, colors:Array, graphics:Graphics):void{
  423.         var bmd:BitmapData = build(pattern, colors);
  424.         graphics.beginBitmapFill(bmd);
  425.         bmd.dispose();        
  426.     }
  427. }
noswf
  1. // forked from swingpants's Cityscape with dot pattern windows
  2. // forked from checkmate's fladdict challenge for professionals
  3. /**
  4.  * Theme:
  5.  * Play with BitmapPatterBuilder.
  6.  * Purpose of this trial is to find the possibility of the dot pattern.
  7.  *
  8.  * by Takayuki Fukatsu aka fladdict
  9.  **/
  10.   /**
  11.  * Cityscape Maker v0.1
  12.  * 3D Cityscape, with dot pattern windows and 3D fly - To do: Camera flybys.
  13.  *
  14.  * by Swingpants
  15.  **/
  16. package 
  17.     import flash.display.Sprite; 
  18.     import flash.display.MovieClip;
  19.     import flash.display.BitmapData 
  20.     import flash.events.Event; 
  21.     import flash.display.Graphics;
  22.     import flash.display.StageQuality 
  23.     import flash.text.*; 
  24.     import flash.geom.Point;
  25.     import org.papervision3d.materials.ColorMaterial; 
  26.     import org.papervision3d.objects.primitives.Plane; 
  27.     import org.papervision3d.objects.primitives.Cube; 
  28.     import org.papervision3d.objects.primitives.Cylinder; 
  29.     import org.papervision3d.scenes.Scene3D; 
  30.     import org.papervision3d.view.Viewport3D; 
  31.     import org.papervision3d.cameras.Camera3D; 
  32.     import org.papervision3d.render.BasicRenderEngine; 
  33.     import org.papervision3d.materials.shadematerials.FlatShadeMaterial
  34.     import org.papervision3d.materials.utils.MaterialsList
  35.     import org.papervision3d.materials.special.CompositeMaterial
  36.     import org.papervision3d.materials.ColorMaterial;
  37.     import org.papervision3d.materials.BitmapMaterial
  38.     import org.papervision3d.materials.*
  39.     import org.papervision3d.lights.PointLight3D;
  40.     import org.papervision3d.objects.DisplayObject3D
  41.     
  42.     import caurina.transitions.*;
  43.     
  44.     import net.hires.debug.Stats;
  45.   
  46.     [SWF(width=480, height=480, backgroundColor=0x000000)] 
  47.     public class Professional extends Sprite 
  48.     { 
  49.         private var tf:TextField=new TextField()
  50.         public var renderer:BasicRenderEngine = new BasicRenderEngine();; 
  51.         public var camera:Camera3D = new Camera3D(); 
  52.         public var viewport:Viewport3D = new Viewport3D(600,600); 
  53.         public var scene:Scene3D = new Scene3D(); 
  54.         public var mat:ColorMaterial = new ColorMaterial(0xFF0000); 
  55.         public var cubeMat:CompositeMaterial
  56.         public var materialsList:MaterialsList = new MaterialsList();
  57.         public var cube:Cube
  58.         public var cylinder:Cylinder
  59.         public var cubeSize:int=200
  60.         
  61.         public var panelMaterial:BitmapMaterial
  62.         
  63.         public var container3d:DisplayObject3D=new DisplayObject3D()
  64.         
  65.     public var window_pattern1:Array=[
  66.                         [0,0,0,0,0,0],
  67.                         [0,1,1,1,1,0],
  68.                         [0,1,2,2,1,0],
  69.                         [0,1,2,2,1,0],
  70.                         [0,1,1,1,1,0],
  71.                         [0,0,0,0,0,0]]
  72.         public var window_pattern2:Array=[
  73.                         [2,2,2,2,2,2],
  74.                         [2,1,1,1,1,2],
  75.                         [2,1,1,1,1,2],
  76.                         [2,1,1,1,1,2],
  77.                         [2,1,1,1,1,2],
  78.                         [2,2,2,2,2,2]]
  79.         public var window_pattern3:Array=[
  80.                         [1,1,1,1,1,1],
  81.                         [1,0,0,0,0,1],
  82.                         [1,0,0,0,0,1],
  83.                         [1,0,0,0,0,1],
  84.                         [1,0,0,0,0,1],
  85.                         [1,0,0,0,0,1]]
  86.         public var window_pattern4:Array=[
  87.                         [1,1,1,1,1,1],
  88.                         [2,1,0,0,0,1],
  89.                         [2,0,1,0,0,1],
  90.                         [2,0,0,1,0,1],
  91.                         [2,0,0,0,1,1],
  92.                         [2,2,2,2,2,1]]
  93.         public var window_pattern5:Array=[
  94.                         [0,0,0,0,0,0],
  95.                         [0,0,0,0,0,0],
  96.                         [0,0,1,1,1,0],
  97.                         [0,0,1,2,1,0],
  98.                         [0,0,1,1,1,0],
  99.                         [0,0,0,0,0,0]]
  100.         public var windows:Array=[window_pattern1,window_pattern2,window_pattern3,window_pattern4,window_pattern4]
  101.                         
  102.     private var col1:uint=0xff000000;
  103.         private var col2:uint=0xff555555;
  104.         private var col3:uint=0xffDDDDDD;
  105.         private var colour_array:Array=[col1,col2,col3]    
  106.         
  107.         private var dir:int=15;
  108.         
  109.         private const maxNumLevels:int=5
  110.         private const maxBaseSize:int=125
  111.         private var buildingLevels:Array=[]
  112.         
  113.         private var buildings:Array=[]
  114.         
  115.         private var grid_width:int=5
  116.         private var grid_height:int=6 
  117.         
  118.         private var cam_horiz:Boolean=false
  119.         private var cam_pos:Point=new Point(Math.floor(grid_width/2),0)
  120.         private var cam_target:Point=new Point(cam_pos.x,Math.floor(grid_height/2))
  121.         
  122.         private var diff:Number
  123.         
  124.         
  125.         public function Professional() 
  126.         { 
  127.             scene.addChild(container3d)
  128.             
  129.             camera.x = 30;
  130.             camera.y = 100
  131.         camera.z = -15*cubeSize;
  132.             
  133.         camera.zoom = 30;
  134.         camera.focus = 60;
  135.             //camera.lookAt(container3d)
  136.             
  137.             addChild(viewport) 
  138.             
  139.             createCityGrid(grid_width,grid_height) //Build the city
  140.             addEventListener(Event.ENTER_FRAME,oef); 
  141.             
  142.             tf.textColor=0xffffff
  143.             addChild(tf)
  144.             
  145.             stage.quality=StageQuality.LOW
  146.             //var s:Stats = new Stats();
  147.             //addChild(s);
  148.         }
  149.         
  150.         public function createCityGrid(rows:int,cols:int):void
  151.         {
  152.             buildings=[]
  153.              for(var i:int=0;i<cols;i++)
  154.                 {
  155.                     for(var j:int=0;j<rows;j++)
  156.                         {
  157.                             
  158.                             var tower:DisplayObject3D=createBuilding()
  159.                             tower.x=j*maxBaseSize*2//+maxBaseSize*4
  160.                             tower.z=i*maxBaseSize*2//+maxBaseSize*4
  161.                             container3d.addChild(tower)
  162.                             buildings.push(tower)
  163.                         }
  164.                 }
  165.             container3d.x-=rows*maxBaseSize
  166.         }
  167.         
  168.        
  169.         //#######Testing logic to randomise buildings - still needs lots of tweaking########
  170.         private function createBuilding():DisplayObject3D
  171.         {
  172.             var container:DisplayObject3D=new DisplayObject3D()
  173.             var levels:int=Math.ceil(Math.random()*maxNumLevels)
  174.             var maxHeight:int=levels*maxBaseSize*(0.5+(Math.random()*0.5))
  175.             var rnd:int
  176.             var w:int=maxBaseSize*0.75 + maxBaseSize*Math.random()*0.25
  177.             var h:int=maxHeight*0.5 + maxHeight*Math.random()*0.5
  178.             maxHeight-=h
  179.             var d:int=maxBaseSize*0.5 + maxBaseSize*Math.random()*0.5
  180.             var ypos:int=0
  181.             var buildingLevels:Array=[]
  182.             
  183.             for(var i:int=0;i<levels;i++)
  184.                 {
  185.                     ypos+=Math.ceil(h*0.5)
  186.                     rnd=Math.floor(Math.random()*10)
  187.                     switch(rnd) //Ropey method of slanting the results towards the cube and restricting the tapered cylinder - need to improve...
  188.                         {
  189.                             case 0://Cube
  190.                             case 1:
  191.                             case 2
  192.                             case 3:
  193.                             case 4:
  194.                             case 5:
  195.                             case 6:
  196.                                 buildingLevels.push(buildCube(w,d,h))
  197.                                 break;
  198.                             case 7://Cylinder
  199.                             case 8:
  200.                                 if(i==0)
  201.                                     {
  202.                                         buildingLevels.push(buildCylinder(w*0.5,h))
  203.                                     }
  204.                                     else
  205.                                     {
  206.                                         w*=0.7//Reduce size of cylinder if not 1st
  207.                                         buildingLevels.push(buildCylinder(w,h))
  208.                                      }
  209.                                 break;
  210.                             case 9://Tapered cylinder
  211.                                 if(i!=0)w*=0.7//Reduce size of cylinder if not 1st
  212.                                 buildingLevels.push(buildCylinder(w,h,true))
  213.                                 w*=0.6
  214.                                 break;
  215.                         }
  216.                    
  217.                     buildingLevels[i].y=ypos
  218.                     ypos+=Math.ceil(h*0.5)
  219.                     w*=0.4+Math.random()*0.4
  220.                     d*=0.4+Math.random()*0.4
  221.                     h=maxHeight*0.2+maxHeight*Math.random()
  222.                     maxHeight-=h
  223.                     
  224.                     container.addChild(buildingLevels[i])
  225.                 }
  226.             return container
  227.         }
  228.         
  229.         private function clearBuilding():void
  230.         {
  231.             var len:int=buildingLevels.length
  232.             for (var i:int=0;i<len;i++)
  233.                 {
  234.                     container3d.removeChild(buildingLevels[i])
  235.                 }
  236.             buildingLevels=[]
  237.         }
  238.         
  239.         private function buildCylinder(r:Number=100,h:Number=1000,tapered:Boolean=false):Cylinder
  240.         {
  241.             var cyl:Cylinder=new Cylinder(createDotTexture(r,h,false),r,h,8,6,tapered?r*0.8:-1,true,false)
  242.             
  243.             return cyl
  244.         }
  245.         
  246.         private function buildCube(w:int=200,h:int=200,d:int=200):Cube
  247.         {
  248.             var cubeMatList:MaterialsList = new MaterialsList( ); 
  249.             var main_mat:BitmapMaterial=createDotTexture(w,h)
  250.             cubeMatList.addMaterial( main_mat, "left" ); 
  251.             cubeMatList.addMaterial( main_mat, "right" ); 
  252.             cubeMatList.addMaterial( main_mat, "front" ); 
  253.             cubeMatList.addMaterial( main_mat, "back" ); 
  254.             cubeMatList.addMaterial( new ColorMaterial(0x333333,1), "top" );
  255.             var cubeObj:Cube = new Cube( cubeMatList, w, h, d, 4440, Cube.BOTTOM); 
  256.             // cubeObj.replaceMaterialByName(new ColorMaterial(0xff0000,1), "top");
  257.             return cubeObj
  258.         }
  259.         
  260.     public function createBitmapMaterialTexture():BitmapMaterial
  261.         {
  262.             var dot_pattern:Array=choosePattern()
  263.              return new BitmapMaterial(BitmapPatternBuilder.build(dot_pattern, colour_array))
  264.         }
  265.     
  266.         private function createDotTexture(w:int=200,h:int=200, useBorder:Boolean=true ,win_w:int=20,win_h:int=40):BitmapMaterial
  267.         {
  268.             var sprite:Sprite=new Sprite()
  269.             var dot_pattern:Array=choosePattern()
  270.             var border_col:uint=0x666666+Math.ceil(Math.random()*9)*0x111111 //Randomise the border colour (greyscale)
  271.             
  272.             sprite.graphics.beginBitmapFill(BitmapPatternBuilder.build(dot_pattern, colour_array));
  273.             if(useBorder)sprite.graphics.lineStyle(5+Math.ceil(Math.random()*5), border_col); //If using a border then have one that is a random width from 5 to 10
  274.             sprite.graphics.drawRect(0,0,w,h)
  275.             sprite.graphics.lineStyle(5, 0xffffff);
  276.             sprite.graphics.endFill()
  277.             
  278.             var bmd_w:int=w>10?w:10
  279.             var bmd_h:int=h>10?h:10
  280.             var bmd:BitmapData = new BitmapData(bmd_w, bmd_h, false, 0x00000000);
  281.             bmd.draw(sprite)
  282.             
  283.             return new BitmapMaterial(bmd)
  284.         }
  285.         
  286.         private function choosePattern():Array
  287.         {
  288.             var rnd:int=Math.floor(Math.random()*windows.length) //Randomly select the pattern to use
  289.             return windows[rnd]
  290.         }
  291.             
  292.         private function createTexture(w:int=200,h:int=200, win_w:int=20,win_h:int=40):BitmapMaterial
  293.         {
  294.             w=w>50?w:50 //Set minimum size for width and height
  295.             h=h>50?h:50
  296.             var sprite:Sprite=new Sprite()
  297.             
  298.             
  299.             sprite.graphics.lineStyle(10, 0xffffff);
  300.             sprite.graphics.drawRect(0,0,w,h)
  301.             sprite.graphics.lineStyle(5, 0xffffff);
  302.             
  303.             var win_gap_w:Number=win_w*0.25
  304.             var win_gap_h:Number=win_h*0.25
  305.             var columns:int=(w-win_w/2)/(win_w+win_gap_w)
  306.             var rows:int=(h-win_h/2)/(win_h+win_gap_h)
  307.             win_gap_w=(w-columns*win_w)/(columns+1)
  308.             win_gap_h=(h-rows*win_h)/(rows+1)
  309.             
  310.             for (var i:int=0;i<columns;i++)
  311.                 {
  312.                     for(var j:int=0;j<rows;j++)
  313.                         {
  314.                             sprite.graphics.drawRect(win_gap_w+i*(win_w+win_gap_w), win_gap_h+j*(win_h+win_gap_h),win_w,win_h)
  315.                         }
  316.                 }
  317.             var bmd:BitmapData = new BitmapData(200200false, 0x00000000);
  318.             bmd.draw(sprite)
  319.             return new BitmapMaterial(bmd)
  320.         }
  321.         
  322.         private function rotateAndRaiseCamera():void
  323.         {
  324.             camera.y+=dir
  325.             if(camera.y>1500 || camera.y<50) dir=-dir //Swing camera up and down
  326.             camera.lookAt(container3d)          
  327.             container3d.rotationY+=1.5
  328.         }
  329.         //###########CODE TO TRAVEL THROUGH CITY STREETS
  330.         private function tweenToNextPoint():void
  331.         {
  332.             
  333.             Tweener.addTween(camera,{x:maxBaseSize*2*cam_target.x, z:maxBaseSize*2*cam_target.y,time:diff*0.75,onComplete:rotateToDirection})
  334.         }
  335.         
  336.         private function rotateToDirection():void
  337.         {
  338.             var to_x:int=cam_pos.x
  339.             var to_y:int=cam_pos.y
  340.    
  341.             
  342.             if(cam_horiz)
  343.                 {
  344.                     to_x=1+Math.floor(grid_width-1)
  345.                     if(to_x==cam_pos.x)
  346.                         {
  347.                            if((grid_width-to_x)>grid_width*0.5){to_x-=1}
  348.                                else{to_x+=1}
  349.                         }
  350.                     diff=Math.abs(cam_pos.x-to_x)
  351.                 }
  352.                 else
  353.                 {
  354.                     to_y=1+Math.floor(grid_height-1)
  355.                     if(to_y==cam_pos.y)
  356.                         {
  357.                            if((grid_height-to_x)>grid_height*0.5){to_y-=1}
  358.                                else{to_y+=1}
  359.                         }
  360.                     diff=Math.abs(cam_pos.y-to_y)
  361.                 }
  362.              cam_target.x=to_x
  363.              cam_target.y=to_y
  364.              
  365.              Tweener.addTween(camera,{rotationY:angleToPoint(cam_pos,cam_target)-90,time:0.75,onComplete:tweenToNextPoint})
  366.              
  367.              tf.text="ang:"+angleToPoint(cam_pos,cam_target)
  368.          }
  369.          
  370.          public function angleToPoint(from:Point, to:Point):Number
  371.         {
  372.             var dx:Number = to.x - from.x
  373.             var dy:Number = to.y - from.y
  374.             return Math.atan2(dy,dx) *57.29577951308232   //  180/Math.PI=57.29577951308232
  375.         }
  376.         //##############OEF LOOP
  377.         private function oef(evt:Event):void
  378.     { 
  379.             rotateAndRaiseCamera()
  380.             //rotateToDirection()
  381.  
  382.             renderer.renderScene(scene,camera,viewport); 
  383.         } 
  384.     } 
  385. /**-----------------------------------------------------
  386.  * Use following BitmapPatternBuilder class 
  387.  * 
  388.  * DO NOT CHANGE any codes below this comment.
  389.  *
  390.  * -----------------------------------------------------
  391. */
  392. import flash.display.Bitmap;
  393. import flash.display.BitmapData;
  394. import flash.display.Graphics;
  395.     
  396. class BitmapPatternBuilder{
  397.     /**
  398.      * creates BitmapData filled with dot pattern.
  399.      * First parameter is 2d array that contains color index for each pixels;
  400.      * Second parameter contains color reference table.
  401.      *
  402.      * @parameter pattern:Array 2d array that contains color index for each pixel.
  403.      * @parameter colors:Array 1d array that contains color table.
  404.      * @returns BitmapData
  405.      */
  406.     public static function build(pattern:Array, colors:Array):BitmapData{
  407.         var bitmapW:int = pattern[0].length;
  408.         var bitmapH:int = pattern.length;
  409.         var bmd:BitmapData = new BitmapData(bitmapW,bitmapH,true,0x000000);
  410.         for(var yy:int=0; yy<bitmapH; yy++){
  411.             for(var xx:int=0; xx<bitmapW; xx++){
  412.                 var color:int = colors[pattern[yy][xx]];
  413.                 bmd.setPixel32(xx, yy, color);
  414.             }
  415.         }
  416.         return bmd;
  417.     }
  418.     
  419.     /**
  420.      * short cut function for Graphics.beginBitmapFill with pattern.
  421.      */
  422.     public static function beginBitmapFill(pattern:Array, colors:Array, graphics:Graphics):void{
  423.         var bmd:BitmapData = build(pattern, colors);
  424.         graphics.beginBitmapFill(bmd);
  425.         bmd.dispose();        
  426.     }
  427. }
noswf
  1. // forked from swingpants's Cityscape with dot pattern windows
  2. // forked from checkmate's fladdict challenge for professionals
  3. /**
  4.  * Theme:
  5.  * Play with BitmapPatterBuilder.
  6.  * Purpose of this trial is to find the possibility of the dot pattern.
  7.  *
  8.  * by Takayuki Fukatsu aka fladdict
  9.  **/
  10.   /**
  11.  * Cityscape Maker v0.1
  12.  * 3D Cityscape, with dot pattern windows and 3D fly - To do: Camera flybys.
  13.  *
  14.  * by Swingpants
  15.  **/
  16. package 
  17.     import flash.display.Sprite; 
  18.     import flash.display.MovieClip;
  19.     import flash.display.BitmapData 
  20.     import flash.events.Event; 
  21.     import flash.display.Graphics;
  22.     import flash.display.StageQuality 
  23.     import flash.text.*; 
  24.     import flash.geom.Point;
  25.     import org.papervision3d.materials.ColorMaterial; 
  26.     import org.papervision3d.objects.primitives.Plane; 
  27.     import org.papervision3d.objects.primitives.Cube; 
  28.     import org.papervision3d.objects.primitives.Cylinder; 
  29.     import org.papervision3d.scenes.Scene3D; 
  30.     import org.papervision3d.view.Viewport3D; 
  31.     import org.papervision3d.cameras.Camera3D; 
  32.     import org.papervision3d.render.BasicRenderEngine; 
  33.     import org.papervision3d.materials.shadematerials.FlatShadeMaterial
  34.     import org.papervision3d.materials.utils.MaterialsList
  35.     import org.papervision3d.materials.special.CompositeMaterial
  36.     import org.papervision3d.materials.ColorMaterial;
  37.     import org.papervision3d.materials.BitmapMaterial
  38.     import org.papervision3d.materials.*
  39.     import org.papervision3d.lights.PointLight3D;
  40.     import org.papervision3d.objects.DisplayObject3D
  41.     
  42.     import caurina.transitions.*;
  43.     
  44.     import net.hires.debug.Stats;
  45.   
  46.     [SWF(width=480, height=480, backgroundColor=0x000000)] 
  47.     public class Professional extends Sprite 
  48.     { 
  49.         private var tf:TextField=new TextField()
  50.         public var renderer:BasicRenderEngine = new BasicRenderEngine();; 
  51.         public var camera:Camera3D = new Camera3D(); 
  52.         public var viewport:Viewport3D = new Viewport3D(600,600); 
  53.         public var scene:Scene3D = new Scene3D(); 
  54.         public var mat:ColorMaterial = new ColorMaterial(0xFF0000); 
  55.         public var cubeMat:CompositeMaterial
  56.         public var materialsList:MaterialsList = new MaterialsList();
  57.         public var cube:Cube
  58.         public var cylinder:Cylinder
  59.         public var cubeSize:int=200
  60.         
  61.         public var panelMaterial:BitmapMaterial
  62.         
  63.         public var container3d:DisplayObject3D=new DisplayObject3D()
  64.         
  65.     public var window_pattern1:Array=[
  66.                         [0,0,0,0,0,0],
  67.                         [0,1,1,1,1,0],
  68.                         [0,1,2,2,1,0],
  69.                         [0,1,2,2,1,0],
  70.                         [0,1,1,1,1,0],
  71.                         [0,0,0,0,0,0]]
  72.         public var window_pattern2:Array=[
  73.                         [2,2,2,2,2,2],
  74.                         [2,1,1,1,1,2],
  75.                         [2,1,1,1,1,2],
  76.                         [2,1,1,1,1,2],
  77.                         [2,1,1,1,1,2],
  78.                         [2,2,2,2,2,2]]
  79.         public var window_pattern3:Array=[
  80.                         [1,1,1,1,1,1],
  81.                         [1,0,0,0,0,1],
  82.                         [1,0,0,0,0,1],
  83.                         [1,0,0,0,0,1],
  84.                         [1,0,0,0,0,1],
  85.                         [1,0,0,0,0,1]]
  86.         public var window_pattern4:Array=[
  87.                         [1,1,1,1,1,1],
  88.                         [2,1,0,0,0,1],
  89.                         [2,0,1,0,0,1],
  90.                         [2,0,0,1,0,1],
  91.                         [2,0,0,0,1,1],
  92.                         [2,2,2,2,2,1]]
  93.         public var window_pattern5:Array=[
  94.                         [0,0,0,0,0,0],
  95.                         [0,0,0,0,0,0],
  96.                         [0,0,1,1,1,0],
  97.                         [0,0,1,2,1,0],
  98.                         [0,0,1,1,1,0],
  99.                         [0,0,0,0,0,0]]
  100.         public var windows:Array=[window_pattern1,window_pattern2,window_pattern3,window_pattern4,window_pattern4]
  101.                         
  102.     private var col1:uint=0xff000000;
  103.         private var col2:uint=0xff555555;
  104.         private var col3:uint=0xffDDDDDD;
  105.         private var colour_array:Array=[col1,col2,col3]    
  106.         
  107.         private var dir:int=15;
  108.         
  109.         private const maxNumLevels:int=5
  110.         private const maxBaseSize:int=125
  111.         private var buildingLevels:Array=[]
  112.         
  113.         private var buildings:Array=[]
  114.         
  115.         private var grid_width:int=5
  116.         private var grid_height:int=6 
  117.         
  118.         private var cam_horiz:Boolean=false
  119.         private var cam_pos:Point=new Point(Math.floor(grid_width/2),0)
  120.         private var cam_target:Point=new Point(cam_pos.x,Math.floor(grid_height/2))
  121.         
  122.         private var diff:Number
  123.         
  124.         
  125.         public function Professional() 
  126.         { 
  127.             scene.addChild(container3d)
  128.             
  129.             camera.x = 30;
  130.             camera.y = 100
  131.         camera.z = -15*cubeSize;
  132.             
  133.         camera.zoom = 30;
  134.         camera.focus = 60;
  135.             //camera.lookAt(container3d)
  136.             
  137.             addChild(viewport) 
  138.             
  139.             createCityGrid(grid_width,grid_height) //Build the city
  140.             addEventListener(Event.ENTER_FRAME,oef); 
  141.             
  142.             tf.textColor=0xffffff
  143.             addChild(tf)
  144.             
  145.             stage.quality=StageQuality.LOW
  146.             //var s:Stats = new Stats();
  147.             //addChild(s);
  148.         }
  149.         
  150.         public function createCityGrid(rows:int,cols:int):void
  151.         {
  152.             buildings=[]
  153.              for(var i:int=0;i<cols;i++)
  154.                 {
  155.                     for(var j:int=0;j<rows;j++)
  156.                         {
  157.                             
  158.                             var tower:DisplayObject3D=createBuilding()
  159.                             tower.x=j*maxBaseSize*2//+maxBaseSize*4
  160.                             tower.z=i*maxBaseSize*2//+maxBaseSize*4
  161.                             container3d.addChild(tower)
  162.                             buildings.push(tower)
  163.                         }
  164.                 }
  165.             container3d.x-=rows*maxBaseSize
  166.         }
  167.         
  168.        
  169.         //#######Testing logic to randomise buildings - still needs lots of tweaking########
  170.         private function createBuilding():DisplayObject3D
  171.         {
  172.             var container:DisplayObject3D=new DisplayObject3D()
  173.             var levels:int=Math.ceil(Math.random()*maxNumLevels)
  174.             var maxHeight:int=levels*maxBaseSize*(0.5+(Math.random()*0.5))
  175.             var rnd:int
  176.             var w:int=maxBaseSize*0.75 + maxBaseSize*Math.random()*0.25
  177.             var h:int=maxHeight*0.5 + maxHeight*Math.random()*0.5
  178.             maxHeight-=h
  179.             var d:int=maxBaseSize*0.5 + maxBaseSize*Math.random()*0.5
  180.             var ypos:int=0
  181.             var buildingLevels:Array=[]
  182.             
  183.             for(var i:int=0;i<levels;i++)
  184.                 {
  185.                     ypos+=Math.ceil(h*0.5)
  186.                     rnd=Math.floor(Math.random()*10)
  187.                     switch(rnd) //Ropey method of slanting the results towards the cube and restricting the tapered cylinder - need to improve...
  188.                         {
  189.                             case 0://Cube
  190.                             case 1:
  191.                             case 2
  192.                             case 3:
  193.                             case 4:
  194.                             case 5:
  195.                             case 6:
  196.                                 buildingLevels.push(buildCube(w,d,h))
  197.                                 break;
  198.                             case 7://Cylinder
  199.                             case 8:
  200.                                 if(i==0)
  201.                                     {
  202.                                         buildingLevels.push(buildCylinder(w*0.5,h))
  203.                                     }
  204.                                     else
  205.                                     {
  206.                                         w*=0.7//Reduce size of cylinder if not 1st
  207.                                         buildingLevels.push(buildCylinder(w,h))
  208.                                      }
  209.                                 break;
  210.                             case 9://Tapered cylinder
  211.                                 if(i!=0)w*=0.7//Reduce size of cylinder if not 1st
  212.                                 buildingLevels.push(buildCylinder(w,h,true))
  213.                                 w*=0.6
  214.                                 break;
  215.                         }
  216.                    
  217.                     buildingLevels[i].y=ypos
  218.                     ypos+=Math.ceil(h*0.5)
  219.                     w*=0.4+Math.random()*0.4
  220.                     d*=0.4+Math.random()*0.4
  221.                     h=maxHeight*0.2+maxHeight*Math.random()
  222.                     maxHeight-=h
  223.                     
  224.                     container.addChild(buildingLevels[i])
  225.                 }
  226.             return container
  227.         }
  228.         
  229.         private function clearBuilding():void
  230.         {
  231.             var len:int=buildingLevels.length
  232.             for (var i:int=0;i<len;i++)
  233.                 {
  234.                     container3d.removeChild(buildingLevels[i])
  235.                 }
  236.             buildingLevels=[]
  237.         }
  238.         
  239.         private function buildCylinder(r:Number=100,h:Number=1000,tapered:Boolean=false):Cylinder
  240.         {
  241.             var cyl:Cylinder=new Cylinder(createDotTexture(r,h,false),r,h,8,6,tapered?r*0.8:-1,true,false)
  242.             
  243.             return cyl
  244.         }
  245.         
  246.         private function buildCube(w:int=200,h:int=200,d:int=200):Cube
  247.         {
  248.             var cubeMatList:MaterialsList = new MaterialsList( ); 
  249.             var main_mat:BitmapMaterial=createDotTexture(w,h)
  250.             cubeMatList.addMaterial( main_mat, "left" ); 
  251.             cubeMatList.addMaterial( main_mat, "right" ); 
  252.             cubeMatList.addMaterial( main_mat, "front" ); 
  253.             cubeMatList.addMaterial( main_mat, "back" ); 
  254.             cubeMatList.addMaterial( new ColorMaterial(0x333333,1), "top" );
  255.             var cubeObj:Cube = new Cube( cubeMatList, w, h, d, 4440, Cube.BOTTOM); 
  256.             // cubeObj.replaceMaterialByName(new ColorMaterial(0xff0000,1), "top");
  257.             return cubeObj
  258.         }
  259.         
  260.     public function createBitmapMaterialTexture():BitmapMaterial
  261.         {
  262.             var dot_pattern:Array=choosePattern()
  263.              return new BitmapMaterial(BitmapPatternBuilder.build(dot_pattern, colour_array))
  264.         }
  265.     
  266.         private function createDotTexture(w:int=200,h:int=200, useBorder:Boolean=true ,win_w:int=20,win_h:int=40):BitmapMaterial
  267.         {
  268.             var sprite:Sprite=new Sprite()
  269.             var dot_pattern:Array=choosePattern()
  270.             var border_col:uint=0x666666+Math.ceil(Math.random()*9)*0x111111 //Randomise the border colour (greyscale)
  271.             
  272.             sprite.graphics.beginBitmapFill(BitmapPatternBuilder.build(dot_pattern, colour_array));
  273.             if(useBorder)sprite.graphics.lineStyle(5+Math.ceil(Math.random()*5), border_col); //If using a border then have one that is a random width from 5 to 10
  274.             sprite.graphics.drawRect(0,0,w,h)
  275.             sprite.graphics.lineStyle(5, 0xffffff);
  276.             sprite.graphics.endFill()
  277.             
  278.             var bmd_w:int=w>10?w:10
  279.             var bmd_h:int=h>10?h:10
  280.             var bmd:BitmapData = new BitmapData(bmd_w, bmd_h, false, 0x00000000);
  281.             bmd.draw(sprite)
  282.             
  283.             return new BitmapMaterial(bmd)
  284.         }
  285.         
  286.         private function choosePattern():Array
  287.         {
  288.             var rnd:int=Math.floor(Math.random()*windows.length) //Randomly select the pattern to use
  289.             return windows[rnd]
  290.         }
  291.             
  292.         private function createTexture(w:int=200,h:int=200, win_w:int=20,win_h:int=40):BitmapMaterial
  293.         {
  294.             w=w>50?w:50 //Set minimum size for width and height
  295.             h=h>50?h:50
  296.             var sprite:Sprite=new Sprite()
  297.             
  298.             
  299.             sprite.graphics.lineStyle(10, 0xffffff);
  300.             sprite.graphics.drawRect(0,0,w,h)
  301.             sprite.graphics.lineStyle(5, 0xffffff);
  302.             
  303.             var win_gap_w:Number=win_w*0.25
  304.             var win_gap_h:Number=win_h*0.25
  305.             var columns:int=(w-win_w/2)/(win_w+win_gap_w)
  306.             var rows:int=(h-win_h/2)/(win_h+win_gap_h)
  307.             win_gap_w=(w-columns*win_w)/(columns+1)
  308.             win_gap_h=(h-rows*win_h)/(rows+1)
  309.             
  310.             for (var i:int=0;i<columns;i++)
  311.                 {
  312.                     for(var j:int=0;j<rows;j++)
  313.                         {
  314.                             sprite.graphics.drawRect(win_gap_w+i*(win_w+win_gap_w), win_gap_h+j*(win_h+win_gap_h),win_w,win_h)
  315.                         }
  316.                 }
  317.             var bmd:BitmapData = new BitmapData(200200false, 0x00000000);
  318.             bmd.draw(sprite)
  319.             return new BitmapMaterial(bmd)
  320.         }
  321.         
  322.         private function rotateAndRaiseCamera():void
  323.         {
  324.             camera.y+=dir
  325.             if(camera.y>1500 || camera.y<50) dir=-dir //Swing camera up and down
  326.             camera.lookAt(container3d)          
  327.             container3d.rotationY+=1.5
  328.         }
  329.         //###########CODE TO TRAVEL THROUGH CITY STREETS
  330.         private function tweenToNextPoint():void
  331.         {
  332.             
  333.             Tweener.addTween(camera,{x:maxBaseSize*2*cam_target.x, z:maxBaseSize*2*cam_target.y,time:diff*0.75,onComplete:rotateToDirection})
  334.         }
  335.         
  336.         private function rotateToDirection():void
  337.         {
  338.             var to_x:int=cam_pos.x
  339.             var to_y:int=cam_pos.y
  340.    
  341.             
  342.             if(cam_horiz)
  343.                 {
  344.                     to_x=1+Math.floor(grid_width-1)
  345.                     if(to_x==cam_pos.x)
  346.                         {
  347.                            if((grid_width-to_x)>grid_width*0.5){to_x-=1}
  348.                                else{to_x+=1}
  349.                         }
  350.                     diff=Math.abs(cam_pos.x-to_x)
  351.                 }
  352.                 else
  353.                 {
  354.                     to_y=1+Math.floor(grid_height-1)
  355.                     if(to_y==cam_pos.y)
  356.                         {
  357.                            if((grid_height-to_x)>grid_height*0.5){to_y-=1}
  358.                                else{to_y+=1}
  359.                         }
  360.                     diff=Math.abs(cam_pos.y-to_y)
  361.                 }
  362.              cam_target.x=to_x
  363.              cam_target.y=to_y
  364.              
  365.              Tweener.addTween(camera,{rotationY:angleToPoint(cam_pos,cam_target)-90,time:0.75,onComplete:tweenToNextPoint})
  366.              
  367.              tf.text="ang:"+angleToPoint(cam_pos,cam_target)
  368.          }
  369.          
  370.          public function angleToPoint(from:Point, to:Point):Number
  371.         {
  372.             var dx:Number = to.x - from.x
  373.             var dy:Number = to.y - from.y
  374.             return Math.atan2(dy,dx) *57.29577951308232   //  180/Math.PI=57.29577951308232
  375.         }
  376.         //##############OEF LOOP
  377.         private function oef(evt:Event):void
  378.     { 
  379.             rotateAndRaiseCamera()
  380.             //rotateToDirection()
  381.  
  382.             renderer.renderScene(scene,camera,viewport); 
  383.         } 
  384.     } 
  385. /**-----------------------------------------------------
  386.  * Use following BitmapPatternBuilder class 
  387.  * 
  388.  * DO NOT CHANGE any codes below this comment.
  389.  *
  390.  * -----------------------------------------------------
  391. */
  392. import flash.display.Bitmap;
  393. import flash.display.BitmapData;
  394. import flash.display.Graphics;
  395.     
  396. class BitmapPatternBuilder{
  397.     /**
  398.      * creates BitmapData filled with dot pattern.
  399.      * First parameter is 2d array that contains color index for each pixels;
  400.      * Second parameter contains color reference table.
  401.      *
  402.      * @parameter pattern:Array 2d array that contains color index for each pixel.
  403.      * @parameter colors:Array 1d array that contains color table.
  404.      * @returns BitmapData
  405.      */
  406.     public static function build(pattern:Array, colors:Array):BitmapData{
  407.         var bitmapW:int = pattern[0].length;
  408.         var bitmapH:int = pattern.length;
  409.         var bmd:BitmapData = new BitmapData(bitmapW,bitmapH,true,0x000000);
  410.         for(var yy:int=0; yy<bitmapH; yy++){
  411.             for(var xx:int=0; xx<bitmapW; xx++){
  412.                 var color:int = colors[pattern[yy][xx]];
  413.                 bmd.setPixel32(xx, yy, color);
  414.             }
  415.         }
  416.         return bmd;
  417.     }
  418.     
  419.     /**
  420.      * short cut function for Graphics.beginBitmapFill with pattern.
  421.      */
  422.     public static function beginBitmapFill(pattern:Array, colors:Array, graphics:Graphics):void{
  423.         var bmd:BitmapData = build(pattern, colors);
  424.         graphics.beginBitmapFill(bmd);
  425.         bmd.dispose();        
  426.     }
  427. }
noswf
  1. // forked from swingpants's Cityscape with dot pattern windows
  2. // forked from checkmate's fladdict challenge for professionals
  3. /**
  4.  * Theme:
  5.  * Play with BitmapPatterBuilder.
  6.  * Purpose of this trial is to find the possibility of the dot pattern.
  7.  *
  8.  * by Takayuki Fukatsu aka fladdict
  9.  **/
  10.   /**
  11.  * Cityscape Maker v0.1
  12.  * 3D Cityscape, with dot pattern windows and 3D fly - To do: Camera flybys.
  13.  *
  14.  * by Swingpants
  15.  **/
  16. package 
  17.     import flash.display.Sprite; 
  18.     import flash.display.MovieClip;
  19.     import flash.display.BitmapData 
  20.     import flash.events.Event; 
  21.     import flash.display.Graphics;
  22.     import flash.display.StageQuality 
  23.     import flash.text.*; 
  24.     import flash.geom.Point;
  25.     import org.papervision3d.materials.ColorMaterial; 
  26.     import org.papervision3d.objects.primitives.Plane; 
  27.     import org.papervision3d.objects.primitives.Cube; 
  28.     import org.papervision3d.objects.primitives.Cylinder; 
  29.     import org.papervision3d.scenes.Scene3D; 
  30.     import org.papervision3d.view.Viewport3D; 
  31.     import org.papervision3d.cameras.Camera3D; 
  32.     import org.papervision3d.render.BasicRenderEngine; 
  33.     import org.papervision3d.materials.shadematerials.FlatShadeMaterial
  34.     import org.papervision3d.materials.utils.MaterialsList
  35.     import org.papervision3d.materials.special.CompositeMaterial
  36.     import org.papervision3d.materials.ColorMaterial;
  37.     import org.papervision3d.materials.BitmapMaterial
  38.     import org.papervision3d.materials.*
  39.     import org.papervision3d.lights.PointLight3D;
  40.     import org.papervision3d.objects.DisplayObject3D
  41.     
  42.     import caurina.transitions.*;
  43.     
  44.     import net.hires.debug.Stats;
  45.   
  46.     [SWF(width=480, height=480, backgroundColor=0x000000)] 
  47.     public class Professional extends Sprite 
  48.     { 
  49.         private var tf:TextField=new TextField()
  50.         public var renderer:BasicRenderEngine = new BasicRenderEngine();; 
  51.         public var camera:Camera3D = new Camera3D(); 
  52.         public var viewport:Viewport3D = new Viewport3D(600,600); 
  53.         public var scene:Scene3D = new Scene3D(); 
  54.         public var mat:ColorMaterial = new ColorMaterial(0xFF0000); 
  55.         public var cubeMat:CompositeMaterial
  56.         public var materialsList:MaterialsList = new MaterialsList();
  57.         public var cube:Cube
  58.         public var cylinder:Cylinder
  59.         public var cubeSize:int=200
  60.         
  61.         public var panelMaterial:BitmapMaterial
  62.         
  63.         public var container3d:DisplayObject3D=new DisplayObject3D()
  64.         
  65.     public var window_pattern1:Array=[
  66.                         [0,0,0,0,0,0],
  67.                         [0,1,1,1,1,0],
  68.                         [0,1,2,2,1,0],
  69.                         [0,1,2,2,1,0],
  70.                         [0,1,1,1,1,0],
  71.                         [0,0,0,0,0,0]]
  72.         public var window_pattern2:Array=[
  73.                         [2,2,2,2,2,2],
  74.                         [2,1,1,1,1,2],
  75.                         [2,1,1,1,1,2],
  76.                         [2,1,1,1,1,2],
  77.                         [2,1,1,1,1,2],
  78.                         [2,2,2,2,2,2]]
  79.         public var window_pattern3:Array=[
  80.                         [1,1,1,1,1,1],
  81.                         [1,0,0,0,0,1],
  82.                         [1,0,0,0,0,1],
  83.                         [1,0,0,0,0,1],
  84.                         [1,0,0,0,0,1],
  85.                         [1,0,0,0,0,1]]
  86.         public var window_pattern4:Array=[
  87.                         [1,1,1,1,1,1],
  88.                         [2,1,0,0,0,1],
  89.                         [2,0,1,0,0,1],
  90.                         [2,0,0,1,0,1],
  91.                         [2,0,0,0,1,1],
  92.                         [2,2,2,2,2,1]]
  93.         public var window_pattern5:Array=[
  94.                         [0,0,0,0,0,0],
  95.                         [0,0,0,0,0,0],
  96.                         [0,0,1,1,1,0],
  97.                         [0,0,1,2,1,0],
  98.                         [0,0,1,1,1,0],
  99.                         [0,0,0,0,0,0]]
  100.         public var windows:Array=[window_pattern1,window_pattern2,window_pattern3,window_pattern4,window_pattern4]
  101.                         
  102.     private var col1:uint=0xff000000;
  103.         private var col2:uint=0xff555555;
  104.         private var col3:uint=0xffDDDDDD;
  105.         private var colour_array:Array=[col1,col2,col3]    
  106.         
  107.         private var dir:int=15;
  108.         
  109.         private const maxNumLevels:int=5
  110.         private const maxBaseSize:int=125
  111.         private var buildingLevels:Array=[]
  112.         
  113.         private var buildings:Array=[]
  114.         
  115.         private var grid_width:int=5
  116.         private var grid_height:int=6 
  117.         
  118.         private var cam_horiz:Boolean=false
  119.         private var cam_pos:Point=new Point(Math.floor(grid_width/2),0)
  120.         private var cam_target:Point=new Point(cam_pos.x,Math.floor(grid_height/2))
  121.         
  122.         private var diff:Number
  123.         
  124.         
  125.         public function Professional() 
  126.         { 
  127.             scene.addChild(container3d)
  128.             
  129.             camera.x = 30;
  130.             camera.y = 100
  131.         camera.z = -15*cubeSize;
  132.             
  133.         camera.zoom = 30;
  134.         camera.focus = 60;
  135.             //camera.lookAt(container3d)
  136.             
  137.             addChild(viewport) 
  138.             
  139.             createCityGrid(grid_width,grid_height) //Build the city
  140.             addEventListener(Event.ENTER_FRAME,oef); 
  141.             
  142.             tf.textColor=0xffffff
  143.             addChild(tf)
  144.             
  145.             stage.quality=StageQuality.LOW
  146.             //var s:Stats = new Stats();
  147.             //addChild(s);
  148.         }
  149.         
  150.         public function createCityGrid(rows:int,cols:int):void
  151.         {
  152.             buildings=[]
  153.              for(var i:int=0;i<cols;i++)
  154.                 {
  155.                     for(var j:int=0;j<rows;j++)
  156.                         {
  157.                             
  158.                             var tower:DisplayObject3D=createBuilding()
  159.                             tower.x=j*maxBaseSize*2//+maxBaseSize*4
  160.                             tower.z=i*maxBaseSize*2//+maxBaseSize*4
  161.                             container3d.addChild(tower)
  162.                             buildings.push(tower)
  163.                         }
  164.                 }
  165.             container3d.x-=rows*maxBaseSize
  166.         }
  167.         
  168.        
  169.         //#######Testing logic to randomise buildings - still needs lots of tweaking########
  170.         private function createBuilding():DisplayObject3D
  171.         {
  172.             var container:DisplayObject3D=new DisplayObject3D()
  173.             var levels:int=Math.ceil(Math.random()*maxNumLevels)
  174.             var maxHeight:int=levels*maxBaseSize*(0.5+(Math.random()*0.5))
  175.             var rnd:int
  176.             var w:int=maxBaseSize*0.75 + maxBaseSize*Math.random()*0.25
  177.             var h:int=maxHeight*0.5 + maxHeight*Math.random()*0.5
  178.             maxHeight-=h
  179.             var d:int=maxBaseSize*0.5 + maxBaseSize*Math.random()*0.5
  180.             var ypos:int=0
  181.             var buildingLevels:Array=[]
  182.             
  183.             for(var i:int=0;i<levels;i++)
  184.                 {
  185.                     ypos+=Math.ceil(h*0.5)
  186.                     rnd=Math.floor(Math.random()*10)
  187.                     switch(rnd) //Ropey method of slanting the results towards the cube and restricting the tapered cylinder - need to improve...
  188.                         {
  189.                             case 0://Cube
  190.                             case 1:
  191.                             case 2
  192.                             case 3:
  193.                             case 4:
  194.                             case 5:
  195.                             case 6:
  196.                                 buildingLevels.push(buildCube(w,d,h))
  197.                                 break;
  198.                             case 7://Cylinder
  199.                             case 8:
  200.                                 if(i==0)
  201.                                     {
  202.                                         buildingLevels.push(buildCylinder(w*0.5,h))
  203.                                     }
  204.                                     else
  205.                                     {
  206.                                         w*=0.7//Reduce size of cylinder if not 1st
  207.                                         buildingLevels.push(buildCylinder(w,h))
  208.                                      }
  209.                                 break;
  210.                             case 9://Tapered cylinder
  211.                                 if(i!=0)w*=0.7//Reduce size of cylinder if not 1st
  212.                                 buildingLevels.push(buildCylinder(w,h,true))
  213.                                 w*=0.6
  214.                                 break;
  215.                         }
  216.                    
  217.                     buildingLevels[i].y=ypos
  218.                     ypos+=Math.ceil(h*0.5)
  219.                     w*=0.4+Math.random()*0.4
  220.                     d*=0.4+Math.random()*0.4
  221.                     h=maxHeight*0.2+maxHeight*Math.random()
  222.                     maxHeight-=h
  223.                     
  224.                     container.addChild(buildingLevels[i])
  225.                 }
  226.             return container
  227.         }
  228.         
  229.         private function clearBuilding():void
  230.         {
  231.             var len:int=buildingLevels.length
  232.             for (var i:int=0;i<len;i++)
  233.                 {
  234.                     container3d.removeChild(buildingLevels[i])
  235.                 }
  236.             buildingLevels=[]
  237.         }
  238.         
  239.         private function buildCylinder(r:Number=100,h:Number=1000,tapered:Boolean=false):Cylinder
  240.         {
  241.             var cyl:Cylinder=new Cylinder(createDotTexture(r,h,false),r,h,8,6,tapered?r*0.8:-1,true,false)
  242.             
  243.             return cyl
  244.         }
  245.         
  246.         private function buildCube(w:int=200,h:int=200,d:int=200):Cube
  247.         {
  248.             var cubeMatList:MaterialsList = new MaterialsList( ); 
  249.             var main_mat:BitmapMaterial=createDotTexture(w,h)
  250.             cubeMatList.addMaterial( main_mat, "left" ); 
  251.             cubeMatList.addMaterial( main_mat, "right" ); 
  252.             cubeMatList.addMaterial( main_mat, "front" ); 
  253.             cubeMatList.addMaterial( main_mat, "back" ); 
  254.             cubeMatList.addMaterial( new ColorMaterial(0x333333,1), "top" );
  255.             var cubeObj:Cube = new Cube( cubeMatList, w, h, d, 4440, Cube.BOTTOM); 
  256.             // cubeObj.replaceMaterialByName(new ColorMaterial(0xff0000,1), "top");
  257.             return cubeObj
  258.         }
  259.         
  260.     public function createBitmapMaterialTexture():BitmapMaterial
  261.         {
  262.             var dot_pattern:Array=choosePattern()
  263.              return new BitmapMaterial(BitmapPatternBuilder.build(dot_pattern, colour_array))
  264.         }
  265.     
  266.         private function createDotTexture(w:int=200,h:int=200, useBorder:Boolean=true ,win_w:int=20,win_h:int=40):BitmapMaterial
  267.         {
  268.             var sprite:Sprite=new Sprite()
  269.             var dot_pattern:Array=choosePattern()
  270.             var border_col:uint=0x666666+Math.ceil(Math.random()*9)*0x111111 //Randomise the border colour (greyscale)
  271.             
  272.             sprite.graphics.beginBitmapFill(BitmapPatternBuilder.build(dot_pattern, colour_array));
  273.             if(useBorder)sprite.graphics.lineStyle(5+Math.ceil(Math.random()*5), border_col); //If using a border then have one that is a random width from 5 to 10
  274.             sprite.graphics.drawRect(0,0,w,h)
  275.             sprite.graphics.lineStyle(5, 0xffffff);
  276.             sprite.graphics.endFill()
  277.             
  278.             var bmd_w:int=w>10?w:10
  279.             var bmd_h:int=h>10?h:10
  280.             var bmd:BitmapData = new BitmapData(bmd_w, bmd_h, false, 0x00000000);
  281.             bmd.draw(sprite)
  282.             
  283.             return new BitmapMaterial(bmd)
  284.         }
  285.         
  286.         private function choosePattern():Array
  287.         {
  288.             var rnd:int=Math.floor(Math.random()*windows.length) //Randomly select the pattern to use
  289.             return windows[rnd]
  290.         }
  291.             
  292.         private function createTexture(w:int=200,h:int=200, win_w:int=20,win_h:int=40):BitmapMaterial
  293.         {
  294.             w=w>50?w:50 //Set minimum size for width and height
  295.             h=h>50?h:50
  296.             var sprite:Sprite=new Sprite()
  297.             
  298.             
  299.             sprite.graphics.lineStyle(10, 0xffffff);
  300.             sprite.graphics.drawRect(0,0,w,h)
  301.             sprite.graphics.lineStyle(5, 0xffffff);
  302.             
  303.             var win_gap_w:Number=win_w*0.25
  304.             var win_gap_h:Number=win_h*0.25
  305.             var columns:int=(w-win_w/2)/(win_w+win_gap_w)
  306.             var rows:int=(h-win_h/2)/(win_h+win_gap_h)
  307.             win_gap_w=(w-columns*win_w)/(columns+1)
  308.             win_gap_h=(h-rows*win_h)/(rows+1)
  309.             
  310.             for (var i:int=0;i<columns;i++)
  311.                 {
  312.                     for(var j:int=0;j<rows;j++)
  313.                         {
  314.                             sprite.graphics.drawRect(win_gap_w+i*(win_w+win_gap_w), win_gap_h+j*(win_h+win_gap_h),win_w,win_h)
  315.                         }
  316.                 }
  317.             var bmd:BitmapData = new BitmapData(200200false, 0x00000000);
  318.             bmd.draw(sprite)
  319.             return new BitmapMaterial(bmd)
  320.         }
  321.         
  322.         private function rotateAndRaiseCamera():void
  323.         {
  324.             camera.y+=dir
  325.             if(camera.y>1500 || camera.y<50) dir=-dir //Swing camera up and down
  326.             camera.lookAt(container3d)          
  327.             container3d.rotationY+=1.5
  328.         }
  329.         //###########CODE TO TRAVEL THROUGH CITY STREETS
  330.         private function tweenToNextPoint():void
  331.         {
  332.             
  333.             Tweener.addTween(camera,{x:maxBaseSize*2*cam_target.x, z:maxBaseSize*2*cam_target.y,time:diff*0.75,onComplete:rotateToDirection})
  334.         }
  335.         
  336.         private function rotateToDirection():void
  337.         {
  338.             var to_x:int=cam_pos.x
  339.             var to_y:int=cam_pos.y
  340.    
  341.             
  342.             if(cam_horiz)
  343.                 {
  344.                     to_x=1+Math.floor(grid_width-1)
  345.                     if(to_x==cam_pos.x)
  346.                         {
  347.                            if((grid_width-to_x)>grid_width*0.5){to_x-=1}
  348.                                else{to_x+=1}
  349.                         }
  350.                     diff=Math.abs(cam_pos.x-to_x)
  351.                 }
  352.                 else
  353.                 {
  354.                     to_y=1+Math.floor(grid_height-1)
  355.                     if(to_y==cam_pos.y)
  356.                         {
  357.                            if((grid_height-to_x)>grid_height*0.5){to_y-=1}
  358.                                else{to_y+=1}
  359.                         }
  360.                     diff=Math.abs(cam_pos.y-to_y)
  361.                 }
  362.              cam_target.x=to_x
  363.              cam_target.y=to_y
  364.              
  365.              Tweener.addTween(camera,{rotationY:angleToPoint(cam_pos,cam_target)-90,time:0.75,onComplete:tweenToNextPoint})
  366.              
  367.              tf.text="ang:"+angleToPoint(cam_pos,cam_target)
  368.          }
  369.          
  370.          public function angleToPoint(from:Point, to:Point):Number
  371.         {
  372.             var dx:Number = to.x - from.x
  373.             var dy:Number = to.y - from.y
  374.             return Math.atan2(dy,dx) *57.29577951308232   //  180/Math.PI=57.29577951308232
  375.         }
  376.         //##############OEF LOOP
  377.         private function oef(evt:Event):void
  378.     { 
  379.             rotateAndRaiseCamera()
  380.             //rotateToDirection()
  381.  
  382.             renderer.renderScene(scene,camera,viewport); 
  383.         } 
  384.     } 
  385. /**-----------------------------------------------------
  386.  * Use following BitmapPatternBuilder class 
  387.  * 
  388.  * DO NOT CHANGE any codes below this comment.
  389.  *
  390.  * -----------------------------------------------------
  391. */
  392. import flash.display.Bitmap;
  393. import flash.display.BitmapData;
  394. import flash.display.Graphics;
  395.     
  396. class BitmapPatternBuilder{
  397.     /**
  398.      * creates BitmapData filled with dot pattern.
  399.      * First parameter is 2d array that contains color index for each pixels;
  400.      * Second parameter contains color reference table.
  401.      *
  402.      * @parameter pattern:Array 2d array that contains color index for each pixel.
  403.      * @parameter colors:Array 1d array that contains color table.
  404.      * @returns BitmapData
  405.      */
  406.     public static function build(pattern:Array, colors:Array):BitmapData{
  407.         var bitmapW:int = pattern[0].length;
  408.         var bitmapH:int = pattern.length;
  409.         var bmd:BitmapData = new BitmapData(bitmapW,bitmapH,true,0x000000);
  410.         for(var yy:int=0; yy<bitmapH; yy++){
  411.             for(var xx:int=0; xx<bitmapW; xx++){
  412.                 var color:int = colors[pattern[yy][xx]];
  413.                 bmd.setPixel32(xx, yy, color);
  414.             }
  415.         }
  416.         return bmd;
  417.     }
  418.     
  419.     /**
  420.      * short cut function for Graphics.beginBitmapFill with pattern.
  421.      */
  422.     public static function beginBitmapFill(pattern:Array, colors:Array, graphics:Graphics):void{
  423.         var bmd:BitmapData = build(pattern, colors);
  424.         graphics.beginBitmapFill(bmd);
  425.         bmd.dispose();        
  426.     }
  427. }
noswf
Get Adobe Flash Player