Beautifl - Flash Gallery

Thumbnail : Cityscape with dot pattern windows
Cityscape with dot pattern windows
swingpants 2009-08-27 MIT License

再生するにはFlash Playerが必要です。デスクトップのブラウザでご覧ください。

// forked from checkmate's fladdict challenge for professionals
/**
 * Theme:
 * Play with BitmapPatterBuilder.
 * Purpose of this trial is to find the possibility of the dot pattern.
 *
 * by Takayuki Fukatsu aka fladdict
 **/
  /**
 * Cityscape Maker v0.1
 * 3D Cityscape, with dot pattern windows and 3D fly - To do: Camera flybys.
 *
 * by Swingpants
 **/
package 
{ 
    import flash.display.Sprite; 
    import flash.display.MovieClip;
    import flash.display.BitmapData 
    import flash.events.Event; 
    import flash.display.Graphics;
    import flash.display.StageQuality 
    import flash.text.*; 
    import flash.geom.Point;
    import org.papervision3d.materials.ColorMaterial; 
    import org.papervision3d.objects.primitives.Plane; 
    import org.papervision3d.objects.primitives.Cube; 
    import org.papervision3d.objects.primitives.Cylinder; 
    import org.papervision3d.scenes.Scene3D; 
    import org.papervision3d.view.Viewport3D; 
    import org.papervision3d.cameras.Camera3D; 
    import org.papervision3d.render.BasicRenderEngine; 
    import org.papervision3d.materials.shadematerials.FlatShadeMaterial
    import org.papervision3d.materials.utils.MaterialsList
    import org.papervision3d.materials.special.CompositeMaterial
    import org.papervision3d.materials.ColorMaterial;
    import org.papervision3d.materials.BitmapMaterial
    import org.papervision3d.materials.*
    import org.papervision3d.lights.PointLight3D;
    import org.papervision3d.objects.DisplayObject3D
    
    import caurina.transitions.*;
    
    import net.hires.debug.Stats;

  

    [SWF(width=480, height=480, backgroundColor=0x000000)] 

    public class Professional extends Sprite 
    { 
        private var tf:TextField=new TextField()
        public var renderer:BasicRenderEngine = new BasicRenderEngine();; 
        public var camera:Camera3D = new Camera3D(); 
        public var viewport:Viewport3D = new Viewport3D(600,600); 
        public var scene:Scene3D = new Scene3D(); 

        public var mat:ColorMaterial = new ColorMaterial(0xFF0000); 
        public var cubeMat:CompositeMaterial
        public var materialsList:MaterialsList = new MaterialsList();

        public var cube:Cube
        public var cylinder:Cylinder
        public var cubeSize:int=200
        
        public var panelMaterial:BitmapMaterial
        
        public var container3d:DisplayObject3D=new DisplayObject3D()
		
	public var window_pattern1:Array=[
						[0,0,0,0,0,0],
						[0,1,1,1,1,0],
						[0,1,2,2,1,0],
						[0,1,2,2,1,0],
						[0,1,1,1,1,0],
						[0,0,0,0,0,0]]
        public var window_pattern2:Array=[
						[2,2,2,2,2,2],
						[2,1,1,1,1,2],
						[2,1,1,1,1,2],
						[2,1,1,1,1,2],
						[2,1,1,1,1,2],
						[2,2,2,2,2,2]]
        public var window_pattern3:Array=[
						[1,1,1,1,1,1],
						[1,0,0,0,0,1],
						[1,0,0,0,0,1],
						[1,0,0,0,0,1],
						[1,0,0,0,0,1],
						[1,0,0,0,0,1]]
        public var window_pattern4:Array=[
						[1,1,1,1,1,1],
						[2,1,0,0,0,1],
						[2,0,1,0,0,1],
						[2,0,0,1,0,1],
						[2,0,0,0,1,1],
						[2,2,2,2,2,1]]
        public var window_pattern5:Array=[
						[0,0,0,0,0,0],
						[0,0,0,0,0,0],
						[0,0,1,1,1,0],
						[0,0,1,2,1,0],
						[0,0,1,1,1,0],
						[0,0,0,0,0,0]]
        public var windows:Array=[window_pattern1,window_pattern2,window_pattern3,window_pattern4,window_pattern4]
						
	private var col1:uint=0xff000000;
        private var col2:uint=0xff555555;
        private var col3:uint=0xffDDDDDD;

        private var colour_array:Array=[col1,col2,col3]	
        
        private var dir:int=15;
        
        private const maxNumLevels:int=5
        private const maxBaseSize:int=125
        private var buildingLevels:Array=[]
        
        private var buildings:Array=[]
        
        private var grid_width:int=5
        private var grid_height:int=6 
        
        private var cam_horiz:Boolean=false
        private var cam_pos:Point=new Point(Math.floor(grid_width/2),0)
        private var cam_target:Point=new Point(cam_pos.x,Math.floor(grid_height/2))
        
        private var diff:Number
        
        

        public function Professional() 
        { 
            scene.addChild(container3d)
            
            camera.x = 30;
            camera.y = 100
	    camera.z = -15*cubeSize;
            
	    camera.zoom = 30;
	    camera.focus = 60;
            //camera.lookAt(container3d)
            
            addChild(viewport) 
            
            createCityGrid(grid_width,grid_height) //Build the city
            addEventListener(Event.ENTER_FRAME,oef); 
            
            tf.textColor=0xffffff
            addChild(tf)
            
            stage.quality=StageQuality.LOW
            //var s:Stats = new Stats();
            //addChild(s);
        }
        
        public function createCityGrid(rows:int,cols:int):void
        {
            buildings=[]
             for(var i:int=0;i<cols;i++)
                {
                    for(var j:int=0;j<rows;j++)
                        {
                            
                            var tower:DisplayObject3D=createBuilding()
                            tower.x=j*maxBaseSize*2//+maxBaseSize*4
                            tower.z=i*maxBaseSize*2//+maxBaseSize*4
                            container3d.addChild(tower)
                            buildings.push(tower)
                        }
                }
            container3d.x-=rows*maxBaseSize
        }
        
       
        //#######Testing logic to randomise buildings - still needs lots of tweaking########
        private function createBuilding():DisplayObject3D
        {
            var container:DisplayObject3D=new DisplayObject3D()
            var levels:int=Math.ceil(Math.random()*maxNumLevels)
            var maxHeight:int=levels*maxBaseSize*(0.5+(Math.random()*0.5))
            var rnd:int
            var w:int=maxBaseSize*0.75 + maxBaseSize*Math.random()*0.25
            var h:int=maxHeight*0.5 + maxHeight*Math.random()*0.5
            maxHeight-=h
            var d:int=maxBaseSize*0.5 + maxBaseSize*Math.random()*0.5
            var ypos:int=0
            var buildingLevels:Array=[]
            
            for(var i:int=0;i<levels;i++)
                {
                    ypos+=Math.ceil(h*0.5)
                    rnd=Math.floor(Math.random()*10)
                    switch(rnd) //Ropey method of slanting the results towards the cube and restricting the tapered cylinder - need to improve...
                        {
                            case 0://Cube
                            case 1:
                            case 2: 
                            case 3:
                            case 4:
                            case 5:
                            case 6:
                                buildingLevels.push(buildCube(w,d,h))
                                break;
                            case 7://Cylinder
                            case 8:
                                if(i==0)
                                    {
                                        buildingLevels.push(buildCylinder(w*0.5,h))
                                    }
                                    else
                                    {
                                        w*=0.7//Reduce size of cylinder if not 1st
                                        buildingLevels.push(buildCylinder(w,h))
                                     }
                                break;
                            case 9://Tapered cylinder
                                if(i!=0)w*=0.7//Reduce size of cylinder if not 1st
                                buildingLevels.push(buildCylinder(w,h,true))
                                w*=0.6
                                break;
                        }
                   
                    buildingLevels[i].y=ypos
                    ypos+=Math.ceil(h*0.5)
                    w*=0.4+Math.random()*0.4
                    d*=0.4+Math.random()*0.4
                    h=maxHeight*0.2+maxHeight*Math.random()
                    maxHeight-=h
                    
                    container.addChild(buildingLevels[i])
                }
            return container
        }
        
        private function clearBuilding():void
        {
            var len:int=buildingLevels.length
            for (var i:int=0;i<len;i++)
                {
                    container3d.removeChild(buildingLevels[i])
                }
            buildingLevels=[]
        }
        
        private function buildCylinder(r:Number=100,h:Number=1000,tapered:Boolean=false):Cylinder
        {
            var cyl:Cylinder=new Cylinder(createDotTexture(r,h,false),r,h,8,6,tapered?r*0.8:-1,true,false)
            
            return cyl
        }
        
        private function buildCube(w:int=200,h:int=200,d:int=200):Cube
        {

            var cubeMatList:MaterialsList = new MaterialsList( ); 
            var main_mat:BitmapMaterial=createDotTexture(w,h)
            cubeMatList.addMaterial( main_mat, "left" ); 
            cubeMatList.addMaterial( main_mat, "right" ); 
            cubeMatList.addMaterial( main_mat, "front" ); 
            cubeMatList.addMaterial( main_mat, "back" ); 
            cubeMatList.addMaterial( new ColorMaterial(0x333333,1), "top" );
            var cubeObj:Cube = new Cube( cubeMatList, w, h, d, 4, 4, 4, 0, Cube.BOTTOM); 
            // cubeObj.replaceMaterialByName(new ColorMaterial(0xff0000,1), "top");

            return cubeObj
        }
        
	public function createBitmapMaterialTexture():BitmapMaterial
        {
            var dot_pattern:Array=choosePattern()
             return new BitmapMaterial(BitmapPatternBuilder.build(dot_pattern, colour_array))
        }
	
        private function createDotTexture(w:int=200,h:int=200, useBorder:Boolean=true ,win_w:int=20,win_h:int=40):BitmapMaterial
        {
            var sprite:Sprite=new Sprite()

            var dot_pattern:Array=choosePattern()
            var border_col:uint=0x666666+Math.ceil(Math.random()*9)*0x111111 //Randomise the border colour (greyscale)
            
            sprite.graphics.beginBitmapFill(BitmapPatternBuilder.build(dot_pattern, colour_array));
            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
            sprite.graphics.drawRect(0,0,w,h)
            sprite.graphics.lineStyle(5, 0xffffff);
            sprite.graphics.endFill()
            
            var bmd_w:int=w>10?w:10
            var bmd_h:int=h>10?h:10
            var bmd:BitmapData = new BitmapData(bmd_w, bmd_h, false, 0x00000000);
            bmd.draw(sprite)
            
            return new BitmapMaterial(bmd)
        }
        
        private function choosePattern():Array
        {
            var rnd:int=Math.floor(Math.random()*windows.length) //Randomly select the pattern to use
            return windows[rnd]
        }
        	
        private function createTexture(w:int=200,h:int=200, win_w:int=20,win_h:int=40):BitmapMaterial
        {
            w=w>50?w:50 //Set minimum size for width and height
            h=h>50?h:50
            var sprite:Sprite=new Sprite()
            
            
            sprite.graphics.lineStyle(10, 0xffffff);
            sprite.graphics.drawRect(0,0,w,h)
            sprite.graphics.lineStyle(5, 0xffffff);
            
            var win_gap_w:Number=win_w*0.25
            var win_gap_h:Number=win_h*0.25
            var columns:int=(w-win_w/2)/(win_w+win_gap_w)
            var rows:int=(h-win_h/2)/(win_h+win_gap_h)
            win_gap_w=(w-columns*win_w)/(columns+1)
            win_gap_h=(h-rows*win_h)/(rows+1)
            
            for (var i:int=0;i<columns;i++)
                {
                    for(var j:int=0;j<rows;j++)
                        {
                            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)
                        }
                }

            var bmd:BitmapData = new BitmapData(200, 200, false, 0x00000000);
            bmd.draw(sprite)
            return new BitmapMaterial(bmd)
        }
        
        private function rotateAndRaiseCamera():void
        {
            camera.y+=dir
            if(camera.y>1500 || camera.y<50) dir=-dir //Swing camera up and down

            camera.lookAt(container3d)          
            container3d.rotationY+=1.5; 
        }
        //###########CODE TO TRAVEL THROUGH CITY STREETS
        private function tweenToNextPoint():void
        {
            
            Tweener.addTween(camera,{x:maxBaseSize*2*cam_target.x, z:maxBaseSize*2*cam_target.y,time:diff*0.75,onComplete:rotateToDirection})
        }
        
        private function rotateToDirection():void
        {
            var to_x:int=cam_pos.x
            var to_y:int=cam_pos.y
   
            
            if(cam_horiz)
                {
                    to_x=1+Math.floor(grid_width-1)
                    if(to_x==cam_pos.x)
                        {
                           if((grid_width-to_x)>grid_width*0.5){to_x-=1}
                               else{to_x+=1}
                        }
                    diff=Math.abs(cam_pos.x-to_x)
                }
                else
                {
                    to_y=1+Math.floor(grid_height-1)
                    if(to_y==cam_pos.y)
                        {
                           if((grid_height-to_x)>grid_height*0.5){to_y-=1}
                               else{to_y+=1}
                        }
                    diff=Math.abs(cam_pos.y-to_y)
                }
             cam_target.x=to_x
             cam_target.y=to_y
             
             Tweener.addTween(camera,{rotationY:angleToPoint(cam_pos,cam_target)-90,time:0.75,onComplete:tweenToNextPoint})
             
             tf.text="ang:"+angleToPoint(cam_pos,cam_target)
         }
         
         public function angleToPoint(from:Point, to:Point):Number
		{
			var dx:Number = to.x - from.x
			var dy:Number = to.y - from.y

			return Math.atan2(dy,dx) *57.29577951308232   //  180/Math.PI=57.29577951308232
		}

        //##############OEF LOOP
        private function oef(evt:Event):void
	{ 
            rotateAndRaiseCamera()
            //rotateToDirection()
 
            renderer.renderScene(scene,camera,viewport); 
        } 
    } 
} 

