版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章二维图像处理---以游戏开发为根本移动应用开发技术第1页-2-本章目标掌握Bitmap/BitmapFactory认识位图缩放与图像变换了解Canvas/Paint了解View/SurfaceView了解线程控制下图像处理与动画第2页6.1Android二维游戏开发视图Android游戏开发中惯用三种视图:view视图、SurfaceView视图和GLSurfaceView视图。View视图:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等;必须在UI根本程内更新画面,速度较慢。SurfaceView视图:基于view视图进行拓展视图类,更适合2D游戏开发;是view子类,类似使用双缓冲机制,在新线程中更新画面所以刷新界面速度比view快。在一个新开启线程中重新绘制画面,主动更新画面。GLSurfaceView视图:基于SurfaceView视图再次进行拓展视图类,是专用于3D游戏开发视图;是SurfaceView子类(openGL专用)。第3页6.1Android二维游戏开发视图
(2)主动更新
需要一个单独thread不停重绘人状态,比如一个人在一直跑动。防止阻塞mainUIthread。所以显然view不适当,需要surfaceView来控制。依据游戏特点,更新画面类型普通分为以下两类:(1)被动更新画面
画面更新依赖于onTouch来更新,比如棋类游戏,能够直接使用invalidate。因为这种情况下,这一次Touch和下一次Touch需要时间比较长些,不会产生影响。第4页6.1.1View视图框架举例:调用自定义View视图对于常规游戏,在View中需要处理以下3种问题:控制事件、刷新View、绘制View。6.1Android二维游戏开发视图(1)处理按键事件onKeyDown,屏幕触控onTouchEvent以及Sensor重力感应等方法。(2)刷新view方法这里主要有invalidate(intl,intt,intr,intb)刷新局部,四个参数分别为左、上、右、下。(3)绘制View主要是onDraw()中经过形参canvas来处理,相关绘制主要有drawRect、drawLine、drawPath等。第5页6.1.2SurfaceView视图框架6.1Android二维游戏开发视图SurfaceView视图和View视图最本质区分是View视图要在UI根本程中更新画面,surfaceView视图是在一个新起单独线程中能够重新绘制画面而,所以不会阻塞UI根本程。但这也带来事件同时问题,也包括到线程同时。SurfaceView视图原理第6页
在游戏中,普通不会等用户每次触发了按键事触屏事件才重绘画布,而是会定义一个时间去刷新画布;比如倒计时、动态花草、流水等,这些游戏元素并不会跟玩家交互,但却都是动态。所以游戏开发中,会有一个线程不停去重绘画布,实时更新游戏元素状态。6.1.2SurfaceView视图框架6.1Android二维游戏开发视图
游戏中除用画布给玩家最直接动态展示外,还有很多逻辑需要不间断地去更新,比如游戏中钱币更新和AI(人工智能)行为等等。Android中SurfaceView类就是双缓冲机制,开发采取自动刷新屏幕游戏时尽可能使用SurfaceView类,这么效率较高,而且SurfaceView类功效也愈加完善。举例:获取视图宽度和高度第7页6.2惯用绘图类
在Android下进行2D绘图最惯用就是Paint类、Canvas类、Bitmap类和BitmapFactory类。其中Paint类代表画笔,Canvas类代表画布。6.2.1画笔PaintPaint画笔是绘图辅助类,普通它是作为画布参数来实现对应效果,Paint类中包含文字与位图样式、颜色等属性信息。6.2.2画布CanvasCanvas类提供了两个结构函数:Canvas():创建一个空Canvas对象。Canvas(Bitmapbitmap):创建一个以bitmap位图为背景Canvas。Canvas类提供了很多对应drawXxx()方法,含有各种类型,能够画出点、线、矩形、圆形、椭圆、文字、位图等。第8页6.2惯用绘图类6.2.3Bitmap类Bitmap类代表位图,不但能够获取图像文件信息,对图像进行剪切、旋转、缩放等操作,而且还能够指定保留图像文件格式。6.2.4BitmapFactory类该类为一个工具类,用于从不一样数据源解析和创建Bitmap对象。第9页6.2.5基础实例:游戏角色行走控制6.2惯用绘图类本例实现对RGP类型游戏人物行走进行控制。人物行走图片素材人物行走实例运行界面第10页6.3绘制2D图像Android提供了强大二维图形库用于绘制2D图像,惯用是绘制几何图形、文本、路径和图片等。6.3.1绘制文本在开发游戏过程中,尤其是RPG(角色)类游戏时,显示文字信息多用绘制文本方式。举例:游戏中对话界面第11页6.3绘制2D图像6.3.2绘制几何图形Canvas类提供了丰富绘制几何图形方法,包含点、线、弧、圆形、矩形等。举例:绘制奥运五环第12页6.3绘制2D图像6.3.3绘制路径Android中绘制路径有创建路径和绘制订义好路径两种方式。创建路径能够使用android.graphics.Path类实现。6.3.4绘制图片举例:绘制SD卡指定图像第13页6.4图像特效在Android中可认为图像添加旋转、缩放、倾斜、平移和渲染等特效。postXXX()方法采取前乘方式设置Matrix值,设置操作最先发生。在AndroidAPI中提供setXXX()、postXXX()、preXXX()三种方式:setXXX()方法用于直接设置Matrix值,每使用一次,整个Matrix都会改变;postXXX()方法采取后乘方式设置Matrix值,能够连续屡次使用post以完成多个变换第14页6.4.1旋转图像6.4图像特效使用android.graphics.Matrix类提供setRotate()、postRotate()和preRotate()三个方法。举例:应用Matrix旋转图像使用android.graphics.Matrix类提供setScale()、postScale()和preScale()三个方法。6.4.2缩放图像举例:应用Matrix缩放图像使用android.graphics.Matrix类提供setSkew()、postSkew()和preSkew()三个方法。6.4.3倾斜图像举例:应用Matrix倾斜图像第15页6.4图像特效
使用android.graphics.Matrix类提供setTranslate()、postTranslate()和preTranslate()三个方法。Android中渲染图像主要应用BitmapShader类,创建该类对象可经过以下结构方法:BitmapShader(Bitmapbitmap,Shader.TileModetileX,Shader.TileModetileY)
其中bitmap参数用于指定一个位图对象;tileX参数用于指定水平方向图像重复方式;tileY参数用于指定垂直方向图像重复方式。★注意:Shader.TileMode类型参数包含CLAMP(用边界颜色填充剩下空间)、MIRROR(镜像方式)和REPEAT(重复方式)3个可选值。6.4.4平移图像举例:应用Matrix平移图像6.4.5渲染图像举例:应用BitmapShader渲染图像第16页6.5剪切区域6.5.1剪切区域原理
剪切区域也称可视区域,是由画布进行设置,指是在画布上设置一块区域,设置了可视区域以后,将看不见区域以外绘制任何内容。6.5.2基础实例1:RPG游戏地图生成本例实现二维RGP类型游戏中地图编辑与生成。RPG游戏地图素材MapWin软件界面游戏地图生成实例运行界面第17页6.5剪切区域6.5.3基础实例2:游戏中自动滚屏本例实现射击类游戏或过关类游戏中背景自动滚动。自动滚屏背景素材自动滚屏实例运行界面第18页6.6游戏动画
在Android中提供了逐帧动画和补间动画两种动画类型,均能够在XML文件中定义动画资源文件。另外,也能够经过重写Animation
applyTransformation
()函数实现自定义动画效果。6.6.1逐帧动画逐帧动画就是按次序播放静态图像,先要在定义一组生成动画图片资源。<?xml
version="1.0"
encoding="utf-8"?><animation-list
xmlns:android="/apk/res/android"
android:oneshot="true|false">
<item
android:drawable="@drawable/图片资源名称1"android:duration="integer"/>……<!—此处省略部分<item></item>标识-->
<item
android:drawable="@drawable/图片资源名称1"android:duration="integer"/></animation-list>举例:奔跑小动物第19页6.6游戏动画6.6.2补间动画
补间动画是经过对场景里对象不停做图像变换(平移、缩放、旋转)来产生动画效果。在实现补间动画时,只需要定义动画开始和结束关键帧。举例:补间动画实例在Android中,提供了透明度渐变动画、旋转动画、缩放动画和平移动画四种补间动画。
重写Animation
applyTransformation
()函数,然后通常要实现
initialize
()函数,这是一个回调函数,告诉Animation目标View大小,能够初始化一些相关参数。在绘制动画过程中会重复调用applyTransformation
()函数,参数interpolatedTime值(值为从0到1)在每次调用中都会改变。6.6.3自定义动画举例:自定义动画实例第20页6.7综合实例一:小小弹球功效描述关键技术
本例实现一款简单弹球游戏,利用触屏控制底部弹板弹起小球;游戏失败后,再次触屏能够重启游戏。本例实现关键是Timer类使用和小球与边界、弹板是否接触计算。代码以下所表示:finalTimertimer=newTimer(); timer.schedule(newTimerTask(){
@Override
public
voidrun(){
if(ballX<=0||ballX>=(screen_width-ball_size)){
xSpeed=-xSpeed; }
if(ballY<=0||ballY>=(rectY-ball_size) &&ballX>=rectX&&ballX<=(rectX+rect_width)){
ySpeed=-ySpeed; }else
if(ballY>=(rectY-ball_size)&&(ballX<rectX ||ballX>(rectX+rect_width))){
isGameOver=true; timer.cancel(); }
ballX+=xSpeed;
ballY+=ySpeed; Messagemsg=newMessage(); msg.what=1;
handler.sendMessage(msg); }},0,300);
newThread(this).start();}第21页6.7综合实例一:小小弹球实例拓展
为游戏添加背景图,用图片资源替换游戏中采取绘图函数实现小球和弹板;用重力传感器控制弹板移动。弹球图片素材弹球实例运行界面第22页6.7综合实例二:动态游戏导航界面功效描述关键技术本例实现一个图形化动态游戏菜单界面。本例实现关键是依据游戏不一样状态标识绘制不一样界面。代码以下所表示:private
voiddrawMenu(Canvascanvas){ canvas.drawBitmap(menu[0],0,0,paint);//绘制菜单界面背景 canvas.clipRect(240,260,240+menu[1].getWidth()/6, 260+menu[1].getHeight());//剪切菜单项区域 canvas.drawBitmap(menu[1],240-menuIndex*menu[1].getWidth()/6, 260,paint);//绘制当前菜单项 canvas.clipRect(205,350,234,370,Op.UNION);//剪切左切换按钮区域 canvas.drawBitmap(menu[2],205,350,paint);//绘制左切换按钮 canvas.clipRect(290,350,319,370,Op.UNION);//剪切右切换按钮区域 canvas.drawBitmap(menu[2],290,330,paint);//绘制右切换按钮
//剪切花瓣区域canvas.clipRect(flowerX,flowerY,flowerX+15,flowerY+15,Op.UNION);
canvas.drawBitmap(flower[frameIndex],flowerX,flowerY,paint);//绘制花瓣}第23页实例拓展6.7综合实例二:动态游戏导航界面实现游戏处于菜单状态下多数花瓣不停飘落效果。游戏动态导航花瓣效果第24页6.7综合实例三:打地鼠功效描述关键技术
本例实现一个打地鼠游戏。在一个有多个“洞穴”场景中,每个“洞穴”随机显示地鼠,用户能够用手触摸出现地鼠。假如触摸到则该地鼠不再显示,同时在屏幕上经过消息提醒框显示打到了几只地鼠。
本例实现关键是怎样在指定位置随机显示地鼠,这里主要是经过线程与消息处理进行控制。首先使用Thread线程对象统计地鼠出现位置,然后经过Handler消息控制地鼠出现。经过Handler消息控制地鼠出现关键代码以下所表示:handler=newHandler(){
@Override
public
voidhandleMessage(Messagemsg){
intindex=0;
if(msg.what==0x101){ index=msg.arg1;//获取位置索引值
mouse.setX(position[index][0]);//设置X轴位置
mouse.setY(position[index][1]);//设置Y轴位置
mouse.setVisibility(View.VISIBLE);//设置地鼠显示 }
super.handleMessage(msg); }};第25页使用Thread线程对象统计地鼠出现位置关键代码以下所表示:6.7综合实例三:打地鼠Threadt=newThread(newRunnable(){@Overridepublic
voidrun(){
intindex=0;//创建一个统计地鼠位置索引值
while(!Thread.currentThread().isInterrupted()){ index=newRandom().nextInt(position.length);//产生一个随机数 Messagem=handler.obtainMessage();//获取一个Message m.what=0x101;//设置消息标识 m.arg1=index;//保留地鼠标位置索引值
handler.sendMessage(m);//发送消息
try{ Thread.sleep(newRandom().nextInt(500)+500);//休眠一段时间 }catch(InterruptedExceptione){ e.printStackTrace(); }}}});t.start();//开启线程}打地鼠游戏图片素材打地鼠游戏运行界面第26页6.7综合实例四:游戏中瞄准镜功效描述关键技术本例实现射击类游戏中瞄准镜随触屏手指移动效果。
实现本例关键是对放大图像局部抠取及平移放大图像时矩阵位置计算。创建圆形图像关键代码以下所表示:shader=newBitmapShader(bitmap_bg_big,TileMode.CLAMP,TileMode.CLAMP);shapeDrawable=newShapeDrawable(newOvalShape());//创建圆形ShapeshapeDrawable.setBounds(0,0,RADIUS*2,RADIUS*2);//设置圆外切矩形shapeDrawable.getPaint().setShader(shader);//设置画笔形状平移矩阵新位置计算代码以下所表示:matrix.setTranslate(RADIUS-x*FACTOR,RADIUS-y*FACTOR);//平移矩阵shapeDrawable.getPaint().getShader().setLocalMatrix(matrix);shapeDrawable.setBounds(x-RADIUS,y-RADIUS,x+RADIUS,y+RADIUS);//圆外切矩形
瞄准镜实例图片素材
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度保安职位劳动协议模板
- 2024年软件开发项目合作协议
- 课件的封面教学课件
- 小熊孵蛋课件教学课件
- 仓库安全管理规范化守则
- 企业并购咨询合作协议
- 交通运输行业司机薪资协议
- 传染病分类解析:体育场馆卫生管理
- 泵介绍课件教学课件
- 二手废医疗器械回收转让合同
- 中小学科普石油科普知识
- 《血气分析解析》课件
- 行业规范守则管理制度
- 七年级上历史半期测试题
- 外卖运营培训手册
- 一年级上册语文声调练习题7套
- 销售个人绩效申请模板
- 针灸推拿学专业大学生职业生涯规划书
- 《茶馆(节选)》-统编版高中语文选择性必修下册
- 医院妇产科培训课件:《绝经后女性宫颈疾病的特点和筛查注意事项》
- 厦门大学附属翔安医院核医学科项目环境影响报告
评论
0/150
提交评论