JMonkeyEngine3.X SDK教程——序章

  这个系列教程是为所有JAVA程序员使用JMonkeyEngine3.xSDK(虽然我已经不再从事JAVA开发超过2年了)而编写的。什么是JMonkeyEngine3.X?它是高性能跨平台现代化3D游戏引擎,旨在为所有JAVA程序员提供开发游戏的途径,关于它的更多信息,可以查看官方网址:https://jmonkeyengine.org/tags/tutorials/

  有个问题是,为什么选择JMonkeyEngine3.x?我想,有三个主要原因:1.java程序员不喜欢切换到其他语言去学习编写游戏(不代表所有java程序员),2.可能不是主职业从事游戏开发,而是以业余爱好者进行独立游戏开发,3.一些java项目需要用到3D功能。

  我想,在这个时间点(2020年12月14日),以寻找游戏开发作为职业的最好学习unity3D或unreal引擎,就像学习建模软件去找工作一样,学习Blender在国内很难找到工作(而3DMax,Maya则岗位较多)。简而言之,总有其他工具比一些工具便捷,但是不影响我们使用我们选择的工具,因为我们不是以找工作为主,而是以个人爱好或部分需要使用。因此,如果你考虑寻找工作,这个工具(JMonkeyEngine3.x)不适合你,我强烈推荐你学习岗位火热的技术与工具。

  现在,我们开始使用JMonkeyEngine3.x,为何说是3.x?因为JMonkeyEngine近几年进行了多次更新,所以我写这篇文章以3.x统一标识。而不具体到某个版本,但是我会以3.2.4和3.3.2-beta版进行主要讲解。

  很显然,我假设你已经了解过什么是JMonkeyEngine3.x了。如果你从未了解过,你可以看看另一个人写的文章:https://www.wenjiangs.com/doc/preface-i-want-to-make-game,也可看看上面提到的官网。有一个问题是,既然有这些教程,为何我要独立再写一个?原因是上面链接提到的教学内容以API式方式进行讲解JMonkeyEngine3.x的使用,而不是以SDK方式进行讲解。这两种有什么不同呢?简单的说,以API式方式进行教学就像让你用纯代码方式去制作游戏,这种方式对于某些游戏来说可行,但对于大部分游戏(一般式)游戏而言未免效率过低。我敢打赌,大部分人肯定不会想要用代码的方式去布局一个游戏的关卡,而是希望通过一种可视化编辑器工具,直接设计好场景,然后设计完脚本,就可以运行游戏。

  如果你正在寻找这种方式,那这个教程非常适合你。为了让你有一个直观的印象,这里简单演示下通过SDK和API式去编写一个可运动BOX的区别。首先,通过API式编写这个案例,我们希望盒子初始化位置在原点斜对面,然后,盒子能够从左往右来回移动,那么,通过代码方式,可以这样处理:

public class BoxPathTest extends SimpleApplication{
    private MotionPath path;
    private MotionEvent motionControl;
    public static void main(String[] args) {
        new BoxPathTest().start();
    }
    @Override
    public void simpleInitApp() {
        // 创建一个Box
        /* A colored lit cube. Needs light source! */ 
        Box boxMesh = new Box(1f,1f,1f); 
        Geometry boxGeo = new Geometry("Colored Box", boxMesh); 
        Material boxMat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); 
        boxMat.setColor("Color", ColorRGBA.Blue); 
        boxGeo.setMaterial(boxMat); 
        // 放到原点斜对角面的某个位置(由于没有所见所得,所以你可能需要不断调整这个值然后运行起来看看确定下位置)
        boxGeo.setLocalTranslation(10, 10, 10);
        rootNode.attachChild(boxGeo);
        // 然后创建路径动画
        path = new MotionPath();
        path.addWayPoint(new Vector3f(10, 10, 10));
        path.addWayPoint(new Vector3f(20, 10, 10));
        path.enableDebugShape(assetManager, rootNode);

        motionControl = new MotionEvent(boxGeo, path);
        motionControl.setDirectionType(MotionEvent.Direction.PathAndRotation);
        motionControl.setRotation(new Quaternion().fromAngleNormalAxis(-FastMath.HALF_PI, Vector3f.UNIT_Y));
        motionControl.setLoopMode(LoopMode.Cycle);
        motionControl.setInitialDuration(10f);
        motionControl.setSpeed(2f);       
        // 播放路径动画
        motionControl.play();
        
        // 调整相机位置,使得观察角度合适化
        // 你试先很难猜测哪个位置比较适合观察box的移动,所以你需要不断修改,然后运行起来查看结果
        cam.setLocation(new Vector3f(35, 35, 35));
        cam.lookAt(new Vector3f(10, 10, 10), Vector3f.UNIT_Y);
    }
    
}

   然后运行起来,你可以看到一个蓝色的Box在左右来回移动,效果如下:

  可以看到,仅仅是写这么一个简单案例,我们就键入了如此多的代码,其中的缺点在代码注释中也描述了,比如相机的观察点设置,我们需要不断调整数值,然后运行起来查看,反复这个过程,可想而知如果用这种方式去制作一个游戏,其效率之低可想而知。

  现在,我们通过SDK的方式来完成这个案例。

  第一步,创建一个场景文件,并添加一个Box,然后放置到你想要的位置(别担心,后续的教程会详细讲解如何使用SDK,现在只需要知道有这么一回事):

  第二步,添加一个路径动画控制器,附加到Box上,并调整好相关参数:

 

  接着,我们添加一个摄像机,调整好位置,让它观察Box,如下:

 

   你可以右键单机MotionEvent,直接实时浏览效果,如下:

 

   要将这个案例发布成可执行程序,我们需要编写一个启动类,然后加载这个场景:

public class BoxPathScene extends SimpleApplication{
    public static void main(String[] args) {
        new BoxPathScene().start();
    }
    @Override
    public void simpleInitApp() {
        rootNode.attachChild(assetManager.loadModel("Scenes/BoxPathScene.j3o"));
        Node mainCamera = (Node) ((Node)rootNode).getChild("mainCamera");
        cam.setLocation(mainCamera.getWorldTranslation());
        cam.setRotation(mainCamera.getWorldRotation());
        
        rootNode.getChild("Box").getControl(MotionEvent.class).play();
    }
    
}

   运行这段代码,你可以看到一样的结果。

  似乎使用SDK的步骤比较多,但事实上,这在制作复杂游戏时,很明显比纯代码方式制作便捷多了(不然就不会有所见所得这种重要的概念存在了),这个例子并没有体现脚本控制的概念,但是可以简单让你从直观角度看出同一个案例用两种方式去实现的区别。后面的教程将着重讲解使用SDK的技巧和一些注意事项(SDK并非完善的工具,因为存在BUG)。

 

  

posted @ 2020-12-14 20:06  JhonKkk  阅读(854)  评论(0)    收藏  举报