




免费预览已结束,剩余61页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JMonkeyEngine3学习文档(Version 1.0)JME团队成员编写 66目 录一、Beginner Tutorials31.1 Hello SimpleApplication31.2 Hello Node61.3 Hello Assets141.4 Hello Event Loop241.5 Hello Input System251.6 Hello Material301.7 Hello Animation351.8 Hello Picking411.9 Hello Collision451.10 Hello Terrain481.11 Hello Audio491.12 Hello Effects491.13 Hello Physics56JMonkeyEngine3 Engine一、Beginner Tutorials1.1 Hello SimpleApplication 本教程假定你已经下载并在你所选择的IDE上搭建起了jMonkeyEngine3引擎,并且能够顺利的运行演示程序。 你已经准备好创建你的第一个jMonkeyEngine3游戏!在这个入门系列教程里你可以使用任意的集成开发环境(IDE),如jMonkeyPlatform,NetBeans,Eclipse,或直接从命令行运行。编写一个简单的应用程序 在IDE里创建一个jme3test.helloworld包和一个HelloJME3.java文件。 在NetBeans中,你可以用鼠标右击源代码包节点l 选择New - Java Class来创建一个新文件l 输入一个类名:HelloJME3l 输入一个包名:jme3test.helloworldl 单击“完成”示例代码 用下面的代码替换HelloJME3.java文件的内容:package jme3test.helloworld;import com.jme3.app.SimpleApplication;import com.jme3.material.Material;import com.jme3.math.Vector3f;import com.jme3.scene.Geometry;import com.jme3.scene.shape.Box;import com.jme3.math.ColorRGBA; /* 示例1 - 如何开始大部分简单的JME 3应用程序。 * 展示一个蓝色的3D立方体,并且通过移动鼠标和按WASD键从各个方向 * 观看它。*/public class HelloJME3 extends SimpleApplication public static void main(String args) HelloJME3 app = new HelloJME3(); app.start(); Override public void simpleInitApp() Box b = new Box(Vector3f.ZERO, 1, 1, 1); Geometry geom = new Geometry(Box, b); Material mat = new Material(assetManager, Common/MatDefs/Misc/Unshaded.j3md); mat.setColor(Color, ColorRGBA.Blue); geom.setMaterial(mat); rootNode.attachChild(geom); 编译和运行HelloJME3类。如果一个JME设置对话框弹出,则保持默认设置点确认。1. 你应该看到一个简单的窗口,显示一个3 - D立方体。2. 使用WASD键和鼠标在立方体周围操纵它。3. 按Esc键来关闭这个应用程序。恭喜你,它运行出来了!我们是怎么做到的呢?理解代码 所有的JME3游戏有一些基本的规则开始游戏 请注意,HelloJME3.java类继承了com.jme3.app.SimpleApplication,这是com.jme3.app.Application的一个子类。每个JME3游戏都是com.jme3.app.Application的一个实例(直接或间接)。要运行JME3的游戏,你首先要实例化你的应用基础类,然后调用它的start()方法:HelloJME3 app = new HelloJME3();app.start();通常情况下,你都是从你的Java应用程序主方法开始做。提示:高级Java开发人员可能要做一个SimpleApplication复制品并且使用它作为一个模板,自定义应用程序类。初始化场景这个简单的“游戏”只有一个立方体组成。下面是我们如何创建它,定位它,给它一个颜色,并且将它附加到场景。(之后我们将有一个详细的介绍)。 public void simpleInitApp() Box(Vector3f.ZERO, 1, 1, 1); / 创建立方体形状 Geometry geom = new Geometry(Box, b); / 创建多维的几何形状 Material mat = new Material(assetManager, Common/MatDefs/Misc/Unshaded.j3md); / 创建一个简单的材料 mat.setColor(Color, ColorRGBA.Blue); / 设置材料的颜色 geom.setMaterial(mat); / 设置立方体的材料 rootNode.attachChild(geom); / 将立方体附加到场景中去 这个simpleInitApp()方法是每个JME3游戏开始时自动调用一次的。在这个方法中,你创建或加载游戏开始之前所需要的对象!下面是通常的过程: 1. 初始化游戏对象:l 创建或加载所有对象并定位它们。l 为了使几何图形(如盒子)出现在场景中,将它附加到的RootNode。l 例如:载入球员,地形,天空,敌人,障碍,并将其放置在它们的起始位置。 2. 初始化游戏变量:l 游戏变量决定游戏的状态。将它们设置初始值。l 例如:在这里设置score为0,并且health为100,等等。3. 初始化导航:下面的键绑定是默认情况下被配置的:l W,A,S,D键 - 四周移动l 鼠标和方向键 - 打开相机l Esc键 - 退出游戏最重要的部分是:JME3应用程序有一个根节点对象。你的游戏会自动继承根节点。任何事情都附加到根节点然后出现在场景中。或者换句话说:一个已创建的对象,如果没有连接到根节点上,它仍然是看不见。结论这几行代码没做什么事情,但足以显示一个静态的3 - D对象,并且它们已经允许你在3D范围内去导航它。你已经学习到SimpleApplication是一个很好的起点,因为它为你提供:l simpleInitApp()方法来初始化游戏对象l 你附加几何图形到根节点上使它们出现在场景中l 有用的默认导航设置 在真正的游戏中,你将会:l 初始化游戏世界l 在事件循环中触发行为l 响应用户输入 在以下的教程中,你将学习如何用jMonkeyEngine 3完成这些任务!继续Hello Node教程,在这里我们将首先介绍关于如何初始化游戏世界的详细内容,也称为场景图。1.2 Hello Node 当创建一个3D游戏时,你开始创建一个场景和一些对象。你放置对象(球员,障碍等)在场景中,并且移动,缩放,旋转,着色使它们有生命力。在这个教程中,我们将看到一个简单的3D场景。你将学到3D世界在场景图中是一个代表以及根节点重要的原因。你将学习如何创建简单的对象,以及如何改造它们 - 移动,缩放,旋转。你将了解在场景图中,节点和几何图两种类型之间的区别。为了对场景图有一个视觉上的介绍,请看我们的示例展示。示例代码package jme3test.helloworld; import com.jme3.app.SimpleApplication;import com.jme3.material.Material;import com.jme3.math.Vector3f;import com.jme3.scene.Geometry;import com.jme3.scene.shape.Box;import com.jme3.math.ColorRGBA;import com.jme3.scene.Node; /* 示例2 - 如何使用节点作为手柄操纵场景图中的对象。你可以通过操纵 * 它们的父节点来旋转,平移,缩放对象。根节点是特殊的:只有附加到根 * 节点上的东西才会出现在场景中。*/public class HelloNode extends SimpleApplication public static void main(String args) HelloNode app = new HelloNode(); app.start(); Override public void simpleInitApp() / 在坐标(1,-1,1)处创建一个蓝色盒子 Box box1 = new Box( new Vector3f(1,-1,1), 1,1,1); Geometry blue = new Geometry(Box, box1); Material mat1 = new Material(assetManager, Common/MatDefs/Misc/Unshaded.j3md); mat1.setColor(Color, ColorRGBA.Blue); blue.setMaterial(mat1); / 在蓝色盒子上边坐标为(1,3,1)处垂直创建一个红色盒子 Box box2 = new Box( new Vector3f(1,3,1), 1,1,1); Geometry red = new Geometry(Box, box2); Material mat2 = new Material(assetManager, Common/MatDefs/Misc/Unshaded.j3md); mat2.setColor(Color, ColorRGBA.Red); red.setMaterial(mat2); / 在坐标为(0,0,0)处创建一个pivot节点并把它附加到根节点上 Node pivot = new Node(pivot); rootNode.attachChild(pivot); / 附加两个盒子到pivot节点上! pivot.attachChild(blue); pivot.attachChild(red); / 旋转pivot节点: 两个盒子都被旋转了! pivot.rotate( 0.4f , 0.4f , 0.0f ); 编译和运行代码示例。你应该看到在相同的角度有两个倾斜的彩色盒子。理解术语在这个教程中,你将学到一些新的术语: 1. 场景图代表你的3D世界。 2. 场景图(如在这个例子中的盒子)中的对象被称为空间。l 空间是一个收集有关对象的信息:它的位置,旋转和缩放。l 空间可装载,转换和保存。3. 有两种类型空间,节点和几何图。4. 为了添加一个空间到场景图,你必须附加这个空间到根节点上。5. 被附加到根节点上的每一样东西都是场景图的一部分。理解代码那么究竟在这个代码片段里发生了什么?注意,我们使用的simpleInitApp()方法在第一篇教程中已经进行了介绍。 1. 我们创建了一个盒子几何体。l 这个盒子几何体的延伸是(1,1,1),这使得它为2x2x2单位大。l 我们放置这个盒子在坐标(1,-1,1)上。l 我们给予它一个蓝色的固体材料。 Box box1 = new Box( new Vector3f(1,-1,1), 1,1,1); Geometry blue = new Geometry(Box, box1); Material mat1 = new Material(assetManager, Common/MatDefs/Misc/Unshaded.j3md); mat1.setColor(Color, ColorRGBA.Blue); blue.setMaterial(mat1);2. 我们创建了第二个盒子几何体。l 这个盒子几何体也是2x2x2单位大。l 我们放置这个盒子在坐标(1,3,1)上。它垂直在蓝色盒子的上边。它们之间的空隙为两个单位大。l 我们给予它一个红色的固体材料。 Box box2 = new Box( new Vector3f(1,3,1), 1,1,1); Geometry red = new Geometry(Box, box2); Material mat2 = new Material(assetManager, Common/MatDefs/Misc/Unshaded.j3md); mat2.setColor(Color, ColorRGBA.Red); red.setMaterial(mat2);3. 我们创建了一个节点。l 这个节点默认是放置在坐标(0,0,0)上。l 我们附加这个节点到根节点上。l 这个附加的节点在场景中是不可见的。 Node pivot = new Node(pivot); rootNode.attachChild(pivot); 4. 注意,我们还没有把两个盒子附加到任何东西上。l 如果我们这是运行应用程序,场景图中将不会出现任何东西。5. 我们附加两个盒子到节点上。l 如果我们这是运行应用程序,我们将会看到两个盒子:一个垂直在另一个上。 pivot.attachChild(blue); pivot.attachChild(red);6. 现在我们旋转这个节点。l 我们现在运行这个应用程序,我们看到两个盒子在彼此之上 - 并且都在相同的倾斜角度上。 pivot.rotate( 0.4f , 0.4f , 0.0f );发生了什么?我们附加两个盒子几何体到一个节点上。接着我们把这个节点作为手柄去抓取两个盒子,并且同时变换(旋转)它们,这是一个普通的任务,并且在你的游戏中当你移动游戏角色时你将用到这个方法。定义:几何体 VS 节点在你的场景图中你可以操纵两种类型的空间:节点和几何体。这是不同点:几何体节点可见性一个可见的3 - D对象一个”不可见“的手柄用途几何体存储对象的外貌特征一个节点由几何体和其它的节点组成例子一个盒子,一个球体,运动员,建筑,一块地形,车辆,导弹,NPC,等.默认的是根节点,用户界面节点(屏幕上的文字);地面节点,一个自定义的车辆和乘客节点,一个音频节点,等等.常见问题:如何填充场景图?任务?解决办法!创建一个空间创建一个形状,并给予它一个材料。以一个盒子为例:Box mesh = new Box(Vector3f.ZERO, 1, 1, 1);Geometry thing = new Geometry(thing, mesh);Material mat = new Material(assetManager, Common/MatDefs/Misc/ShowNormals.j3md);thing.setMaterial(mat);是一个对象出现在场景中附加空间到根节点上,或附加到绑定在根节点上的任意节点上。rootNode.attachChild(thing);从场景中移除对象从根节点上分离空间,或是从绑定在根节点上的节点上分离。rootNode.detachChild(thing);rootNode.detachAllChildren();在场景中通过对象的名字或ID找到对象看节点的孩子Spatial thing = rootNode.getChild(thing);Spatial twentythird = rootNode.getChild(22);起初,指定什么东西应该被载入在游戏的开始,你在simpleInitApp()方法中初始化和附加到根节点上的每一样东西都是场景中的一部分。如何变换对象呢?有三种类型的3D转换:转移(移动)、尺度(调整大小)、旋转(转动)。任务?解决办法!XYZ放置和移动对象转移:在三个方向上指定新的位置:左/右,上/下,前/后。示例1:移动对象到指定的坐标,如(0,40.2f,-2),用:thing.setLocalTranslation( new Vector3f( 0.0f, 40.2f, -2.0f ) );示例2:通过特定的距离移动对象,例如:向上(y=40.2f)和向后(z=-2.0f):thing.move( 0.0f, 40.2f, -2.0f );左/右上/下前/后调整对象大小尺度:为了调整空间大小,在各个方向指定调整的元素:长,高,宽。0.0f到1.0f之间的值将收缩对象;比1.0f大的值将是对象变大;并且1.0f将保持这个方向不变。各个方向用相同的值将成比例的调整对象的大小,用不同的值将伸缩对象。示例:使对象变成10倍长,1/10高,宽不变:thing.setLocalScale( 10.0f, 0.1f, 1.0f );thing.scale( 10.0f, 0.1f, 1.0f );长度高度宽度旋转对象旋转:3 - D旋转有一点复杂。简单说:你能从三个幅度旋转对象:倾角,偏移,转动。重要:你不能指定这个旋转在0到 360,只能在0.0f到6.28f旋转(FastMath.PI*2)!示例:在Z轴旋转对象180。thing.rotate( 0f , 0f , FastMath.PI );提示:如果你的游戏需要一系列旋转,查找一下四元数是值得的,一种能高效结合和保存旋转的数据结构。thing.setLocalRotation( new Quaternion(). fromAngleAxis(FastMath.PI/2, new Vector3f(1,0,0);倾角偏移转动如何解除节点?如果你得到了不希望的结果,检查一下是否你犯下了下边的普遍错误:问题?解决问题!被创建的几何体没有出现在场景中你附加它到(附加到根节点上的其它节点)根节点上了吗?它有材料了吗?它的位置是什么?它被其它几何体覆盖了吗?空间旋转错误你用的是旋转值而不是度数吗?你旋转的是你想要旋转的节点吗?你旋转的是正确的幅度吗?几何体出现了不希望的材料你重用其它几何体的材料和不故意改变它的属性了吗?结论你已经学习到3D世界是一个空间的场景图:可见的几何体和不可见的节点。你能变换空间,或者把它们附加到节点上,然后变换节点。 由于像球体和方体已经远远不能满足我们,继续下一章我们将学习载入资源,如3 - D模型。1.3 Hello Assets 在这个教程里,我们将学习用JME资源管理器把3D模型和文本载入到场景图中。你还将学习如何达到正确的路径和使用哪种文件格式。 在一个新的jMonkeyPlatform工程里,为了使用这个例子,右击你的工程选择“Properties”,进入到“Libraries”,点击“Add Library”,并且添加“jme3-test-data”库文件。示例代码package jme3test.helloworld;import com.jme3.app.SimpleApplication;import com.jme3.font.BitmapText;import com.jme3.light.DirectionalLight;import com.jme3.material.Material;import com.jme3.math.Vector3f;import com.jme3.scene.Geometry;import com.jme3.scene.Spatial;import com.jme3.scene.shape.Box;/* 示例3 - 怎么载入一个OBJ模型和OgreXML模型,材料,纹理,或文本。*/public class HelloAssets extends SimpleApplication public static void main(String args) HelloAssets app = new HelloAssets(); app.start(); Override public void simpleInitApp() Spatial teapot = assetManager.loadModel(Models/Teapot/Teapot.obj); Material mat_default = new Material( assetManager, Common/MatDefs/Misc/ShowNormals.j3md); teapot.setMaterial(mat_default); rootNode.attachChild(teapot); / 用test_data里的简单纹理创建一面墙 Box box = new Box(Vector3f.ZERO, 2.5f,2.5f,1.0f); Spatial wall = new Geometry(Box, box ); Material mat_brick = new Material( assetManager, Common/MatDefs/Misc/Unshaded.j3md); mat_brick.setTexture(ColorMap, assetManager.loadTexture(Textures/Terrain/BrickWall/BrickWall.jpg); wall.setMaterial(mat_brick); wall.setLocalTranslation(2.0f,-2.5f,0.0f); rootNode.attachChild(wall); / 用默认的字体显示一行文本 guiNode.detachAllChildren(); guiFont = assetManager.loadFont(Interface/Fonts/Default.fnt); BitmapText helloText = new BitmapText(guiFont, false); helloText.setSize(guiFont.getCharSet().getRenderedSize(); helloText.setText(Hello World); helloText.setLocalTranslation(300, helloText.getLineHeight(), 0); guiNode.attachChild(helloText); / 从test_data载入一个简单的模型(OgreXML + material + texture) Spatial ninja = assetManager.loadModel(Models/Ninja/Ninja.mesh.xml); ninja.scale(0.05f, 0.05f, 0.05f); ninja.rotate(0.0f, -3.0f, 0.0f); ninja.setLocalTranslation(0.0f, -5.0f, -2.0f); rootNode.attachChild(ninja); / 为了使这个模型可见你必须加一道光 DirectionalLight sun = new DirectionalLight(); sun.setDirection(new Vector3f(-0.1f, -0.7f, -1.0f); rootNode.addLight(sun); 编译和运行这段代码示例,你应该看到一个绿色的Ninja和一个多彩的茶壶站在墙的后边。在屏幕上显示的文本是“Hello World”。资源管理器JME顺便带了一个资源管理器,它可以帮助你管理资源结构。工程资源是媒体文件,例如模型,材料,纹理,场景,着色,声音,和字体。这个资源管理器有一个根,根包括类路径。因此它能从当前类路径(你工程的顶级路径)载入一些文件。除此之外,这个资源管理器能设置添加任何的路径到资源根下,因此资源能够从你制定的路径载入。在一个jMonkeyPlatform工程里,JME3会在你工程的assets路径下搜索模型。这是我们推荐的保存资源的路径结构:assets/Interface/assets/MatDefs/assets/Materials/assets/Models/assets/Scenes/assets/Shaders/assets/Sounds/assets/Textures/build.xmlsrc/.dist/.这些仅仅是普遍的用法,你也可以在资源目录下命名你喜欢的目录。载入纹理放置纹理到assets/Textures/子目录下,在你设置材料之前把纹理设置到材料里,下边的代码是来自simpleInitApp()方法:/ 用test_data里的简单纹理创建一面墙Box box = new Box(Vector3f.ZERO, 2.5f,2.5f,1.0f);Spatial wall = new Geometry(Box, box );Material mat_brick = new Material( assetManager, Common/MatDefs/Misc/Unshaded.j3md);mat_brick.setTexture(ColorMap, assetManager.loadTexture(Textures/Terrain/BrickWall/BrickWall.jpg);wall.setMaterial(mat_brick);wall.setLocalTranslation(2.0f,-2.5f,0.0f);rootNode.attachChild(wall);在大多数情况下,你用默认的材料描述,如“SimpleTextured.j3md”,在这个例子中我们是这样做的。高级用户可以创建自定义的材料。载入文本和字体这个例子在窗口的底部用默认的字体显示了“Hello World”,你附加这个文本到guiNode,guiNode是一种为了在平面(正交直线)显示元素的特殊节点。你可以通过分离它的所有孩子来清除存在于guiNode上的文本。下面的代码在simpleInitApp()方法中:/ 用默认的字体显示一行文本guiNode.detachAllChildren();guiFont = assetManager.loadFont(Interface/Fonts/Default.fnt);BitmapText helloText = new BitmapText(guiFont, false);helloText.setSize(guiFont.getCharSet().getRenderedSize();helloText.setText(Hello World);helloText.setLocalTranslation(300, helloText.getLineHeight(), 0);guiNode.attachChild(helloText);载入Ogre XML模型以OgreXML格式(.mesh.xml, .scene, .material, .skeleton.xml)导出你的模型,并把它放到assets/Models/子目录下。下面的代码在simpleInitApp()方法中:/ 从test_data载入一个简单的模型(OgreXML + material + texture)Spatial ninja = assetManager.loadModel(Models/Ninja/Ninja.mesh.xml); ninja.scale(0.05f, 0.05f, 0.05f); ninja.rotate(0.0f, -3.0f, 0.0f); ninja.setLocalTranslation(0.0f, -5.0f, -2.0f);rootNode.attachChild(ninja);/ 为了使这个模型可见你必须加一道光 DirectionalLight sun = new DirectionalLight(); sun.setDirection(new Vector3f(-0.1f, -0.7f, -1.0f);rootNode.addLight(sun);如果你是用jMonkeyPlatform默认设置编辑脚本的话,原始的OgreXML文件时不能包含在游戏中的。当你试着载入它们时,你将得到一条错误的信息。com.jme3.asset.DesktopAssetManager loadAssetWARNING: Cannot locate resource: Scenes/town/main.scenecom.jme3.app.Application handleErrorSEVERE: Uncaught exception thrown in ThreadLWJGL Renderer Thread,5,mainjava.lang.NullPointerException为了能够运行,你应该用.j3o格式的文件,使用jMonkeyPlatform的内容菜单把OgreXML模型转换为.j3o格式。从自定义路径载入资源如果你的游戏依赖于用户提供的模型文件,那么这些文件将不能包含在你的游戏中?如果一个文件没有放在默认的位置,你可以注册一个自定义定位器并且从任意路径载入文件。下边是一个Zip定位器惯例,它在你工程的顶级目录下注册了一个town.zip文件:assetManager.registerLocator(town.zip, ZipLocator.class.getName();Spatial scene = assetManager.loadModel(main.scene);rootNode.attachChild(scene);下边是一个HttpZip定位器,它能下载被压缩的模型:assetManager.registerLocator(/files/wildhouse.zip, HttpZipLocator.class.getName();Spatial scene = assetManager.loadModel(main.scene);rootNode.attachChild(scene);JME3提供了类路径定位器,Zip定位器,HttpZip定位器,文件定位器和Url定位器(看com.jme3.asset.plugins)。创建模型和场景 为了创建3D模型和场景,你需要一个带有OgreXML导出器插件的3D Mesh编辑器,如Blender。用UV textures创建你的模型。你可以用jMonkeyplatform从它们那载入模型和创建场景。导出你的带有材料的模型: 1. 打开菜单File Export OgreXML Exporter去打开导出对话框 2. 在导出材料区域:给予材料和模型相同的名字,例如,模型something.mesh.xml和something.material,加上something.skeleton.xml和一些JPG文件。 3. 在导出mesh区域:选择一个assets/Models/子目录,例如:assets/Models/something/。 4. 激活下面的导出器设置:l Copy Textures: YESl Rendering Materials: YESl Flip Axis: YESl Require Materials: YESl Skeleton name follows mesh: YES5. 点击导出文件格式:JME3能导入OgreXML模型,材料和场景,还有Wavefront OBJ+MTL模型。为了使游戏能够运行,你应该通过转换所有的模型变为JME3的.j3o格式使模型完美的载入。我们建议在jMonkeyplatform里创建你的模型,它包含一个.j3o转换器。 1. 在jMonkeyplatform里打开你的工程 2. 在Projects(或Favorites)窗口右击一个.mesh.xml文件,并且选择“convert to JME3 binary”。 3. .j3o以相同的名字挨着.mesh.xml出现 4. 如果你用jMonkeyplatform编辑脚本,mesh.xml文件和obj文件将被从执行JAR包中排除。如果你得到了一个运行异常,确保你已经把所有的模型转换为.j3o格式。载入模型和场景任务?解决问题!载入一个有材料的模型用资源管理器的loadModel()方法并把空间附加到根节点上Spatial elephant = assetManager.loadModel(Models/Elephant/Elephant.mesh.xml);rootNode.attachChild(elephant);Spatial elephant = assetManager.loadModel(Models/Elephant/Elephant.j3o);rootNode.attachChild(elephant);载入一个没有材料的模型如果你有一个没有材料的模型,你必须添加一个默认的材料使它可见。Spatial teapot = assetManager.loadModel(Models/Teapot/Teapot.obj);Material mat = new Material(assetManager, Common/MatDefs/Misc/ShowNormals.j3md);teapot.setMaterial(mat);rootNode.attachChild(teapot);载入一个场景载入场景和载入模型一样Spatial scene = assetManager.loadModel(Scenes/house/main.scene);rootNode.attachChild(scene);练习 - 怎么载入资源作为一个练习,让我们用不同的方法载入场景,你可以直接载入一个场景,或从Zip文件: 1. 下载town.zip文件 2. (可选择的:)解压这个town.zip看到包含Ogre场景的文件结构,你将得到一个名为town的目录,它包含XML和纹理文件,还有名为main.scene的文件(它是为你提供的信息,对于它你不需要做任何使)。 3. 放置town.zip文件到你的工程顶级目录,像这样:jMonkeyProjects/MyGameProject/assets/jMonkeyProjects/MyGameProject/build.xmljMonkeyProjects/MyGameProject/src/jMonkeyProjects/MyGameProject/town.zip.用下面的方法从Zip文件载入模型: 1. 确保town.zip在工程目录下。 2. 我们给工程目录注册一个zip文件定位器,这个loadModel()方法能够直接搜索zip文件,然后把文件导入。3. 添加下面的代码到simpleInitApp()下:assetManager.registerLocator(town.zip, ZipLocator.class.getName();Spatial gameLevel = assetManager.loadModel(main.scene);gameLevel.setLocalTranslation(0, -5.2f, 0);gameLevel.setLocalScale(2);rootNode.attachChild(gameLevel);4. 完成之后,编译和运行工程,你将看到Ninja,茶壶和墙出现在镇上。如果你注册新的定位器,确保你没有使任何文件名称冲突:给予每个场景一个独有的名称。在这个教程的前边,你从资源目录载入场景和模型。这是你载入场景和模型最普遍的方法。下面是典型的步骤:1. 从前边的练习中移走代码2. 移动被解压的town/目录到你的工程assets/Scenes/目录下。3. 添加下面的代码到simpleInitApp()下:Spatial gameLevel = assetManager.loadModel(Scenes/town/main.scene);gameLevel.setLocalTranslation(0, -5.2f, 0);gameLevel.setLocalScale(2);rootNode.attachChild(gameLevel);4. 注意这个路径是和assets/关联的5. 完成之后,编译和运行工程,你将看到Ninja,茶壶和墙出现在镇上。 下面是你必须知道的第三种方法,从.j3o文件载入场景和模型:1. 从前边的练习中移走代码2. 如果你还没有准备,打开jMonkeyplatform并且打开包含Hello Asset类的工程。3. 在工程窗口中,浏览assets/Scenes/town目录。4. 右击main.scene转换这个场景到二进制,这个jMonkeyplatform生成一个main.j3o文件。5. 添加下面的代码到simpleInitApp()下:Spatial gameLevel = assetManager.loadModel(Scenes/town/main.j3o);gameLevel.setLocalTranslation(0, -5.2f, 0);gameLevel.setLocalScale(2);rootNode.attachChild(gameLevel);6. 还要注意这个路径是和assets/关联的7. 完成之后,编译和运行工程,你将看到Ninja,茶壶和墙出现在镇上。载入Scenes/town/main.j3o和载入Scenes/town/main.scene有什么不同?开发阶段你能用*.scene和.xml文件工作:当你的设计师把更新的文件更新到资源目录
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 核心素养在中学教学中的应用
- 小升初英语写作50篇范文集锦
- 电力系统故障诊断技术流程文档
- 青春励志作文写作指导及范文
- 高校教学质量监控与评价方案
- 市级中考英语作文写作素材与技巧
- 企业社会责任报告撰写指南与案例分享
- 气动元件制造工节假日前安全考核试卷含答案
- 信息安全测试员国庆节后复工安全考核试卷含答案
- 甲醇装置操作工中秋节后复工安全考核试卷含答案
- 2025贵州毕节威宁自治县面向社会招聘城市社区工作者17人考试参考试题及答案解析
- 婴儿奶粉合同(标准版)
- 中医执业医师考试针灸推拿知识点试题及答案
- 先心病介入封堵治疗
- JJG 860-2015压力传感器(静态)
- GB/T 22231-2008颗粒物粒度分布/纤维长度和直径分布
- GB/T 18253-2000钢及钢产品检验文件的类型
- GB 5009.3-2016食品安全国家标准食品中水分的测定
- 液化气站安全生产目标考核与奖惩记录
- 高中生励志奋斗与梦想课件
- 《中职地理》配套教学课件
评论
0/150
提交评论