Amature部門、Professional部門ともに、アルゴリズムでビジュアルを作り出す為のとっかかりとなるような課題と心がけたのですが、みなさん、いかがでしたでしょうか?
サンプルコードを追っかけるので精一杯だった人から、課題を半分無視して自分の表現に没入した人まで、さまざまなレベルの挑戦者がいて、楽しく拝見させていただきました。
これだけの数の人が同じコードをフォークする機会も珍しいと思うので、自分が気に入った作品のコードを分解して、是非、色々と比べてみてください。きっと、面白い、新しい発見があるのではないかと思います。
挑戦者のみなさん、ありがとうございました。
How did you like my question? I tried to make you think of visual effect through algorithm, along with Amateur division and Professional division.
I see some of you had hard time to understand sample codes, while other pursued their own expression, regardless the question. I was so happy to look at many codes from various challengers.
It is unusual for us to make the same code; I hope you to take your time to look at some other codes you liked, and definitely compare it. Certainly, it is interesting and I think there is a new discovery.
Thank you, challengers.
hanjuqu
- // forked from checkmate's fladdict challenge for amateurs
- /**
- * Every frame you get screen caputre of the stage.
- * Generate new frame image with using last frames screen capture.
- * This is a starting point of recursive generative art.
- */
- package
- {
- import flash.display.Bitmap;
- import flash.display.BitmapData;
- import flash.display.BlendMode;
- import flash.display.Sprite;
- import flash.events.Event;
- import flash.geom.ColorTransform;
- import flash.geom.Matrix;
- import flash.geom.Point;
- import flash.utils.getTimer;
- public class Beginner extends Sprite
- {
- /**
- * Overwrite this update function.
- * Every frame the function is invoked with two bitmaps.
- * First one contains reference to the stage bitmap.
- * Second one contains static copy of stage.
- */
- public var canvas:BitmapData;
- public var drawHere:BitmapData;
- public var mat:Matrix;
- public function update(): void
- {
- drawStep();
- renderStep();
- fadeStep();
- }
- public function drawStep(): void
- {
- drawHere.setPixel(Math.random() * 480, Math.random() * 480, 0xffffffff);
- }
- private var scale:Number;
- public function transformStep(): Matrix
- {
- mat = new Matrix();
- mat.translate(-240, -240);
- scale = Math.cos(Math.pow(getTimer(), 2) * Math.PI * 2 * .1);
- mat.scale(scale, scale);
- mat.rotate(Math.random() + .75);
- mat.translate(240, 240);
- return mat;
- }
- public function renderStep(): void
- {
- canvas.draw(drawHere, transformStep(), null, BlendMode.SCREEN);
- canvas.draw(drawHere, transformStep(), null, BlendMode.DIFFERENCE);
- canvas.draw(drawHere, transformStep(), null, BlendMode.ADD);
- }
- public function fadeStep(): void
- {
- canvas.colorTransform(drawHere.rect, new ColorTransform(Math.random() * 0.4 + 0.6, Math.random() * 0.4 + 0.6, Math.random() * 0.4 + 0.6, 1, 0, 0, 0, 0));
- }
- /**
- * ---------------------------------------
- * DO NOT CHANGE FOLLOWING CODES
- * DO NOT ACCESS FOLLOWING PROPERTIES DIRECTLY
- * ---------------------------------------
- */
- private var bitmap:Bitmap;
- public function Beginner() {
- canvas = new BitmapData(480,480,false,0x000000);
- bitmap = new Bitmap(canvas);
- addChild(bitmap);
- addEventListener(Event.ENTER_FRAME, _update);
- }
- public function _update(e:Event):void{
- if(drawHere)
- drawHere.dispose();
- drawHere = canvas.clone();
- update();
- }
- }
- }
- 出題者からのコメント
- 光の輪の層がとても美しい。
- Comments from King
- The layers of loop are wonderful.
uwi
- // forked from checkmate's fladdict challenge for amateurs
- /**
- * Every frame you get screen caputre of the stage.
- * Generate new frame image with using last frames screen capture.
- * This is a starting point of recursive generative art.
- */
- package {
- import flash.display.Bitmap;
- import flash.display.BitmapData;
- import flash.display.BlendMode;
- import flash.display.Sprite;
- import flash.events.Event;
- import flash.geom.ColorTransform;
- import flash.geom.Matrix;
- import flash.geom.Point;
- import flash.geom.Rectangle;
- public class Beginner extends Sprite {
- /**
- * Overwrite this update function.
- * Every frame the function is invoked with two bitmaps.
- * First one contains reference to the stage bitmap.
- * Second one contains static copy of stage.
- */
- public var canvas:BitmapData;
- public var drawHere:BitmapData;
- public var mat:Matrix;
- public function update():void{
- drawStep();
- transformStep();
- renderStep();
- fadeStep();
- }
- public function drawStep():void {
- // drawHere.setPixel(stage.mouseX, stage.mouseY, 0x11111111);
- // drawHere.setPixel( Math.random()*480, Math.random()*480, 0xffffffff);
- // drawHere.fillRect(new Rectangle(Math.random() * 480, Math.random() * 480, 20, 20), Math.random() * 0xffffffff);
- var cx : Number = 240 - 50 + Math.random() * 100;
- var cy : Number = 240 - 50 + Math.random() * 100;
- // drawHere.fillRect(new Rectangle(cx - 10, cy - 10, 20, 20), col);
- drawHere.fillRect(new Rectangle(cx - 10, cy - 10, 20, 20), Math.random() * 0xffffff);
- }
- public function transformStep():void
- {
- mat = new Matrix();
- mat.translate(-240,-240);
- // mat.scale(1.005,1.005);
- mat.scale(1.02,1.02);
- // mat.rotate(1.5+Math.random() * 0.1);
- mat.rotate(6.28/5);
- mat.translate(240,240);
- }
- private var _t : int = 0;
- public function renderStep():void{
- canvas.draw(drawHere, mat, null,(_t++ & 1) == 1 ? BlendMode.LIGHTEN : BlendMode.DARKEN);
- }
- public function fadeStep():void
- {
- // canvas.colorTransform(drawHere.rect, new ColorTransform(1,1,1,1,1,1,1,0));
- // canvas.colorTransform(drawHere.rect, new ColorTransform(Math.random()*0.4+0.6,Math.random()*0.4+0.6,Math.random()*0.4+0.6,1,0,0,0,0));
- }
- /**
- * ---------------------------------------
- * DO NOT CHANGE FOLLOWING CODES
- * DO NOT ACCESS FOLLOWING PROPERTIES DIRECTLY
- * ---------------------------------------
- */
- private var bitmap:Bitmap;
- public function Beginner() {
- canvas = new BitmapData(480,480,false,0x000000);
- bitmap = new Bitmap(canvas);
- addChild(bitmap);
- addEventListener(Event.ENTER_FRAME, _update);
- }
- public function _update(e:Event):void{
- if(drawHere)
- drawHere.dispose();
- drawHere = canvas.clone();
- update();
- }
- }
- }
- 出題者からのコメント
- 放射状に展開する色のブレンディングがとてもキレイでした。
- Comments from King
- The color blend radially is very beautiful.
ibu4gin
- // forked from checkmate's fladdict challenge for amateurs
- /**
- * Every frame you get screen caputre of the stage.
- * Generate new frame image with using last frames screen capture.
- * This is a starting point of recursive generative art.
- */
- package {
- import flash.display.Bitmap;
- import flash.display.BitmapData;
- import flash.display.BlendMode;
- import flash.display.Sprite;
- import flash.events.Event;
- import flash.geom.ColorTransform;
- import flash.geom.Matrix;
- import flash.geom.Point;
- public class Beginner extends Sprite {
- /**
- * Overwrite this update function.
- * Every frame the function is invoked with two bitmaps.
- * First one contains reference to the stage bitmap.
- * Second one contains static copy of stage.
- */
- public var canvas:BitmapData;
- public var drawHere:BitmapData;
- public var mat:Matrix;
- public function update():void{
- drawStep();
- transformStep();
- renderStep();
- fadeStep();
- }
- public function drawStep():void {
- //drawHere.setPixel(stage.mouseX, stage.mouseY, 0x11111111);
- drawHere.setPixel( Math.random()*480, Math.random()*480, 0xffffffff);
- }
- private var my_byo:Number = 0;
- private var yuragi_num:Number;
- public function transformStep():void
- {
- mat = new Matrix();
- mat.translate(-240-30,-240+30);
- my_byo += 0.03;
- yuragi_num = 1 * Math.sin( my_byo * Math.PI * 2 * 0.1 );
- mat.scale(yuragi_num, yuragi_num);
- mat.rotate(yuragi_num * 10);
- mat.translate(240-30,240+30);
- }
- public function renderStep():void{
- canvas.draw(drawHere, mat, null,BlendMode.ADD);
- }
- public function fadeStep():void
- {
- canvas.colorTransform(drawHere.rect, new ColorTransform(Math.random()*0.4+0.6,Math.random()*0.4+0.6,Math.random()*0.4+0.6,1,0,0,0,0));
- }
- /**
- * ---------------------------------------
- * DO NOT CHANGE FOLLOWING CODES
- * DO NOT ACCESS FOLLOWING PROPERTIES DIRECTLY
- * ---------------------------------------
- */
- private var bitmap:Bitmap;
- public function Beginner() {
- canvas = new BitmapData(480,480,false,0x000000);
- bitmap = new Bitmap(canvas);
- addChild(bitmap);
- addEventListener(Event.ENTER_FRAME, _update);
- }
- public function _update(e:Event):void{
- if(drawHere)
- drawHere.dispose();
- drawHere = canvas.clone();
- update();
- }
- }
- }
- 出題者からのコメント
- ダイナミックに変動する動きがキレイでした。
- Comments from King
- The change of dynamic movement is adorable.
nutsu
- // 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
- **/
- package {
- import flash.display.Bitmap;
- import flash.display.BitmapData;
- import flash.display.Graphics;
- import flash.display.Shape;
- import flash.display.Sprite;
- import flash.display.StageScaleMode;
- import flash.events.Event;
- import flash.geom.ColorTransform;
- import frocessing.geom.*;
- import frocessing.color.*;
- [SWF(width=465,height=465,frameRate=60,background=0)]
- public class Professional extends Sprite {
- private var fs:Sprite;
- private var gc1:Graphics;
- private var gc2:Graphics;
- private var bg:BitmapData;
- private var ct:ColorTransform;
- private var img1:BitmapData;
- private var img2:BitmapData;
- private var next:BitmapData;
- private var pattern:BitmapData;
- private var offset:Number = 0;
- private var step:int = 0;
- private var mtx:FMatrix2D;
- private var vx:Number;
- private var vy:Number;
- private var xx:Number;
- private var yy:Number;
- public function Professional () {
- stage.scaleMode = StageScaleMode.NO_SCALE;
- //generate bitmap pattern.
- var f1:BitmapData = fig1();
- var f2:BitmapData = fig2();
- img1 = new BitmapData( 16, 24, false, 0 );
- img2 = img1.clone();
- img1.draw( f1, FMatrix2D.translateMatrix( 0, 2) );
- img1.draw( f1, FMatrix2D.translateMatrix( 0, 14) );
- img2.draw( f2, FMatrix2D.translateMatrix( -8, 2) );
- img2.draw( f2, FMatrix2D.translateMatrix( 8, 2) );
- img2.draw( f2, FMatrix2D.translateMatrix( 0, 14) );
- pattern = img1.clone();
- next = img2;
- //view
- bg = new BitmapData( 465, 465, false, 0 );
- addChild( new Bitmap( bg ) );
- fs = new Sprite();
- gc1 = fs.graphics;
- var cs:Shape = fs.addChild(new Shape()) as Shape;
- gc2 = cs.graphics;
- cs.blendMode = "subtract";
- ct = new ColorTransform(1, 1, 1, 1, -25, -25, -25);
- //geom
- mtx = new FMatrix2D();
- xx = yy = vx = vy = 0;
- addEventListener( Event.ENTER_FRAME, update );
- }
- private function update( e:Event ):void {
- if ( ++step == 30 ) {
- pattern.copyPixels( next, pattern.rect, pattern.rect.topLeft );
- next = ( next != img1 ) ? img1 : img2;
- offset++;
- step = 0;
- }
- xx += vx = ( mouseX - 232 - xx ) * 0.2;
- yy += vy = ( mouseY - 232 - yy ) * 0.2;
- vx *= 0.95;
- vy *= 0.95;
- var ss:Number = Math.max(1,23-Math.sqrt(xx*xx + yy*yy)/10);
- var ra:Number = Math.atan2(yy, xx) + Math.PI/2*int(offset/4);
- mtx.identity();
- mtx.translate( offset*4, 0 );
- mtx.scale( ss, ss );
- mtx.rotate( ra );
- mtx.translate( xx+232, yy+232 );
- gc1.clear();
- gc1.beginBitmapFill( pattern, mtx );
- gc1.drawRect(0,0,465,465);
- gc1.endFill();
- var c1:uint = 0xffffffff^FColor.HSVtoValue( ra*180/Math.PI, 0.8, 0.5 );
- var c2:uint = 0xffffffff^FColor.HSVtoValue( (ra - Math.PI/1.5)*180/Math.PI, 0.8, 0.5 );
- mtx.prependRotation( Math.PI/2 );
- mtx.prependScale( 24*0.0006103515625, 12*0.0006103515625 );
- gc2.clear();
- gc2.beginGradientFill("linear",[c1,0xeeeeee,c2,0xeeeeee],[1,1,1,1],[0,127,128,255],mtx,"repeat");
- gc2.drawRect(0,0,465,465);
- gc2.endFill();
- bg.colorTransform( bg.rect, ct );
- bg.draw( fs, null, null, "screen" );
- }
- //most simple patern
- public function fig1():BitmapData{
- return BitmapPatternBuilder.build(
- [[0,0,1,0,0,0,0,0,1,0,0],
- [0,0,0,1,0,0,0,1,0,0,0],
- [0,0,1,1,1,1,1,1,1,0,0],
- [0,1,1,0,1,1,1,0,1,1,0],
- [1,1,1,1,1,1,1,1,1,1,1],
- [1,0,1,1,1,1,1,1,1,0,1],
- [1,0,1,0,0,0,0,0,1,0,1],
- [0,0,0,1,1,0,1,1,0,0,0]],
- [0x00000000, 0xffffffff]
- );
- }
- public function fig2():BitmapData{
- return BitmapPatternBuilder.build(
- [[0,0,1,0,0,0,0,0,1,0,0],
- [1,0,0,1,0,0,0,1,0,0,1],
- [1,0,1,1,1,1,1,1,1,0,1],
- [1,1,1,0,1,1,1,0,1,1,1],
- [1,1,1,1,1,1,1,1,1,1,1],
- [0,1,1,1,1,1,1,1,1,1,0],
- [0,0,1,0,0,0,0,0,1,0,0],
- [0,1,0,0,0,0,0,0,0,1,0]],
- [0x00000000, 0xffffffff]
- );
- }
- }
- }
- /**-----------------------------------------------------
- * 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();
- }
- }
- 出題者からのコメント
- ビットマップの実験として、単純にとても美しく完成度が高かった。
- Comments from King
- From Bitmap experiment, it was simple, beautiful and high quality.
k3lab
- // 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
- **/
- package {
- import flash.display.Bitmap;
- import flash.display.BitmapData;
- import flash.display.Graphics;
- import flash.display.Sprite;
- import flash.display.StageScaleMode;
- import flash.events.Event;
- import flash.geom.Matrix;
- import flash.utils.getTimer
- [SWF(width=465, height=465,frameRate=30)]
- public class Professional extends Sprite {
- private var g:Sprite;
- private var pattern:BitmapData
- private var bmd:BitmapData;
- public function Professional() {
- stage.scaleMode = StageScaleMode.NO_SCALE;
- bmd = new BitmapData(480, 480, true)
- addChild(new Bitmap(bmd)) as Bitmap;
- pattern= sample1();
- g = new Sprite()
- addEventListener(Event.ENTER_FRAME,update)
- }
- private function update(e:Event):void {
- var a:Number = (getTimer() / 160)
- var mat:Matrix = new Matrix();
- mat.rotate(a * Math.PI / 180);
- var matrix:Matrix = new Matrix()
- matrix.rotate(a * Math.PI / 180)
- matrix.translate(stage.stageWidth/2,stage.stageHeight/2)
- g.graphics.clear()
- g.graphics.beginBitmapFill(pattern, mat, true, false)
- g.graphics.drawRect(0, 0, 480, 480);
- g.graphics.endFill();
- bmd.draw(g, matrix)
- }
- //most simple patern
- public function sample1():BitmapData{
- return BitmapPatternBuilder.build(
- [[1,0],
- [0,1]],
- [0xff000000, 0xffffffff]
- );
- }
- }
- }
- /**-----------------------------------------------------
- * 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();
- }
- }
- 出題者からのコメント
- モアレを利用することで、サンプルのパターン1つから複雑な文様を生み出した工夫が面白い。
- Comments from King
- By using Moiré, complex design from one pattern of the sample is interesting.
swingpants
- // 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();
- }
- }
- 出題者からのコメント
- 白黒のドットで構成された3D都市のテクスチャーが、ミニマルかつとても美しかったです。
- Comments from King
- The texture of 3D city composed of a monochrome dot was minimal and very fantastic.








