网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > JAVA > 核心技术 > 高级编程 > Java游戏编程杀手:3D跳棋游戏  

Java游戏编程杀手:3D跳棋游戏

2006-02-21  作者:BitsCN整理  来源:中国网管联盟  点评 投稿 收藏

  这章用一个Java 3D例子来描述一个3D跳棋。这个例子建立了一个场景,包括:由一个暗绿色和兰色格相交平铺的,并带有标签的X轴和Z轴形成的平面;一个兰色背景;一个可以在两个不同方向浮动的球体。用户可以通过鼠标来浏览(拉近放远)场景。左边的截图15-1显示最初视图,右边的图是用户视图移动一些之后的效果。

网管u家u.bitsCN.com


  Figure 15-1. Initial view, and later

  3D跳棋阐述了Java 3D编程中一些常用的方法和一些小窍门。例如,3D场景使用Canvas3D类来实现显示(这个类和Swing组件结合使用)。所有的Java 3D程序需要一个场景图,3D跳棋说明了如何增加基本图形,灯光,背景。这些场景图形成了文件的可视形式,记录这些场景信息的文本版本通过Daniel Selman的Java3dTree包很容易就能实现。(在这节的最后我会详细介绍)

  地板和球体使用了Java3D的QuadArray, Text2D, and Sphere几何类:地板是由QuadArray的一系列四边形组成,标签是用Text2D对象沿着地板上的主轴形成。用户通过一个观察点查看这个3D世界,你将看到如何初始放置观察点、在使用Java3D的OrbitBehavior 类时候如何移动观察点。

  3D跳棋类图

  图15-2的类图说明了3D跳棋程序的public和private数据项和方法。

网管u家u.bitscn@com


  Figure 15-2. Class diagrams for Checkers3D

  Checkers3D 是程序的顶层JFrame . WrapCheckers3D 是场景图拥有的 JPanel ,作为一个Canvas3D 对象,他是可视的. CheckerFloor 建立地板的子图(例如方格,轴), with所有同颜色的方格用单独的ColoredTiles 对象表示。

  提示:例子的原代码在Checkers3D/目录(可能是原书附带光盘)

  Java 3D和Swing 的结合

  就向Swing文本和按纽,Checkers3D 是GUI控制位置的的一个 JFrame ,把他放在必要的地方。在这个例子中,他建立一个WrapCheckers3D (一个 JPanel) 实例,并把他放在 BorderLayout 中间。
    c.setLayout( new BorderLayout( ) );
    WrapCheckers3D w3d = new WrapCheckers3D( );   // panel for 3D canvas
    c.add(w3d, BorderLayout.CENTER);
