关于java:Java游戏编程之重要API

24次阅读

共计 5490 个字符,预计需要花费 14 分钟才能阅读完成。

java.awt 包的 Window 类

一个窗体对象是一个顶级 (top-level) 窗体,该窗体没有边框和菜单条;该窗体的默认的布局形式是 BorderLayout 形式。一个窗体对象必须领有一个 frame,或者 Dialog 或者另外一个窗体对象。窗体对象概念如下图所示:

在多屏幕环境中,咱们可这样的构造方法 Window(Window, GraphicsConfiguration)在不同的屏幕设施 (screen device) 中创立一个窗体对象。GraphicsConfiguration 对象示意的上指标屏幕设施。在一个虚构设施的多屏幕环境中,桌面区域能够跨多个物理屏幕设施,所有设施的边界是绝对于虚构设施坐标零碎的(参见上图)。虚构坐标零碎的原坐标要高于次要物理屏幕的左上角坐标。而后窗体依据虚构设施中的主屏幕的坐标来定位。

在这种环境下,当咱们呼叫一个 setLocation 办法时,必须给该办法传送一个虚构坐标值。同样,当咱们应用 getLocationOnScreen 办法,窗体对象会返回一个虚构设施的坐标值。当咱们呼叫 GraphicsConfiguration 类的 getBounds 办法时,咱们会虚构坐标零碎中的源点值。上面的代码是设置一个窗体在 (10,10) 地位,该地位绝对于物理屏幕的源点的地位。

如果 GraphicsConfiguration 的边界没有越界,那么该窗领会被设置为(10,10), 而该值是虚构坐标值,所以它会呈现次要物理屏幕中。

该坐标值不等于指定的 GraphicsConfiguration 对象的物理屏幕的值。示例代码如下:

Window w = new Window(Window owner, GraphicsConfiguration gc);
Rectangle bounds = gc.getBounds();
w.setLocation(10 + bounds.x, 10 + bounds.y);

留神:顶级窗体 (蕴含 Windows, Frames 和 Dialogs) 的地位和大小是由操作系统的桌面的窗体管理系统来管制的。也就是说,咱们呼叫 setLocation、setSize 和 setBounds 办法时,是咱们向视窗操作系统的窗体管理系统发送申请(当然是间接间接的)。

然而在某些状况下,窗体管理系统可能会疏忽这样的申请,或者批改这些几何申请,以便可能放到适合地位,从而可能靠近操作系统中桌面设置的要求。因为有操作系统本地的事件处理是异步的起因,所以 getBounds、getLocation、getSize 和 getLocationOnScreen 返回的后果可能不会是屏幕上 Window 的理论几何值,除非所有的申请都处理完毕了。这是因为窗体管理系统在解决这些子申请批改相应的申请数据所造成的。比方咱们可缩放利用窗体的大小,而相应的窗体管理系统会随时调整窗体的显示大小值。对于这样调整的后果,个别会产生多个 ComponentEvent 事件对象,以示意新的几何图形。Window 能够产生以下事件:

  • WindowOpen
  • WindowClosed
  • WindowGainedFocus
  • WindowLostFocus

该类创立自 JDK 1.0 版本。

java.awt 包的 Graphics2D 类

该类继承 Graphics 类,然而提供了更简单的管制、坐标转换、色彩治理和文本布局。该类是出现二维空间、文本和图片的根本类。

坐标空间—所有传送给 Graphics2D 对象的坐标都是在独立坐标零碎中指定的,该零碎叫做 User Space,该空间是由利用应用的。该类蕴含 AffineTransform 对象,用来出现状态的一部分,该类定义了怎么转换用户坐标为 Device Space 的设施依赖的坐标。

设施空间的坐标通常援用独立设施像素,而后在这些像素之间进行排序填充,以打消这些 gap 值。一些 Graphics2D 对象能够被用来捕捉出现操作,而后保留图形 metafile 文件,以便未知的物理设施上回放。因为这种解决方案不为人所,所以 Graphics2D 实现把用户坐标转换成虚拟空间坐标。每个 Graphics2D 对象都关联一个指标,该指标就是出现的中央。GraphicsConfiguration 对象定义了出现指标的个性,比方像素格局和解决方案。在 Graphics2D 对象生命周期中应用雷同的出现指标。当创立一个 Graphics2D 对象时,GraphicsConfiguration 指定一个默认的转换给 Graphics2D 对象的指标对象,比方 Component 或者 Image 对象。这个默认的转换隐射用户空坐标零碎到屏幕或者打印机设施的坐标零碎,其中 X 减少示意坐标程度右移,如果 Y 减少示意重直向下移。屏幕默认的转换单元是 72 dpi(像素值)。打印是每英寸 72 像素值。对于图形缓存,也应用雷同的转换单元。

