第11章-Java游戏开发基础

举报
资源描述
第第11章章 Java游戏开发基础游戏开发基础本章学习目标l理解java2D图形图像绘制方法。l理解图形图像坐标变换的技术。l掌握动画生成技术。l掌握动画闪烁消除技术。11.1概述lJava是一种具有丰富功能的编程语言,它的跨平台性、安全性、健壮性、支持分布式网络应用、以及面向对象特性都非常适合游戏开发。11.2绘制2D图形图像 l一款游戏能否激起人们的兴趣并在游戏上付出时间,游戏的画面是否吸引人是关键因素之一。lJava提供了丰富的类库来帮助绘制合适的文本和图形图像,这些类库多数都包含在了java.awt、java.awt.image、java.awt.geom和javax包中。11.2.1 坐标体系坐标体系 l显示器由许多微小的像素组成,每个像素就是一个带有颜色的光点,屏幕水平和垂直方向的像素数就称为屏幕的分辨率。l把屏幕的左上角当做坐标原点,并把向右向下当做坐标的正向增长。位置坐标可以用(x,y)表示,其中x表示水平方向距离原点的像素数,y表示垂直方向距离原点的像素数。lJava的一些容器组件,比如Window、Panel、Frame、JFrame、Applet,在其上绘制文本与图形图像时用到的位置坐标,也是以组件的左上角为原点,以像素为长度单位。11.2.1 坐标体系坐标体系 11.2.2 绘制图形绘制图形 ljava中通过java.awt包中的Graphics类绘制图形图像,这个工具在绘图时存在一定的局限性,比如不能旋转图形。l在javaSE1.2版本中引入了java2D类库,这些类库基本都包含在java.awt包和java.awt.geom包中,比如Point2D、Line2D、Rectangle2D、Ellipse2D。l想要绘制这些图形必须通过Graphics2D类的对象,Graphics2D是Graphics类的子类,Frame、Applet等的paint或paintComponent方法自动接收到Graphics2D类的对象。11.2.2 绘制图形绘制图形 l在需要Graphics2D类的方法时,直接类型转换为Graphics2D类型即可:paint(Graphicsg)Graphics2Dg2d=(Graphics2D)g;g2d.xxxx();11.2.2 绘制图形绘制图形 lGraphics2D对象的draw和fill方法绘制图形和填充图形,两个方法都以Shape接口类型作为参数,根据java的多态特性,任何一个实现了Shape接口的类型都可以作为draw和fill的参数,例如:Rectangle2Drectangle=new.;g2d.draw(rectangle);11.2.2 绘制图形绘制图形 ljava2D类库为图形类提供了两个版本,一个具有float类型坐标,一个具有double类型坐标。l比如Rectangle2D类,只是一个抽象类,它具有两个静态内部子类:Rectangle.Float、Rectangle.Double。l创建单精度和双精度坐标的矩形时可以提供矩形左上角水平和垂直坐标以及矩形的宽度和高度:11.2.2 绘制图形绘制图形 Rectangle2Drectf=newRectangle2D.Float(40,60,200,100);g2d.draw(rectf);Rectangle2Drectd=newRectangle2D.Double(40,180,200,100);g2d.draw(rectd);11.2.2 绘制图形绘制图形【例11-1】DrawShapeTest.java【例11-1】DrawShapeTest.javapublicclassDrawShapeTestextendsJFramepublicvoidpaint(Graphicsg)Graphics2Dg2d=(Graphics2D)g;Rectangle2Drect=newRectangle2D.Double(40,60,200,100);g2d.draw(rect);Line2Dline=newLine2D.Double(40,60,240,160);g2d.draw(line);Ellipse2Dellipse=newEllipse2D.Double(40,60,200,100);g2d.draw(ellipse);11.2.3 绘制图像绘制图像 l有三种方式将图像读取到程序中,读取之后通过Graphics2D的drawImage()方法将图像绘制到屏幕窗口中。l第一种方式,借助于java.awt包中Tookit类的getImage()方法,它返回Image类型的对象,Image对象里面包含了图像数据和图像的宽度、高度等信息,使用Toolkit类读取图像的一般方式为:11.2.3 绘制图像绘制图像 Stringfilename=“”;Toolkittk=Toolkit.getDefaultToolkit();Imageimage=tk.getImage(filename);while(image.getWidth(observer)=0);循环是为了等待图像被完整读取。11.2.3 绘制图像绘制图像 l第二种方式,借助于javax.swing包中ImageIcon类的getImage()方法,它也是返回Image类型的对象,并且等待图像完全读取之后返回,使用ImageIcon类读取图像的一般方式为:Stringfilename=“”;ImageIconicon=newImageIcon(filename);Imageimage=icon.getImage();11.2.3 绘制图像绘制图像 l第三种方式,借助于javax.imageio包中的ImageIO类的read()方法,它仍是返回Image类型的对象,并且等待图像完全读取之后返回:Stringfilename=“”;Imageimage=ImageIO.read(newFile(filename);或者提供文件的URL:Stringurlname=“”;Imageimage=ImageIO.read(newURL(url);11.2.3 绘制图像绘制图像 lbooleandrawImage(Imageimg,intx,inty,ImageObserverobserver)l显示未经缩放的图像,方法有可能在图像绘制完成前返回;l参数:img被显示的图像x图像左上角的x坐标y图像左上角的y坐标observer更新图像信息的对象,可以是null11.2.3 绘制图像绘制图像 lbooleandrawImage(Imageimg,intx,inty,intwidth,intheight,ImageObserverobserver)l显示缩放过的图像,在宽为width、高为height的区域缩放图像;l参数:img被显示的图像x图像左上角的x坐标y图像左上角的y坐标width缩放后的图像的宽度height缩放后的图像的高度observer更新图像信息的对象,可以是null11.2.3 绘制图像绘制图像 l【例11-2】DrawImageTest.java11.3 图形图像的坐标变换图形图像的坐标变换 在游戏编程中,经常需要将游戏元素进行平移、尺度缩放、角度旋转和变形等操作,这就要对java图形环境进行坐标变换,Graphics2D类和AffineTransform类的几个方法实现了坐标变换功能。11.3.1 使用使用Graphics2D类进行坐标变换类进行坐标变换 l平移平移Graphics2D类的translate()方法实现了对Graphics2D坐标系的平移变换:g2d.translate(x,y);g2d.draw(.);这个方法的作用是把Graphics2D坐标系的原点移动到当前坐标系的(x,y)之处,其后绘制图形图像时所使用的坐标将以新坐标系为基准,以原坐标系的(x,y)之处作为新原点,绘制的结果相当于将图形图像进行了平移11.3.1 使用使用Graphics2D类进行坐标变换类进行坐标变换 l尺度缩放尺度缩放Graphics2D类的scale()方法实现了对坐标系的尺度缩放功能,scale()方法的使用方式为:g2d.scale(sx,sy);g2d.draw(.);sx、sy是双精度(double)类型,是将当前坐标系的坐标进行缩放的缩放因子,缩放后:xnew=x*sx,ynew=y*sy。该方法执行之后绘制图形图像时所用的坐标将以缩放后的新坐标系为基准,绘制的结果相当于将图形图像进行了缩放,缩放因子为sx、sy。11.3.1 使用使用Graphics2D类进行坐标变换类进行坐标变换 l角度旋转角度旋转Graphics2D类的rotate()方法实现了对Graphics2D坐标系的角度旋转功能:g2d.rotate(angle);g2d.draw(.);参数angle以弧度为单位,表示将当前坐标系以原点为中心旋转angle弧度,如果angle为正值,将从x轴正方向向y轴正方向旋转,如果angle为负值,将从x轴正方向向y轴负方向旋转。11.3.1 使用使用Graphics2D类进行坐标变换类进行坐标变换 l角度旋转角度旋转rotate()方法的第二种使用方式为:g2d.rotate(angle,x,y);g2d.draw(.);带参数x、y的rotate()方法相当于如下顺序的三个方法调用:translate(x,y);rotate(angle);translate(-x,-y);11.3.1 使用使用Graphics2D类进行坐标变换类进行坐标变换 lGraphics2D的若干坐标变换方法的顺序调用组成了一个变换组合,作用的顺序与方法调用的顺序一致。l上述第一个方法调用对坐标系进行平移变换,将坐标原点平移到(x,y)处,第二个对平移后的新坐标系进行旋转angle弧度的变换,第三个再对旋转后的坐标系进行平移,将原点移动到当前坐标系的(-x,-y)之处。l总体结果,相当于围绕(x,y)旋转了angle弧度。11.3.1 使用使用Graphics2D类进行坐标变换类进行坐标变换 l所以,如果想让图形图像在某位置(sitex,sitey)围绕自己的中心(sitex+width/2,sitey+height/2)进行旋转,需要调用:rotate(angle,sitex+width/2,sitey+height/2);或下列组合调用:translate(sitex+width/2,sitey+height/2);rotate(angle);translate(-sitex-width/2,-sitey-height/2);11.3.1 使用使用Graphics2D类进行坐标变换类进行坐标变换 l【例11-3】TransformTest.java11.3.2 使用使用AffineTransform类进行坐标类进行坐标变换变换 l平移、尺度缩放、角度旋转和变形等坐标变换,可以用矩阵变换来表示:l平移、尺度缩放、角度旋转和变形等坐标变换,可以用矩阵变换来表示:其中a、b、c、d、e、f等变量取适当的值,就能实现坐标系的平移、尺度缩放、角度旋转和变形等变换,这类变换一般称为仿射变换。11.3.2 使用使用AffineTransform类进行坐标类进行坐标变换变换 ljava.awt.geom包中的AffineTransform类提供了仿射变换的功能,如果知道某种坐标变换对应的变换矩阵,可以通过以下方式直接创建具有特定坐标变换功能的AffineTransform对象:AffineTransformtransform=newAffineTransform(a,b,c,d,e,f);11.3.2 使用使用AffineTransform类进行坐标类进行坐标变换变换 l如果不清楚坐标变换到底对应哪一个变换矩阵,可以直接调用AffineTransform类的getTranslateInstance()、getRotateInstance()、getSc
展开阅读全文
温馨提示:
金锄头文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
相关搜索

当前位置:首页 > 高等教育 > 大学课件


电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号