canvas教程

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

字号+ 作者:H5之家 来源:H5之家 2017-08-23 16:00 我要评论( )

文章标题:Java游戏编程杀手:3D跳棋游戏。希赛网JAVA频道是一个专业的JAVA技术平台,着眼于业界尖端技术,提供及时全面的JAVA技术和资讯文章,为广大的JAVA爱好

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

  


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数据项和方法。

  


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);



  场景中的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}


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

  相比前几章,这里没有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;  //移动场景视图
    }



  其中的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
      canvas3D.requestFocus( );

      su = new SimpleUniverse(canvas3D);

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

      su.addBranchGraph( sceneBG );
    }



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

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

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • webgl下经常崩溃,canvas下mesh又用不了

    webgl下经常崩溃,canvas下mesh又用不了

    2017-08-23 13:03

  • bboyjoe的博客

    bboyjoe的博客

    2017-08-21 13:00

  • [游戏软件开发基础]学习游戏软件开发需要哪些基础

    [游戏软件开发基础]学习游戏软件开发需要哪些基础

    2017-08-18 16:00

  • Python实现的弹球小游戏示例

    Python实现的弹球小游戏示例

    2017-08-17 15:02

网友点评
e