出现处理过程—该过程被分为四个阶段,指标是由 Graphics2D 出现属性来管制的。出现器能够通过更多的步骤来优化,不论是缓存后果,以便于前面呼叫时应用,也能够把一个操作分解成多个虚构步骤。其出现处理过程如下:

  • 决定出现什么
  • 束缚出现操作到以后的 clip. 所谓 Clip 是在用户空间中通过一个 Shape 指定的,并且被程序所管制。程序应用 Graphics 和 Graphics2d 类的 clip 操作方法来出现。这种 user clip 通过 Transform 对象被转换到设施空间。设施空间应用 device clip 与 user clip 组成一个 composite clip 以最终决定最初的 clipping 区。User clip 不会被出现零碎的所批改,而只会被 composite clip 所隐射。
  • 决定什么色彩被出现
  • 依据 Graphics2D 上下文的以后的 Composite 属性,把色彩作用到指标绘制界面。

出现操作有三种,每种操作都本人的出现处理过程。

  • Shape operations (形态操作)
    如果操作是一个画 (shape) 操作,那么呼叫办法 createStokedShape 来构建一个新的形态对象,该对象蕴含指定 Shape 的形状。

    该形态从 user space 转换到 device space 的形态,转换时应用 Graphics2d 上下文的以后 Transform 对象。

    该形态的形状是应用 Shape 的办法 getPathIterator 抽取进去,该办法返回一个 PathIterator 对象,该对象依据 Shape 的边界进行迭代。

    如果 Graphics2D 对象不能解决 PathIterator 曲形段,而后呼叫 Shape 的 getPathIterator 办法。

    在 Graphics2D 上下文中以后 Paint 须要 PaintContext 对象,该上下文对象指定设施空间中的色彩出现

  • Text operations (文本操作)

    上面的步骤用来决定所需的字形 (glyph) 来出现指定的字符串:

    如果参照是一个字符串,那么在 Graphics2D 上下文中的以后 Font 对象被要求转换字符串的 Unicode 字符为一组字形,以便与根本布局和字符实现的形态算法起出现具体的字形。

    如果参见是一个 AttributedCharacterIterator 对象,那么该迭代器对象会被要求转换它本人到 TextLayout 对象,转换时应用它内置的字体属性。TextLayout 对象实现了简单的字形布局算法,该算法应用 Unicode 双向布局主动调整多种字体。

    如果参见是 GlyphVector 对象,那么该对象曾经蕴含了相应的指定字体字形代码,该代码有每个字形的地位坐标值。

    以后 Font 对象须要获取指定字形的形状,这些形状在 user space 中被看成形态。

    依据以上的 Shape 操作,字符形状被填充到指定的字形上

    在 PaintContext 对象中呼叫以后的 Paint 对象,以便指定 device space 中的色彩来出现。

  • Image Operations (图形)
    源 Image 的 bounding box 定义了交加区域,在 Image Space 中该 bounding box 是被指定的,也就是 Image 对象的本地坐标零碎
    如果 AffineTransform 被传送到 drawImage 办法,AffineTransform 对象被用来从 image space 转换到 user space 中去。如果没有 AffineTransform 对象,那么 bounding box 被认为曾经存在于 user space 中了。
    而后源 Image 的 bounding box 从 user space 转换到 device space 中去,转换时应用以后的 Transform 对象。留神,在 device space 的矩形区域中是不会有转换动作的。
    Image 对象决定哪种颜色被出现,而后依据源和目标坐标隐射到指定的以后的 Transform 对象中去,以及优化的 image 转换。

