`
hereson
  • 浏览: 1454529 次
  • 性别: 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);  } }}


分享到:
评论

相关推荐

    3D魔方Rubik's Cube 又叫魔术方块

    魔方,Rubik's Cube 又叫魔术方块,也称鲁比克方块。是匈牙利布达佩斯建筑学院厄尔诺·鲁比克教授在1974年发明的。魔方系由富于弹性的硬塑料制成的6面正方体。 3D魔方是一个完模仿方现实魔方的游戏。魔方可自由...

    Magic-Square:一个构建魔术方块的网站

    魔术方块,也被称为“幻方”,是一种古老的数学游戏,起源于中国的洛书,历史悠久,融合了数学、逻辑和娱乐性。在这个名为“Magic-Square”的项目中,它被转化为一个交互式的网站,用户可以利用这个平台来创建和探索...

    mssolutions:制作魔术方块。-开源

    这些程序使用“基于约束的本地搜索”来制作魔术正方形和矩形。 (对于非正方形矩形,请输入两个数字作为顺序。)共有3个类似的程序:CompleteSquare,CompleteSquareSteps和MagicSquares。 给定一个输入方格,其中...

    MagicSquare:一个用于创建魔术方块的Android应用程序

    魔术方块,又称魔方,是一种经典的智力游戏,由匈牙利建筑学教授埃尔诺·鲁比克在1974年发明。在本项目"MagicSquare:一个用于创建魔术方块的Android应用程序"中,开发者利用Java语言为Android平台构建了一个让用户...

    msquares:用于创建普通魔术方块的Python算法

    它将以等于或大于3的任何顺序随机创建魔术方块(超过6的顺序会花费很多时间)。 该限制是可选的,如果丢失该程序将生成所有可能的平方。 7x7阶示例平方 此包中的算法发现了7阶魔方。 175 | 16 | 36 | 4 | 41 | 2 ...

    ABC.zip_ABC

    在本例中,该压缩包可能包含一个或多个与"ABC"相关的游戏资源,如更新版的魔术方块游戏。"ABC.zip"可能是文件的主程序,而"_"后接的"ABC"可能是版本标识或某种特定的分类标签。 【描述】提到的新版“魔术方块游戏”...

    幻方算法介绍(java示例)

    幻方,有时又称魔方(该称呼现一般指立方体的魔术方块)或纵横图,由一组排放在正方形中的整数组成,其每行、每列以及两条对角线上的数之和均相等。通常幻方由从1到N2的连续整数组成,其中N为正方形的行或列的数目。...

    app-magic-square:一个学校项目,其中包括创建一个玩魔术方块的Android应用

    Android的魔方! 在我的大学课程(“移动应用程序的概念和开发”课程)中创建。 由于这是学校项目,因此不应维护该项目。 如果您想获得此工具的支持,请与我联系。 该应用程序由什么组成? 使用此软件,您可以在...

    自己做滴魔板小Game

    魔板通常指的是魔术方块或者某种拼图游戏,这类游戏通常要求玩家通过旋转或移动板块来达到预设的目标。这个项目可能是作者对游戏开发的兴趣驱动,用于锻炼编程技能和个人娱乐。 描述中的“自己做滴 随便整个 欢迎...

    三阶魔方入门小学教学版.ppt

    三阶魔方,亦称作魔术方块,是风靡全球的智力玩具,诞生于1974年,由匈牙利建筑师厄尔诺·鲁比克所创。最初设计为教育用途,旨在帮助学生理解三维空间,却意外地成为了全世界人们乐此不疲的娱乐和竞技项目。尽管市面...

    魔方解法.net程式範例

    魔方,又称魔术方块,是由匈牙利建筑学教授埃尔诺·鲁比克于1974年发明的一种三维拼图玩具。它由26个小立方体组成,通过旋转六个面来改变其颜色分布,目标是使每个面都恢复成单一的颜色。魔方的解法通常涉及到一系列...

    史上最牛的三阶魔方攻略(只要10分钟你就能学会).doc

    - 魔方,又叫魔术方块,由匈牙利建筑学教授厄尔诺·鲁比克于1974年发明。 - 魔方最初是作为教学工具帮助学生理解空间立方体的结构。 - 鲁比克立方体(Rubik's Cube)是魔方的英文名,鲁比克本人被誉为魔方界的...

    三阶魔方攻略(从入门到高级).doc

    魔方,又称魔术方块,是一款由匈牙利建筑学教授及雕塑家厄尔诺·鲁比克(Ernő Rubik)在1974年发明的经典机械益智玩具。鲁比克教授最初发明此玩具是为了帮助学生更好地理解空间几何结构。经过不断的改进和完善,这...

    一天学会玩魔方

    魔方,又称Rubik's Cube或魔术方块,是由匈牙利建筑师Ernő Rubik教授于1974年发明的一种益智玩具。最初设计目的是作为教学工具帮助学生理解空间几何概念。随着时间的发展,魔方因其独特的结构和复杂的玩法而迅速...

    SODLS:自正交对角拉丁方格。-开源

    每个文件都包含一个SODLS,后跟一个魔术方块。 魔方M由N SODLS Q阶及其转置而成,如:M [row] [col] = N x Q [row] [col] + Q [col] [row] + 1 ...

    programming2:编程2课程中的项目,作业和实验的存储库

    编程2 编程2课程中的项目,任务和实验室的资料库。 第一周 1. PReview: 包含Niloufar的复习powerpoint练习中的... 软件包lab4包含在Niloufar的实验4(魔术方块)中进行的练习。 软件包lab5包含在Niloufar的实验5(GPS

    Javascript Games Web:在线Javascript游戏-开源

    这个开源项目包含了一系列引人入胜的游戏,如图片拼图、魔术方块、疯狂拼图、大理石游戏、井字游戏以及数字猜测,每款游戏都充分利用了JavaScript的动态特性和事件处理能力。 1. 图片拼图:JavaScript可以处理图像...

    根据约瑟夫环设计一个简单的扑克魔术

    2. **扑克牌的特性**:扑克牌通常有52张,分为四种花色(红桃、黑桃、梅花、方块),每种花色有13张牌,从A到K。在这个魔术中,可能将扑克牌按照某种规则排列,形成一个“环”,并应用约瑟夫环的剔除规则。 3. **...

    guimagicsquare:这个幻方应用程序显示、旋转和移动大小为 3 到 9 的幻方,这些幻方是由两个拉丁方随机创建的。-matlab开发

    这个幻方应用程序显示、旋转和移动大小为 ... 现在,选定的颜色图将保留新魔术方块的颜色选择以及所有其他按钮的选择。 正方形类型,Pan Magic Square,Magic Square和Not Magic显示在应用程序内,而不是命令行屏幕上。

    C 语言 + easyx 课程设计俄罗斯方块 (星空表白彩蛋 ,游戏是假,爱你是真)

    C 语言课程设计作业 在下载 前需要 再到easyx官网下载 easyx 库 直接搜即可 ,下载好 程序,再选择再vscode 安装即可、下载好了压缩包,解压后 ,运行即可正常游戏。中途有任何问题欢迎私聊博主询问哦!...

Global site tag (gtag.js) - Google Analytics