魔術方塊

看到以前已經有人在沒有 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); } }}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值