XNA上模拟水果忍者切水果的方法

既然开了博客,总要写点什么,不然也还不如不开,翻箱倒柜,翻出以前陈旧的代码,先放上去,撑撑门面吧…

其实,水果忍者这个效果做起来并不难,只需要在创建数据的时候耍个小把戏就可以,和Metal Gear Solid里面的切水果的效果来对比,简直是小巫见大巫了,昨天在和几个新认识的朋友聊天后扯到这个,回去想了想,好像还是有实现的可能的,不过只是自己的一点小想法,因为没有成为现实,还是不要摆上来,以免贻笑大方。

现在说点正事。

水果忍者如果观察够细的话,玩家可能会发现,水果的断裂层基本是一致的,也就是说,水果总是以同一种方式被破坏,最明显的是香蕉,其实其他的说也一样,基本都是一分为二,不论你怎么切,横切也好,竖切也好,都不会发生水果腰斩的情况,这就让我断定,它肯定是在数据上做了手脚。

其实这一点很傻,如果我参与制作的话,一定会多搞几个不同的数据,迷惑大众….

怎么做呢,首先从数据入手,利用3DS MAX制作一下就好,这里我就把以前的笔记直接拖上来了…不低碳啊…

 

首先打开 3DS MAX 2010,绘制如下模型,参数如下图

接下来,制作一个拷贝

然后选择 新实例 (new instance), 接下来只要把位置调整为 (x:0, Y:5, Z:10)即可。

接下来,全选我们制作的模型,然后点击按钮

之后调出材质编辑对话框Slate Material Editor,然后做如下设置:


接下来,只要点击


按钮(Show Standard Material in Viewport)就可以看到效果了,是一个黄色的贴图的正方体

至于说Slate Material Editor里面的图是怎么绘制的,过程如下:


选择Maps里面的Bitmap选项,然后在弹出的菜单中选择所需要的贴图,这样就会生成一个选项卡


点击右边的小圆圈拖拽,就能点出一个context menu,然后,选择里面的Standard的,在接下来弹出的context menu里面选择Ambient,就会生成如下的图像


接下来只要拖拽小圆圈到Diffuse Color上,就会形成上面的图像效果。之后只要选择Material,然后确保已经选择了对应的模型(网格),就可以点击

进行设置了。

剩下的事情就很简单了,将其导出成FBX


选择好导出的路径和文件名,即可导出

其中导出选项中,推荐选择ASCII形式,如图:

为啥是ASCII格式呢,因为我喜欢看数据,数据拿在手上,放心…

 

这样就有了一个PlaceHolder的模型,导出后添加入XNA项目中

接下来也是很简单的,顺理成章的事情,如果有经验的XNA开发者都知道,只要做一个PickRay计算一下,操作每一个MeshPart就OK啦…

效果图

一下是代码…o(╯□╰)o…我是很不喜欢贴代码的,因为贴了代码可能以后这些东西就成古董了…我倒是希望提出一个解决方案,大家一起尝试验证这个方案的可行性,╮(╯▽╰)╭,既然第一次写,贴吧…

算PickRay的代码

private Ray CalculatePickRay()
{
    var mouseState = Mouse.GetState();
    _mouseX = mouseState.X;
    _mouseY = mouseState.Y;

    var nearSource = new Vector3(_mouseX, _mouseY, 0f);
    var farSource = new Vector3(_mouseX, _mouseY, 1f);

    var nearPoint = GraphicsDevice.Viewport.Unproject(nearSource, _projectionMatrix, _viewMatrix, Matrix.Identity);//改成自己的WorldMatrix,我的是Identity哦~
    var farPoint = GraphicsDevice.Viewport.Unproject(farSource, _projectionMatrix, _viewMatrix,Matrix.Identity);

    var direction = farPoint - nearPoint;
    direction.Normalize();
    var pickRay = new Ray(nearPoint, direction);

    return pickRay;
}

计算并绘制水果飞移的代码…

foreach (var mesh in _testModel.Meshes)
{
    foreach (BasicEffect effect in mesh.Effects)
    {
        if (_isSlice)
        {
            _meshPartTransfrom[meshPartIndex] += _moveSpeedList[meshPartIndex];
            effect.World = _boneTransform[mesh.ParentBone.Index] * Matrix.CreateRotationX(_rotateY) *
                Matrix.CreateTranslation(_meshPartTransfrom[meshPartIndex]) * _worldMatrix;
        }
        else
        {
            effect.World = _boneTransform[mesh.ParentBone.Index] * Matrix.CreateRotationX(_rotateY) * _worldMatrix;
        }
        effect.View = _viewMatrix;
        effect.Projection = _projectionMatrix;
        effect.EnableDefaultLighting();
        effect.TextureEnabled = true;
    }
    mesh.Draw();
    meshPartIndex++;
}

最后,省的烦,源代码直接上…

DownLoad

posted on 2011-11-06 20:41  WyNfee  阅读(553)  评论(0)    收藏  举报

导航