魔術方塊

看到以前已經有人在沒有 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); } }}
(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值