版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、4 2 5 1 1 0011 0010 1010 1101 0001 0100 1011 第3章 游戏程序的基本框架 4 2 5 1 1 0011 0010 1010 1101 0001 0100 1011 内容提要 游戏循环 双缓冲机制 游戏程序框架 多线程机制 Applet游戏框架 4 2 5 1 1 0011 0010 1010 1101 0001 0100 1011 问题导入:绘制一个小球 回顾:Java2D绘图框架 (参见例3_1) 提问:如何使其移动? 回答:移动图形显示 游戏的最基本特征游戏的最基本特征 4 2 5 1 1 0011 0010 1010 1101 0001 010
2、0 1011 进一步提问:如何移动图形显示? 回答:不断地改变图形显示的位置,并重新绘 制在屏幕上 那么:技术上如何实现? 回答: 使用程序的循环结构, While() 改变小球坐标; 重新绘制; 4 2 5 1 1 0011 0010 1010 1101 0001 0100 1011 1.移动的小球 提问:while()循环放在何处? 选择1:放在主类(GameFrame) 选择2:放在子类(drawBall) 步骤步骤a:a:添加gameLoop()方法 public void gameLoop() while(true) x+; repaint(); 步骤步骤b:b:在主类中调用draw
3、Ball对象的gameLoop()方法 改变小球绘制的坐标值改变小球绘制的坐标值 重新绘制屏幕重新绘制屏幕 游戏的本质游戏的本质-死循环死循环! 要点要点1: AWT图形绘制机制图形绘制机制 4 2 5 1 1 0011 0010 1010 1101 0001 0100 1011 操作并演示:加入gameLoop()方法 问题1:为什么没有显示小球? 原因:循环执行得太快,导致repait请求无 法及时响应 解决:加入空循环 问题2:为什么不能直接调用paint() 原因:repaint()方法能调用update()方法 清屏 (参见例3_2) 4 2 5 1 1 0011 0010 1010
4、 1101 0001 0100 1011 AWT图形绘制机制 图形绘制代码放置在组件的paint()方法中 程序不能直接调用paint()方法来绘制组件,而 需调用组件的repaint()方法来重绘该组件 repaint()首先调用update()方法,然后调用 paint()方法,默认的update()将进行清屏操作 当多个repaint请求同时作用在同一个组件上 时,由于事件处理线程无法及时作出响应,将导 致合并为一个repait请求 4 2 5 1 1 0011 0010 1010 1101 0001 0100 1011 问题3:为什么屏幕闪烁? 原因:在同一个绘图表面上反复绘制并擦除
5、解决:使用双缓冲机制(要点2) 离屏渲染离屏渲染 (Render to Off-Screen) 前屏显示前屏显示 (Draw to On-Screen) 4 2 5 1 1 0011 0010 1010 1101 0001 0100 1011 离屏渲染操作: 步骤a:建立一个Image对象,并获取其Graphics对 象(图象缓冲区) Image im; im=creatImage(width,height); Graphics dbg=im.getGraphics(); 步骤b:在Image上渲染图形 dbg.setColor(Color.blue); dbg.fillOval(x, y,
6、diameter, diameter); 4 2 5 1 1 0011 0010 1010 1101 0001 0100 1011 前屏显示操作: 步骤a:获取当前屏幕的Graphics对象 Graphics g = this.getGraphics(); 步骤b:绘制Image图象缓冲区中的内容 g.drawImage(im,0,0,null); 步骤c:释放当前屏幕的Graphics对象 g.dispose(); (参见例3_3) 4 2 5 1 1 0011 0010 1010 1101 0001 0100 1011 实现更加复杂的移动 改进1:斜向移动 改进2:小球移出边界后从另一边出
7、来 改进3:随机移动 改进4:弹跳(作业) 使用使用Random类类 4 2 5 1 1 0011 0010 1010 1101 0001 0100 1011 2.游戏的运行框架 对gameLoop()中的代码进行封装: gameLoop() while(true) gameUpdate(); gameRender(); gamePaint(); (参见例3_4) 更新游戏逻辑更新游戏逻辑 离屏渲染离屏渲染 前屏绘制前屏绘制 要点要点3:游戏框架游戏框架 4 2 5 1 1 0011 0010 1010 1101 0001 0100 1011 3.创建新的线程 为何创建新线程? 作用1:减轻主
8、线程压力,提高执行效率 主线程用于响应用户事件 子线程-用于处理游戏循环 创建步骤: a. 在drawBall类上实现Runnable接口 b. 将游戏循环放置在run()方法中 c.实例化线程并启动(Thread.start() 4 2 5 1 1 0011 0010 1010 1101 0001 0100 1011 作用2:获得稳定的FPS(帧速率) (要点4) Tread.sleep(sleepTime); 如何合理设置sleepTime? (参见例3_5) 另外的选择: 使用TimerTask类(自学) 在屏幕绘图一在屏幕绘图一 次称为一帧次称为一帧, FPS表示每秒表示每秒 绘制的帧数绘制的帧数, 5080较合适较合适 4 2 5 1 1 0011 0010 1010 1101 0001 0100 1011 4.移植到Applet版本 继承Applet类,并实现Runnable接口 重载线程的run()方法,加入游戏循环代 码 重载A(),初始化 重载Applet.start(),建立并启动线程 重载Applet.stop(),终止线程 (参见例3_6) 4 2 5 1 1 0011 0010 1010 1101 0001 0100
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 副百日咳博德特杆菌性百日咳的健康宣教
- 周围血管系统先天性畸形护理课件
- 2026年青少艺术培训合同
- 2026年工程款支付担保合同
- 2026年移动支付接口技术服务合同
- 大学手工活动策划方案(3篇)
- 咖啡上市活动策划方案(3篇)
- 乡镇活动充值策划方案(3篇)
- 钢琴陪练活动方案策划(3篇)
- 机床电气控制线路安装与调试标准教程
- 房建项目工程监理规划模板
- 辽宁轻工职业学院2025年单独招生考试试卷A卷数学真题
- 人教版小学三年级数学上册各单元测试卷含答案全套
- 商业计划书模块化制作与演示设计 课件 -第二章 公司介绍
- 人教版川教版 二年级上册《生命生态安全》表格式教案
- 2024-2025学年高二物理专项复习:动量【四大题型】(解析版)
- 小学古诗词教学与儿童心理健康的关系
- 小红书种草营销师(初级)认证考试题库(附答案)
- 机关事业单位试用干部转正定级呈报表
- 妇科恶性肿瘤激素补充治疗中国专家共识(2024年版)解读
- 银行保安服务 投标方案(技术标)
评论
0/150
提交评论