- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
第四讲建立游戏的运行框架
主要内容:游戏的基本运行机制及其编写方法重点:游戏运行框架、AWT绘图机制、双缓冲机制、用线程处理游戏循环难点:双缓冲机制、获得稳定的FPS123课时数:34
4.1 绘制一个小球回顾:第三讲的绘图框架(参见例4.1)提问:如何使其移动?回答:移动图形显示1游戏的最基本特征2
进一步提问:如何移动图形显示?回答:不断地改变图形显示的位置,并重新绘制在屏幕上那么:技术上如何实现?回答:使用程序的循环结构,While(){改变小球坐标;重新绘制;}
提问:while()循环放在何处?选择1:放在主类(GameFrame)×选择2:放在子类(drawBall)√步骤a:添加gameLoop()方法publicvoidgameLoop(){while(true){x++;repaint();}}步骤b:在主类中调用drawBall对象的gameLoop()方法改变小球绘制的坐标值重新绘制屏幕游戏的本质--死循环!要点1:AWT图形绘制机制
AWT图形绘制机制图形绘制代码放置在组件的paint()方法中01程序不能直接调用paint()方法来绘制组件,而需调用组件的repaint()方法来重绘该组件02repaint()首先调用update()方法,然后调用paint()方法,默认的update()将进行清屏操作03当多个repaint请求同时作用在同一个组件上时,由于事件处理线程无法及时作出响应,将导致合并为一个repait请求04
操作并演示:加入gameLoop()方法为什么没有显示小球?原因:循环执行得太快,导致repait请求无法及时响应解决:加入空循环为什么不能直接调用paint()原因:repaint()方法能调用update()方法清屏(参见例4.2)
问题3:为什么屏幕闪烁?原因:在同一个绘图表面上反复绘制并擦除解决:使用双缓冲机制(要点2)离屏渲染(RendertoOff-Screen)前屏显示(DrawtoOn-Screen)
离屏渲染操作:步骤a:建立一个Image对象,并获取其Graphics对象(图象缓冲区)Imageim;im=creatImage(width,height);Graphicsdbg=im.getGraphics();步骤b:在Image上渲染图形dbg.setColor(Color.blue);dbg.fillOval(x,y,diameter,diameter);
前屏显示操作:获取当前屏幕的Graphics对象Graphicsg=this.getGraphics();绘制Image图象缓冲区中的内容g.drawImage(im,0,0,null);释放当前屏幕的Graphics对象g.dispose();(参见例4.3)
4.3实现更加复杂的移动改进1:斜向移动01改进2:小球移出边界后从另一边出来02改进3:随机移动03改进4:弹跳(作业)使用Random类04
4.4游戏的运行框架对gameLoop()中的代码进行封装:gameLoop(){while(true){gameUpdate();gameRender();gamePaint();}}更新游戏逻辑离屏渲染12345要点3:游戏框架前屏绘制
4.5创建新的线程作用1:减轻主线程压力,提高执行效率主线程—用于响应用户事件子线程---用于处理游戏循环为何创建新线程?01在drawBall类上实现Runnable接口将游戏循环放置在run()方法中实例化线程并启动(Thread.start())创建步骤:02
作用2:获得稳定的FPS(祯速率)(要点4)Tread.sleep(sleepTime);如何合理设置sleepTime?(参见例4.5)另外的选择:使用TimerTask类(自学)在屏幕绘图一次称为一祯,FPS表示每秒绘制的祯数,50~80较合适
4.6移植到Applet版本1继承Applet类,并实现Runnable接口3重载Applet.int(),初始化2重载线程的run()方法,加入游戏循环代码4重载Applet.start(),建立并启动线程5重载Applet.stop(),终止线程6(参见例4.6)
AWT绘图机制repaint-update-paint双缓冲机制离屏渲染vs前屏绘制游戏运行框架while(true){gameUpdate,gameRen
文档评论(0)