网管u家u.bitscn@com


  场景中的Canvas3D 视图建立在WrapCheckers3D 类里。
    public WrapCheckers3D( )
    {
      setLayout( new BorderLayout( ) );
      // other initialization code

      GraphicsConfiguration config =
                 SimpleUniverse.getPreferredConfiguration( );
      Canvas3D canvas3D = new Canvas3D(config);
      add(\"Center\", canvas3D);

      // other initialization code}
网管联盟bitsCN_com

  虽然 Canvas3D 是一个重量级的GUI 元素(一个系统产生窗口的轻量层),还是有一些必须注意的。重量级的组件没那么容易与Swing控件组合(Swing是一个轻量组件),这些控件主要由Java产生。如果 Canvas3D 对象内嵌到一个 JPanel问题就可以消除,并且建立出来的panel可以安全地和Swing程序的其他部分结合。
  提示: 这是在j3d.org的一个关于结合 Canvas3D 和Swing的详细讨论:(http://www.j3d.org/tutorials/quick_fix/swing.html).

  相比前几章,这里没有update/draw循环。因为Java 3D自身有机制来监视场景和最初视图的变化。下面以伪代码给出算法:

    while(true) {
      process user input; //用户输入
      if (exit request) break;
      perform behaviors;  
      if (scene graph has changed)  //场景改变
        traverse scene graph and render;  //移动场景视图

网管网www.bitscn.com


    }

网管bitscn_com



  其中的behaviors是一些影响其他部分图象的代码,比如移动的图形或改变灯光。他们用来监视图象,传递给程序中非3D部分详情。详细代码比例子中的伪代码更加复杂,Java 3D用多线程来并发移动和图形描述。因此,对这个过程有一个概括了解会对本章其他部分的理解有帮助。

  场景图形建立

  场景图形用 WrapCheckers3D的构造函数建立。


    public WrapCheckers3D( )
    {
      // initialization code

      GraphicsConfiguration config =
                 SimpleUniverse.getPreferredConfiguration( );
      Canvas3D canvas3D = new Canvas3D(config);
      add(\"Center\", canvas3D);
      canvas3D.setFocusable(true);     // give focus to the canvas 网管网www_bitscn_com
      canvas3D.requestFocus( );

      su = new SimpleUniverse(canvas3D);

    
      createSceneGraph( );
      initUserPosition( );        // set user's viewpoint
      orbitControls(canvas3D);   // controls for moving the viewpoint

      su.addBranchGraph( sceneBG );
    }

网管u家u.bitscn@com



  Canvas3D 对象用从getPreferredConfiguration( );获得的配置来初始化。这个方法能取得硬件的图形信息。一些老的Java 3D程序没有初始化一个GraphicsConfiguration 对象,而是用null作为 Canvas3D 的构造函数的参数,这种编程可不太好。canvas3D 被设置成焦点,以便键盘能传递动作给场景图形。这些动作的触发通常是按键的按压和弹起,但是他们也能由定时器、帧的改变和由Java 3D内部产生的事件触发。 Checkers3D就不需要设置焦点,因为他没有任何动作。因为在所有的其他程序中我们都会考虑到线条,所以我没有给出线条的描绘代码。

  su SimpleUniverse 对象建立了标准子视图、场景图形的VirtualUniverse 和Locale 节点。
createSceneGraph( ) 设置了灯光,天空的背景,地板,还有浮动球体。initUserPosition( ) 和 orbitControls( ) 处理用户视角问题。最后把配置好的 BranchGroup 加入到方法:

    private void createSceneGraph( )
    {
      sceneBG = new BranchGroup( );
      bounds = new BoundingSphere(new Point3d(0,0,0), BOUNDSIZE);
网管网www.bitscn.com



      lightScene( );         // add the lights
      addBackground( );      // add the sky
      sceneBG.addChild( new CheckerFloor( ).getBG( ) );  // add floor

      floatingSphere( );     // add the floating sphere

      sceneBG.compile( );   // fix the scene
    } // end of createSceneGraph( )
网管u家u.bitsCN.com


  使用不同的方法来增加子图到 sceneBG以建立需要的子视图。一旦图形被绘制完毕后,并允许Java3D来优化他,sceneBG 便只被编译一次。优化包括重排图形、重新组合编译节点。例如一连串的包含不同转换的TransformGroup 节点会被编译成一个独立节点。另一个可能的优化是把具有相同显示属性的图形编成组,以便能更快地描绘。

  bounds是一个 BoundingSphere 类的全局实例,他用来指定环境节点对灯光、背景和OrbitBehavior 对象的影响。跳跃的球体被放在场景的中心,被赋 BOUNDSIZE 单位半径,并影响场景中所有事件。

  最后的 WrapCheckers3D( ) 所显示的场景图象在图15-3中。\"Floor Branch\" 节点是我发明出来掩藏一些细节,稍后将会涉及。图15-3所缺少的是场景图形的分支部分。

  场景灯光

  通过 lightScene( ).把一个环境灯光、两个有向灯光加入到场景中。环境灯光能到达场景中的每个角落,并且强度相同。

    Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
    // Set up the ambient light
    AmbientLight ambientLightNode = new AmbientLight(white);
网管下载dl.bitscn.com

    ambientLightNode.setInfluencingBounds(bounds);
    sceneBG.addChild(ambientLightNode);

网管u家u.bitscn@com

  代码设置了灯光的颜色,环境灯光以bounds配置建立,并加入到场景中。类 Color3f( ) 的构造函数设置RGB颜色为0.0f到1.0f(1.0f是全色)。

  有向灯光模拟的一个从原处照射来的一束灯光,并从特定方向碰上物体表面。有向灯光和环境灯光的区别是有向灯光必须是方向向量。

    Vector3f light1Direction  = new Vector3f(-1.0f, -1.0f, -1.0f);
       // left, down, backwards
    DirectionalLight light1 =  new DirectionalLight(white, light1Direction);
    light1.setInfluencingBounds(bounds);
    sceneBG.addChild(light1);
网管网www_bitscn_com

网管论坛bbs_bitsCN_com


  Figure 15-3. Partial scene graph for Checkers3D

  方向是介于(0,0,0)和(-1,-1,-1)的向量。灯光可以想象成是很多从不同方向,不同来源的平行灯光汇聚而成。点光和场光是Java 3D灯光的另外一种形式。点光放置在空间中,并向所有方向发射。场光以特定方向朝点光聚焦。

  场景的背景

  场景的背景可以指定为特定的背景(如下所示),一个静态图像或这是一个带形体的几何材质。

    Background back = new Background( );
    back.setApplicationBounds( bounds );
    back.setColor(0.17f, 0.65f, 0.92f);    // sky color
    sceneBG.addChild( back );

  浮动的球体

  Sphere 是来自Java 3D的 com.sun.j3d.utils.geometry 包的一个工具类,是Primitive 类的一个子类,Primitive 类为带有 Shape3D 孩子节点的一个 Group 节点。他的几何特性存储在Java 3D的 TriangleStripArray,这种类把球体看成一组可连接的三角形体。我没必要校准他的几何特性,但是他的现实和位置要改变。

网管联盟bitsCN_com



  Appearance 节点是一个包含很多信息的容器,包含颜色、线条、点、多边形、描绘、透明度和材质特性。ColouringAttributes 确定形体的颜色,而且不受场景灯光影响。如果一个形体需要颜色和灯光的交互作用,就要用到 Material 组件。灯光要影响形体的颜色必须满足三种情况:
  •        形体的几何特性必须是标准的。
  •        形体的 Appearance 节点必须拥有 Material 组件。
  •        Material 必须用 setLightingEnable( )打开他的光照允许。

  用工具类 Sphere 能自动制作成标准形体,所以第一种情况容易满足。

  形体颜色

  Java 3D Material 组件控制当一个形体被不同种类的灯光照射后的颜色。

    Material mat = new Material(ambientColor, emissiveColor,
                                diffuseColor, specularColor, shininess); 网管下载dl.bitscn.com
  环境颜色参数指定当形体被环境灯光照射后的颜色:他给对象统一的颜色。放射性颜色贡献形体生成的颜色。这个参数经常被设置成黑色(相当于关闭)。当照射的时候,发散颜色就是对象的颜色,他的强度取决于光波照射到形体的角度。

  提示:发散灯光和环境灯光通常被设置成相同,这与真实世界中的对象被照射时候的颜色一样。

  镜子颜色参数的强度与从形体的光亮区域反射出的多少有关。他由控制reflective highlight尺寸的发光参数组合成。

  提示:镜子颜色通常设置成白色,符合真实世界中大部分对象产生的颜色。

  Checkers3D类中,有两个不同方向的光,他们在球体顶部建立了两个不同的光路(如图15-1)。地板在他们的颜色未在形体的几何特性中设置前,是没有被照射到的。

  floatingSphere( ) 中处理形体现实的代码如下:

  Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
    Color3f blue = new Color3f(0.3f, 0.3f, 0.8f);
    Color3f specular = new Color3f(0.9f, 0.9f, 0.9f); // near white

    Material blueMat= new Material(blue, black, blue, specular, 25.0f); 中国网管联盟bitsCN.com
    blueMat.setLightingEnable(true);

    Appearance blueApp = new Appearance( );
    blueApp.setMaterial(blueMat);

网管联盟bitsCN_com

  布置形体

  形体放置一般是在TransformGroup 下放置图形节点。(参见图15-3 sphere Group)。一个 TransformGroup 用来放置、旋转和度量旗下节点。他由Java 3D Transform3D 对象定义其格式。

    Transform3D t3d = new Transform3D( );
    t3d.set( new Vector3f(0,4,0));     // place at (0,4,0)
    TransformGroup tg = new TransformGroup(t3d);
    tg.addChild(new Sphere(2.0f, blueApp));
           // set the sphere's radius and appearance
           // and its normals by default
    sceneBG.addChild(tg); 网管下载dl.bitscn.com

  set( ) 方法将形体的中心放置在(0.4.0),重置先前的旋转和度量。在重置其他格式的时候,set( ) 能用来改变度量和角度。方法setTranslation( ), setScale( )和setRotation( ) 只能对已给格式起作用。

  与其他3D画图程序包不同的是,Java 3D中的Y轴是垂直方向,而水平面由xoz决定,如图15-4。球体的位置被设置为(0,4,0),在XOZ面中心上方4个单位。

中国网管论坛bbs.bitsCN.com


  图15-4,Java 3D中的坐标系

  完,请等待Part 2... 网管u家u.bitsCN.com

  版权声明:任何获得Matrix授权的网站,转载时请务必保留以下作者信息和链接
  原文:http://www.javaworld.com/
  译文:http://www.matrix.org.cn/ 网管联盟bitsCN_com


TAGs游戏   编程   杀手   场景   灯光   颜色   形体   Java3D   对象    
 上一篇:改善Java企业级应用的可用性   下一篇:JAVA 正则表达式4种常用的功能
相关文章列表
Java游戏编程杀手:3D跳棋游戏 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
1.用java编写的小游戏源代码分析
2.在.Net程序中使用log4net记录日志
3.Java与sqlserver2000的连接
4.Java源代码案例--骑士巡游问题
5.Java游戏编程分析--棋子的拖动
6.JAVA 正则表达式4种常用的功能
7.Log4j的使用总结!(用于收藏救急用)
8.JFreeChart中柱状图的详细设置
9.学习教程:Java Annotation 高
10.JAVA对象转为Java String的几种常用方法
最新推荐文章:
1.该如何实践State模式
2.JFreeChart中柱状图的详细设置
3.Java Swing APIs可插拔式外观风格特性应
4.用信号量Semaphore实现互斥锁Mutex
5.使用Weblogic Integration的应用程序架构
6.设计Java应用程序
7.对Java嵌套类的讨论(上)
8.提高Java代码可重用性的三个措施
9.JAVA上加密算法的实现用例
10.总结篇:将内部类进行到底
网管论坛交流:
·不疯魔不成活
·令你大开眼界的真正标准化机房,已整理重
·为赈灾,女孩舍身拍“裸照”
·Windows Server 2003服务器群集创建和配
·exchange2k3全套官方资料
·双儿一周岁了。。。特殊的礼物来啦。。
·存储备份技术版块守则
·无盘技术交流区守则
·DOS命令基础大全之命令详解<作者吐血
·Windows XP 操作系统默认设置需要注意的