/**-----------------------------------------------------
 * Use following BitmapPatternBuilder class 
 * 
 * DO NOT CHANGE any codes below this comment.
 *
 * -----------------------------------------------------
*/
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Graphics;
    
class BitmapPatternBuilder{
    /**
     * creates BitmapData filled with dot pattern.
     * First parameter is 2d array that contains color index for each pixels;
     * Second parameter contains color reference table.
     *
     * @parameter pattern:Array 2d array that contains color index for each pixel.
     * @parameter colors:Array 1d array that contains color table.
     * @returns BitmapData
     */
    public static function build(pattern:Array, colors:Array):BitmapData{
        var bitmapW:int = pattern[0].length;
        var bitmapH:int = pattern.length;
        var bmd:BitmapData = new BitmapData(bitmapW,bitmapH,true,0x000000);
        for(var yy:int=0; yy<bitmapH; yy++){
            for(var xx:int=0; xx<bitmapW; xx++){
                var color:int = colors[pattern[yy][xx]];
                bmd.setPixel32(xx, yy, color);
            }
        }
        return bmd;
    }
    
    /**
     * short cut function for Graphics.beginBitmapFill with pattern.
     */
    public static function beginBitmapFill(pattern:Array, colors:Array, graphics:Graphics):void{
        var bmd:BitmapData = build(pattern, colors);
        graphics.beginBitmapFill(bmd);
        bmd.dispose();        
    }
}