Default Rendering Attributes—Graphics2D 出现属性默认值:

  • Paint—Component 的色彩 Font—Component 的字体
  • Stoke—一个方形的笔
  • Transform—Component 的 GraphicsConfiguration 对象的 getDefaultTransform 办法的返回对象
  • Composite—示意 AlphaComposite.SRC_OVER 规定 Clip—没有出现 Clip 时,那么是该 Component 的输入的 clip 值。

出现兼容性问题—JDK 1.1 出现模型是基于像素模型,该模型指定坐标是无穷小的,也就是像素之间的填充。绘制操作是应用一个像素宽度的笔来绘制实现的,该笔填一个一个依据绘制门路填充像素到一个指定的锚点。JDK 1.1 出现模式是由大多数现有被平台用来出现的类组成,这些类须要把整数坐标转换成离散的笔来实现指定的像素。Java 2D API 反对拒锯齿出现技术,一只笔应用一个像素不能齐全反对 N 和 N + 1 的落差景象,所以如果设置的抗锯齿性能,那么出现器会决定应用哪个

像素来填补两个像素之间的落差。Java 2D API 保护 JDK 出现行为的兼容性问题,比方原有的 legacy 操作和已存的出现行为不会在 Java 2D API 中批改。Legacy 办法隐射既定了的通用的绘制和填充办法,这些办法分明的标识了 Graphics2D 怎么继承 Graphic 基类,该类基于 Stroke 和 Transform 属性。无限的执行步骤是默认的属性设施,比方默认的 Stroke 是 BasicStroke 类,它是一个 1 值没有虚线,并且默认提 Transform 给屏幕绘制的惟一传输对象。

上面是锯齿和反锯齿预出现行为规定:

  • 设施坐标被定义到 device 像素之间,以防止产生锯齿的反锯齿出现的不一致性。如果坐标被定义在一个像素的两头,那么该像素的一些局部会被一个形态所笼罩,比方矩形只有一半被笼罩。当应用锯齿出现时,笼罩一半的像素能够 shape 的外部或者内部。当应用抗锯齿出现时,整个 shape 的边界像素会有一半被笼罩。另一方面,因为坐标在像素之间被定义,所以一个 shape 像矩形不会有一半被笼罩,不论它是否被应用抗锯齿出现。Line 和门路应用 BasicStoke 对象能够被“normalized”(标准化)之后,能够提供 outline 的出现一致性,标准化 (normalization) 过程是通过 KEY_STROKE_CONTROL 来管制。而形象标准化算法不是指定的,然而它的指标是确保 line 是可视化的一致性。
    下列是所有 legacy 办法是基于默认的属性设置:
    填充操作,包含 fillRect, fillRoundRect, fillOval, fillArc, fillPolygon 和 clearRect. 比方
    fill(new Rectangle(x, y, w, h));
  • 同样绘制操作,包含 drawLine, drawRect, drawRoundRect, drawOval, drawArc, drawPolyline 和 drawPolygon. draw(new Rectangle(x, y, w, h));
  • 办法 draw3DRect 和 fill3DRect 办法实现了 Graphics 类的 drawLine 和 fillRect 办法。这些办法预约义了它们的行为,定义时是依据 Graphics2D 上下文中的以后 Stroke 和 Paint 对象的来确定的。它重写了以后 Paint 对象,并且应用 fillRect 来形容雷同的形象行为。Graphics 类只定义了 setColor 办法来管制喷绘的色彩。而在 Java 2D API 包中扩大了 Color 对象的,并且实现了新的 Paint 接口,现存的 setColor 办法是为了不便设置以后 Paint 属性的到一个 Color 对象,setColor 办法等同 setPaint 办法。其中类 Graphics 定义了两个办法来管制色彩怎么被利用到指标中去。

setPaintMode 办法实现设置默认的组件,等同于 setComposite (new AlphaComposite)办法
setXORMode(Color xorColor) 办法用来不便设置一个特定的 Composite 对象,而疏忽 Alpha 源色彩

组件和设置指标色彩为值:

dstpixel = (PixelOf(scrColor) ^ PixelOf(xorColor) ^ dstpixel);

总结

Java 给咱们第三方程序提供了大量的 API 来不便开发,因而,当咱们应用 Java 编程开发时,必然有一个默认习惯:依据本人的开发技术需要,先认真看 API 能够给咱们提供什么,并且认真浏览这些 API 的性能形容。
图片起源:http://www.cungun.com/ 游戏

正文完
 0