版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android游戏开发游戏开发视图让游戏主角动起来碰撞检测课程安排游戏周边自定义动画游戏开发视图回顾ViewpublicclassMyViewextendsView{…}protectedvoidonDraw(Canvascanvas){Paintpaint=newPaint();paint.setColor(Color.WHITE);canvas.drawText("Game",textX,textY,paint);super.onDraw(canvas);}publicbooleanonKeyDown(intkeyCode,KeyEventevent){if(keyCode==KeyEvent.KEYCODE_DPAD_UP){textY-=2;}elseif(keyCode==KeyEvent.KEYCODE_DPAD_DOWN){textY+=2;}elseif(keyCode==KeyEvent.KEYCODE_DPAD_LEFT){textX-=2;}elseif(keyCode==KeyEvent.KEYCODE_DPAD_RIGHT){textX+=2;}invalidate();//postInvalidate();returnsuper.onKeyDown(keyCode,event);}publicbooleanonTouchEvent(MotionEventevent){//获取用户手指触屏的X坐标赋值与文本的X坐标textX=(int)event.getX();//获取用户手指触屏的Y坐标赋值与文本的Y坐标textY=(int)event.getY();//重绘画布invalidate();//postInvalidate();returntrue;}1、继承android.view.View类。2、实现OnDraw方法,该方法被系统调用3、在事件处理函数中加入invalidate函数,重绘view。4、在Activity类中,使用setContentView(newMyView(this));游戏开发视图回顾SurfaceViewpublicclassMySurfaceViewextendsSurfaceViewimplementsCallback,Runnable{//用于控制SurfaceViewprivateSurfaceHoldersfh;//声明一条线程privateThreadth;//线程消亡的标识位privatebooleanflag;…}publicMySurfaceView(Contextcontext){super(context);//实例SurfaceHoldersfh=this.getHolder();//为SurfaceView添加状态监听sfh.addCallback(this);paint=newPaint();paint.setColor(Color.WHITE);//设置焦点setFocusable(true);}publicvoidsurfaceCreated(SurfaceHolderholder){flag=true;//实例线程th=newThread(this);//启动线程th.start();}publicvoidsurfaceDestroyed(SurfaceHolderholder){flag=false;}publicvoidmyDraw(){try{canvas=sfh.lockCanvas();if(canvas!=null){canvas.drawRGB(0,0,0);canvas.drawText("Game",textX,textY,paint);}}catch(Exceptione){}finally{if(canvas!=null)sfh.unlockCanvasAndPost(canvas);}}publicvoidrun(){while(flag){longstart=System.currentTimeMillis();
myDraw();logic();longend=System.currentTimeMillis();
try{if(end-start<50){
Thread.sleep(50-(end-start));
}}catch(InterruptedExceptione){ e.printStackTrace(); }}}游戏开发视图回顾1、View和SurfaceView有哪些不同更新方式不同,View是事件驱动型,SurfaceView是主动更新。
SurfaceView使用了内存缓冲区,View没有。双缓冲有益于减少画面闪烁,对于帧速高的游戏很重要。2、有哪些刷屏方法canvas.drawRect(0,0,this.getWidth(),this.getHeight(),paint);canvas.drawColor(Color.Black);canvas.drawRGB(0,0,0);
重绘背景图
View自身实现了刷屏。3、线程中加入flag的作用
back和home键会将程序切入后台。当重新激活程序时,调用顺序是:surfaceDestroy->sufaceCreated->surfaceChanged自定义动画动态位图法
不断改变位图的X轴或Y轴坐标。帧动画
导入多张图片,按一定顺序播放。见FrameMoview项目
privateBitmapfishBmp[]=newBitmap[10];publicMySurfaceView(Contextcontext){super(context);sfh=this.getHolder();sfh.addCallback(this);paint=newPaint();paint.setColor(Color.WHITE);paint.setAntiAlias(true);setFocusable(true);//将每张小鱼帧图生成位图存入小鱼帧数组中for(inti=0;i<fishBmp.length;i++){fishBmp[i]=BitmapFactory.decodeResource(this.getResources(),R.drawable.fish0+i);}}剪切图动画
类似帧动画,但所有帧放在一张图片中,设置可视区域。见ClipBitmap项目publicvoidmyDraw(){…canvas.drawBitmap(fishBmp[currentFrame],0,0,paint);…}publicvoidlogic(){…currentFrame++;If(currentFrame>=fishBmp.length)currentFrame=0;…}让游戏主角动起来准备工作 Robot.png此图是机器人向右奔跑的所有动作帧,每帧大小相同,顺序从上往下,从左到右。下标为N帧的X坐标:frameX=n%col*frameWY坐标:frameY=n/col*frameHdrawFrame函数:publicvoiddrawFrame(intcurrentFrame,Canvascanvas,Paintpaint){intframeW=bmpRobot.getWidth()/6;intframeH=bmpRobot.getHeight()/2;intcol=bmpRobot.getWidth()/frameW;intx=currentFrame%col*frameW;inty=currentFrame/col*frameH;canvas.save();//设置一个宽高与机器人每帧相同大小的可视区域canvas.clipRect(robot_x,robot_y,robot_x+bmpRobot.getWidth()/6,robot_y+bmpRobot.getHeight()/2);if(dir==DIR_LEFT){//如果是向左侧移动//镜像操作canvas.scale(-1,1,robot_x-x+bmpRobot.getWidth()/2,robot_y-y+bmpRobot.getHeight()/2);}canvas.drawBitmap(bmpRobot,robot_x-x,robot_y-y,paint);canvas.restore();}publicbooleanonKeyDown(intkeyCode,KeyEventevent){if(keyCode==KeyEvent.KEYCODE_DPAD_UP){isUp=true;}if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN){isDown=true;}if(keyCode==KeyEvent.KEYCODE_DPAD_LEFT){isLeft=true;dir=DIR_LEFT;}if(keyCode==KeyEvent.KEYCODE_DPAD_RIGHT){isRight=true;dir=DIR_RIGHT;}returnsuper.onKeyDown(keyCode,event);}让游戏主角动起来需要按键抬起函数终止用户动作publicbooleanonKeyUp(intkeyCode,KeyEventevent){if(keyCode==KeyEvent.KEYCODE_DPAD_UP){isUp=false;}if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN){isDown=false;}if(keyCode==KeyEvent.KEYCODE_DPAD_LEFT){isLeft=false;}if(keyCode==KeyEvent.KEYCODE_DPAD_RIGHT){isRight=false;}returnsuper.onKeyUp(keyCode,event);}privatevoidlogic(){if(isUp){robot_y-=5;}if(isDown){robot_y+=5;}if(isLeft){robot_x-=5;}if(isRight){robot_x+=5;}currentFrame++;if(currentFrame>=12){currentFrame=0;}}碰撞检测子弹和玩家,子弹和敌机,敌机和玩家相撞,都需要碰撞检测。如果用像素循环检测,就会影响速度。矩形碰撞圆形碰撞多矩形碰撞图2图1图1图2图2图1图1图2x1:矩形1的x坐标x2:矩形2的x坐标y1:矩形1的y坐标y2:矩形2的y坐标w1:矩形1的宽 w2:矩形2的宽h1:矩形1的高 h2:矩形2的高publicbooleanisCollsionWithRect(intx1,inty1,intw1,inth1,intx2,inty2,intw2,inth2){if(x1>=x2&&x1>=x2+w2){returnfalse;}elseif(x1<=x2&&x1+w1<=x2){returnfalse;}elsei
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 龟头癌的健康宣教
- 2024年配偶间权益保障协议
- 2024标准版国内货物运输协议样本版B版
- 《诗经两首用》课件
- 2024水土保持技术服务合同范本
- 2024年租赁合同:办公设备及场地租赁
- 2024景区旅游服务设施建设合同
- 2024年虚拟现实技术研发分包合同协议书
- 2024年跨区域清洁能源输送项目融资合同
- 2024微计小程序区域独家代理合作合同书2篇
- 2025年上半年河南省西峡县部分事业单位招考易考易错模拟试题(共500题)试卷后附参考答案-1
- 深交所创业板注册制发行上市审核动态(2020-2022)
- 手术室护理组长竞聘
- 电力系统继电保护试题以及答案(二)
- 小学生防打架斗殴安全教育
- 2024-2025学年九年级英语上学期期末真题复习 专题09 单词拼写(安徽专用)
- 网络运营代销合同范例
- 2024年新人教版七年级上册历史 第14课 丝绸之路的开通与经营西域
- 植保无人机安全飞行
- 医疗纠纷事件汇报
- 2024年村干部个人工作总结例文(3篇)
评论
0/150
提交评论