`
hereson
  • 浏览: 1428801 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

魔術方塊

    博客分类:
  • Pv3d
阅读更多
看到以前已經有人在沒有 Flash 3D engine 的幫助下,就做出了魔術方塊,我就在想若是用 PV3D 要做,應該也不會太難吧!所以我就先試著建出所需的模型,不過建模完後,想想將要寫的互動程式碼,感到程式碼也不會太少,可能還需要花點時間研究一下一些效果在 PV3D 該如何做到,建模的部份程式碼如下:



package { import flash.display.*; import flash.events.*; import flash.geom.*; import flash.utils.*;  import org.papervision3d.cameras.*; import org.papervision3d.materials.*; import org.papervision3d.objects.*; import org.papervision3d.scenes.*;  [SWF(backgroundColor="#000000", frameRate="60", width="400", height="400")] public class T5step1 extends Sprite {  private var container:Sprite;  private var scene:MovieScene3D;  private var camera:Camera3D;  private var mouseDownPoint:Point = null;    public function T5step1()  {   var bg:Sprite = new Sprite();   addChild(bg);   bg.graphics.beginFill(0x999999);   bg.graphics.drawRect(0, 0, 400, 400);   bg.graphics.endFill();      // initialize the objects   init3D();      // add a listener for the 3D loop   addEventListener(Event.ENTER_FRAME, loop3D);      addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);   addEventListener(MouseEvent.MOUSE_UP, onMouseUp);  }    private function init3D():void{      container = new Sprite();   addChild(container);      container.x = 200;   container.y = 200;      scene = new MovieScene3D(container);      camera = new Camera3D();   camera.z = -2000;   camera.zoom = 10;   camera.focus = 100;   for(var idxX:int=0; idxX<3; idxX++){    for(var idxY:int=0; idxY<3; idxY++){     for(var idxZ:int=0; idxZ<3; idxZ++){      if(!(idxX==1 && idxY==1 && idxZ==1)){       var cube:DisplayObject3D = new DisplayObject3D();       var p1:DisplayObject3D = cube.addChild(new Plane(new ColorMaterial(0xffffff), 100, 100, 1, 1, {rotationY:0, z:-50}), "p1"); //面朝瀏覽者       var p2:DisplayObject3D = cube.addChild(new Plane(new ColorMaterial(0xffffff), 100, 100, 1, 1, {rotationY:90, x:-50}), "p2"); //面朝左邊       var p3:DisplayObject3D = cube.addChild(new Plane(new ColorMaterial(0xffffff), 100, 100, 1, 1, {rotationY:-90, x:50}), "p3"); //面朝右邊       var p4:DisplayObject3D = cube.addChild(new Plane(new ColorMaterial(0xffffff), 100, 100, 1, 1, {rotationY:180, z:50}), "p4"); //面朝背面       var p5:DisplayObject3D = cube.addChild(new Plane(new ColorMaterial(0xffffff), 100, 100, 1, 1, {rotationX:90, y:-50}), "p5"); //面朝下面       var p6:DisplayObject3D = cube.addChild(new Plane(new ColorMaterial(0xffffff), 100, 100, 1, 1, {rotationX:-90, y:50}), "p6"); //面朝上面        if(idxZ==0){        //面朝前面        p1.material = new ColorMaterial(0xFF0000);       }       if(idxZ==2){        //面朝後面        p4.material = new ColorMaterial(0x00FF00);       }       if(idxX==0){        //面朝左邊        p2.material = new ColorMaterial(0x0000FF);       }       if(idxX==2){        //面朝右邊        p3.material = new ColorMaterial(0xFFFF00);       }       if(idxY==0){        //面朝下面        p5.material = new ColorMaterial(0xFF00FF);       }       if(idxY==2){        //面朝上面        p6.material = new ColorMaterial(0x00FFFF);       }              cube.x = (idxX-1) * 200;       cube.y = (idxY-1) * 200;       cube.z = (idxZ-1) * 200;        scene.addChild(cube, "cube"+idxX+idxY+idxZ);      }     }    }   }  }    private function loop3D(event:Event):void{    camera.hover(0, container.mouseX / 20, container.mouseY / 10);   scene.renderCamera(camera);  }    private function onMouseDown(event:MouseEvent):void{   mouseDownPoint = new Point(container.mouseX, container.mouseY);  }    private function onMouseUp(event:MouseEvent):void{   mouseDownPoint = null;  } }}


後來,我偶然看到前陣子流行至今的數獨,就在想不知道有沒有人有挑戰過 3D 數獨,所以就也試著先將 3D 數獨的模型建起來,不過這個遊戲的操作過程可能會有點麻煩,是要讓玩家可以走進 3D 的 Cube 中去做設定,還是要讓玩家可以將比較靠近裡面的整排 Cube 切換到外面來再做設定,這部份的操作方式可能要好好設計一下。此外,建立了 9 x 9 x 9 = 729 個 Cube,對於 PV3D 來說,差不多是該有點吃力的時候了,完整模型程式如下:


package { import flash.display.*; import flash.events.*; import flash.geom.*; import flash.utils.*;  import org.papervision3d.cameras.*; import org.papervision3d.materials.*; import org.papervision3d.objects.*; import org.papervision3d.scenes.*; import flash.text.TextField; import flash.text.TextFormat;  [SWF(backgroundColor="#000000", frameRate="60", width="400", height="400")] public class T5step2 extends Sprite {  private var container:Sprite;  private var scene:MovieScene3D;  private var camera:Camera3D;  private var length:int=50;  private var offset:int=20;    private var numBDs:Array = new Array();    public function T5step2()  {   //背景   var bg:Sprite = new Sprite();   addChild(bg);   bg.graphics.beginFill(0x999999);   bg.graphics.drawRect(0, 0, 400, 400);   bg.graphics.endFill();      //製作數字貼圖材質   var tf:TextFormat = new TextFormat();   tf.size = 24;   tf.bold = true;   for(var i:int=0; i<=9; i++){    var numSprite:Sprite = new Sprite();    numSprite.graphics.lineStyle(1);    numSprite.graphics.drawRect(0, 0, length, length);    var numTxt:TextField = new TextField();    numTxt.text = i.toString();    numTxt.setTextFormat(tf);    numSprite.addChild(numTxt);       var bd:BitmapData = new BitmapData(length, length, false, 0xffffffff);    bd.draw(numSprite);    numBDs.push(bd);   }      // initialize the objects   init3D();      // add a listener for the 3D loop   addEventListener(Event.ENTER_FRAME, loop3D);  }    private function init3D():void{      container = new Sprite();   addChild(container);      container.x = 200;   container.y = 200;      scene = new MovieScene3D(container);      camera = new Camera3D();   camera.z = -2000;   camera.zoom = 10;   camera.focus = 100;   for(var idxX:int=0; idxX<9; idxX++){    for(var idxY:int=0; idxY<9; idxY++){     for(var idxZ:int=0; idxZ<9; idxZ++){           var num:int = (idxX + idxY + idxZ) % 9 + 1;      var cube:DisplayObject3D = new Cube(new BitmapMaterial(numBDs[num]), length, length, length, 1, 1, 1);            cube.x = (idxX-4) * (length+offset);      cube.y = (idxY-4) * (length+offset);      cube.z = (idxZ-4) * (length+offset);      scene.addChild(cube, "cube"+idxX+idxY+idxZ);            //cube.container.alpha = 0.9;     }    }   }  }    private function loop3D(event:Event):void{    camera.hover(0, container.mouseX / 20, container.mouseY / 10);   scene.renderCamera(camera);  } }}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics