3) 一个线程执行其代码是与其他线程独立开来的。如果诸线程之间又相互协作的话,就必须采用一定的交互机制。
4)线程是共享地址空间的,如果控制不当,这里很有可能出现死锁。 各线程之间是相互独立的,那么本地变量对一个线程而言就是完全独立,私有的。所以呢,线程执行时,每个线程都有各自的本地变量拷贝。对象变量(instance variable)在线程之间是可以共享的,这也就是为什么在Java中共享数据对象是如此的好用,但是Java线程不能够武断地访问对象变量:他们是需要访问数据对象的权限的。
实例5[1]:
某游戏中利用多线程技术消除闪烁 public void init() {
currentImage = 0; //指定目前图像为第一张图像 Animation = new Image[8]; //与使用八张动画图像 MT = new MediaTracker(this);
for(int i=0;i<8;i++) //注意此循环中的程序代码 { Animation[i]
= getImage(getDocumentBase(),”Images/Freedom” + (i+1) + “.gif”);
MT.addImage(Animation[i],0); } try {
showStatus(“图像加载中...”); //在状态列显示信息 MT.waitForAll(); //等待所有图像下载 }
18
catch(InterruptedException E) //若捕捉到例外 {
try //建立错误页面的URL {
ErrorHTML = new URL(getCodeBase().toString() + “ErrorHTML.html”); }
catch(MalformedURLException ME){ }
getAppletContext().showDocument(ErrorHTML); //转移页面 } }
public void start() //start()函数 {
//建立与启动新线程
newThread = new Thread(this); newThread.start(); }
public void stop() //stop()函数 {
newThread = null; //将线程设为null }
public void paint(Graphics g) //已将差劲的动画循环抽离 {
//绘制目前图像
g.drawImage(Animation[currentImage],50,10,250,250,this); }
public void run() {
19
while(newThread != null) {
repaint(); //重新绘制图像 try {
Thread.sleep(125); //暂停程序执行125毫秒 } {
ErrorHTML = new URL(getCodeBase().toString() + “ErrorHTML.html”); }
catch(MalformedURLException ME){ }
getAppletContext().showDocument(ErrorHTML); //转移页面 }
if(currentImage == 7) //如果已经播放到最后一张图像
currentImage = 0; //指定目前图像为第一张图像
else
currentImage = currentImage + 1; //指定图像为下一张图像 } }
20
3.5 Java 2D技术的应用
Java 2D API是JFC (Java Fundation Classes)的一员,加强了传统AWT( Abstract Windowing Toolkit )的描绘功能。在JDK1.2中已经支援Java 2D的使用。透过Java 2D API ,Programmer可以轻松地描绘出任意的几何图形、运用不同的填色效果、对图形做旋转( rotate)、缩放( scale)、扭曲(shear)等。如图一所示,Programmer透过2D API所提供的功能,简单地利用不同类型的线或是填色效果绘出统计图,以区分出不同的资料。当然, 2D API还有许多增强AWT能力的部分,像是处理影像档案可以有不同的滤镜(filter)效果、对於任意的几何图形亦能做碰撞侦测(hit detection)、图形重叠混色计算(composite)等功能。文中将会对这些技术做概略性地介绍。 Java 2D API Packages
JDK1.2中关於2D API的Packages如下所述[15]: Java.awt
Java.awt包含了一些新增的2D API类别(classes)和介面(interfaces )。其中Graphics2D继承自 Java.awt.Graphics ,是描绘2D图形的物件(object)。如同前版本的JDK所使用的绘图模式一样,当有物件 要被描绘时,paint或是update method会自动根据适当的Graphics Context来做绘图的工作。所谓的Graphics Context是与Graphics Object相关状态属性(state attribute)的集合。在Graphics2D中新增了许多状态属性,像是Stroke、 Paint、Clip、 Transform等。 Java.awt.geom
Java.awt.geom则包含可以勾勒任何形状的GeneralPath类别。它可以由许多不同种类的subpath构成,像是lines和quadratic curves等。为了兼顾方便性,此package中更定义了许多基本几何图形,包括Arc2D 、CubicCurve2D、Line2D等。这些类别都有两种型态,分别是Float precision Doubleprecision。此外,还有一种特别的图形类别:Area,它支援Constructive Area Geometry(CGA)。CGA是对既有图形物件做布林运算(Boolean Operation)而产生新图形物件的过程。如图二所示, Areas支援联集( union)、交集(intersection)、差集(subtraction )、Exclusive OR (XOR)等布林运算。最后,
21
AffineTransform类别则提供图形物件做Scale、Shear 、Rotate等座标上的转换。
Java.awt.font
Java.awt.font中定义了TextLayout类别,负责建构text shape、执行适当的text operations,如碰撞侦测与打光 (highlighting)等,以及决定text的适当位置与顺序。 Java.awt.image
Java 2D API支援三种影像模式。包括producer/consumer (push) model、 immediatemode model和 pipeine(pull) model。Push model在前版本的JDK中支援。而Pull model则在即将出现的Java Advanced Imaging AP中会支援。於此,我们只探讨JDK1.2中出现的Immediate mode imaging model。在此model下,Programmer可以透过2D API对image data( BufferedImage or Raster)做滤镜的效果。在Package Java.awt.image中,immediate mode imaging APIs可以被归为六大类: interfaces、image data classes、 image operation classes、sample model classes、 color model classes和 exceptions。其中operation classes即定义了许多filter ,包括了AffinTransformOp BandCombineOp、 ColorConvertOp、 ConvolveOp、 LookupOp、 RescaleOp等。透过以上所提之滤镜,可以做到 geometrically transform、blur、 sharpen、enhance contrast、 threshold和color correct images等效果。如图三所示,source image经过filter,产生出新的图形。 Java.awt.color
Package Java.awt.color定义了class ColorSpace。此class提供Programmer转换色盘的method。 Java.awt.print
Java Printing API提供Programmer列印AWT和Java 2Dgraphics的method。并可让User设定print的属性,如双面列印等。
实例6[1]:
利用Java 2D技术对图像进行处理
22
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库万鹏 2005911037 java技术在游戏开发的应用(5)在线全文阅读。
相关推荐: