电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本
换一换
首页 金锄头文库 > 资源分类 > PDF文档下载
分享到微信 分享到微博 分享到QQ空间

《android游戏编程之从零开始》第六章样章

  • 资源ID:45694176       资源大小:302.59KB        全文页数:6页
  • 资源格式: PDF        下载积分:10金贝
快捷下载 游客一键下载
账号登录下载
微信登录下载
三方登录下载: 微信开放平台登录   支付宝登录   QQ登录  
二维码
微信扫一扫登录
下载资源需要10金贝
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
1、金锄头文库是“C2C”交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时联系右侧客服;
2、如你看到网页展示的文档有jinchutou.com水印,是因预览和防盗链等技术需要对部份页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有jinchutou.com水印标识,下载后原文更清晰;
3、所有的PPT和DOC文档都被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;下载前须认真查看,确认无误后再购买;
4、文档大部份都是可以预览的,金锄头文库作为内容存储提供商,无法对各卖家所售文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;
5、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据;
6、如果您还有什么不清楚的或需要我们协助,可以点击右侧栏的客服。
下载须知 | 常见问题汇总

《android游戏编程之从零开始》第六章样章

1 6.1 360°平滑游戏导航摇杆 在 Android 系统中很多机型是没有实体导航按键的,那么如果想让一个游戏在所有Android 系统的机型上运行,就要利用 Android 系统都支持触屏的特点来进行设计。既然所有 Android 系统都支持触屏,那么就可以想到,在屏幕上绘制一个游戏摇杆供用户操作游戏,这也是目前 Android 游戏开发中最常用的一种做法了。 下面就来实现Android手机上的360°平滑游戏摇杆吧!首先观察如图6-1所示的效果 。 图 6-1 摇杆示意图 图 6-1 是一个摇杆的示意图,从图中加以分析: l 玩家操作的应该是中心红色的小圆; l 小圆的最大活动范围是围绕大圆做圆周运动; l 既然小圆有活动范围,那么当用户的触屏点在大圆以外的位置,那么小圆的角度应该与用户触点的角度相同。 首先实现的应该是在屏幕上绘制两个大小不一的圆形 , 并且让小圆中心点围绕大圆做圆周运动。 新建项目“RockerProject”,游戏框架为 SurfaceView 游戏框架,项目对应的源代码为“6-1(360°平滑游戏摇杆)”。 修改 MySurfaceView: /定义两个圆形的中心点坐标与半径 private float smallCenterX = 120, smallCenterY = 120, smallCenterR = 20; private float BigCenterX = 120, BigCenterY = 120, BigCenterR = 40; /当前圆周运动的角度 private int angle; /修改绘图函数: public void myDraw() 2 . /绘制大圆 paint.setAlpha(0x77); canvas.drawCircle(BigCenterX, BigCenterY, BigCenterR, paint); /绘制小圆 canvas.drawCircle(smallCenterX, smallCenterY, smallCenterR, paint); . 新封装一个圆周运动时,得到小圆坐标的方法: /* * 小圆针对于大圆做圆周运动时,设置小圆中心点的坐标位置 * param centerX * 围绕的圆形(大圆)中心点X坐标 * param centerY * 围绕的圆形(大圆)中心点Y坐标 * param R * 围绕的圆形(大圆)半径 * param rad * 旋转的弧度 */ public void setSmallCircleXY(float centerX, float centerY, float R, double rad) /获取圆周运动的X坐标 smallCenterX = (float) (R * Math.cos(rad) + centerX; /获取圆周运动的Y坐标 smallCenterY = (float) (R * Math.sin(rad) + centerY; 这里是根据角度弧度的转换,再通过三角函数定理得到小圆坐标位置的。 逻辑函数: private void logic() /让角度在0360循环 angle+; if (angle >= 360) angle = 0; /弧度 = 角度PI/*180 setSmallCircleXY(BigCenterX, BigCenterY, BigCenterR, angle * Math.PI / 180); 运行项目,效果如图 6-2 所示。 3 图 6-2 圆周运动 此步完成之后,下面就应该考虑用户触点的位置,大概分为两种情况: l 用户触点位置在大圆内或者大圆上,那么小圆的中心点直接跟随玩家触点位置即可; l 用户触点位置在大圆外,那么小圆中心肯定在大圆的圆周上,但是小圆所在大圆上的角度,应该等同于用户触点位置相对于大圆的角度。 首先删去刚才在逻辑函数中的代码,然后封装一个得到玩家触点相对于大圆角度的方法: /* * 得到两点之间的弧度 * param px1 第一个点的X坐标 * param py1 第一个点的Y坐标 * param px2 第二个点的X坐标 * param py2 第二个点的Y坐标 * return */ public double getRad(float px1, float py1, float px2, float py2) /得到两点X的距离 float x = px2 - px1; /得到两点Y的距离 float y = py1 - py2; /算出斜边长 float Hypotenuse = (float) Math.sqrt(Math.pow(x, 2) + Math.pow(y,2); /得到这个角度的余弦值(通过三角函数中的定理 :邻边/斜边=角度余弦值) float cosAngle = x / Hypotenuse; /通过反余弦定理获取其角度的弧度 float rad = (float) Math.acos(cosAngle); /当触屏的位置Y坐标<摇杆的Y坐标,取反值-0-180 if (py2 < py1) rad = -rad; return rad; 修改触屏监听函数: 4 public boolean onTouchEvent(MotionEvent event) /当用户手指抬起,应该恢复小圆到初始位置 if (event.getAction() = MotionEvent.ACTION_UP) smallCenterX = BigCenterX; smallCenterY = BigCenterY; else int pointX = (int) event.getX(); int pointY = (int) event.getY(); /判断用户点击的位置是否在大圆内 if (Math.sqrt(Math.pow(BigCenterX - (int) event.getX(), 2) + Math.pow(BigCenterY - (int) event.getY(), 2) <= BigCenterR) /让小圆跟随用户触点位置移动 smallCenterX = pointX; smallCenterY = pointY; else setSmallCircleXY(BigCenterX, BigCenterY, BigCenterR, getRad(BigCenterX, BigCenterY, pointX, pointY); return true; 运行项目,效果如图 6-3 所示。 到此整个摇杆的制作就完成了,那么如何在游戏中使用它呢?其实很简单。 假如需要使用摇杆控制游戏主角的移动,那么首先将整个 360°分成 4 等分或者 8 等分 , 对应主角的 4 方向或者 8 方向 ; 然后通过封装的两点之间得到弧度的函数获取摇杆弧度 ,将其弧度转换成角度 , 再将摇杆的角度与之前的 360°分成的 4 或 8 等分范围比对处理即可 。 图 6-3 360°平滑游戏摇杆 6.2 多触点实现图片缩放 在 Android SDK 2.0 中,对应 API 5 时开始支持屏幕的多触点,不过真机测试发现,目5 前最多支持两个触点;本小节就利用多触点的功能来实现缩放位图。 新建项目“MoreContactsProject” ,游戏框架为 SurfaceView 游戏框架,对应的项目源代码码为“6-2(多触点缩放位图) ” ;这里需要注意,多触点是 API 5 以后支持的功能,所以Android 模拟器要选择 SDK 5 或以上的版本,否则运行项目会报错。 首先定义用到的成员变量: /声明一张icon位图 private Bitmap bmpIcon=BitmapFactory.decodeResource(this.getResources(), R.drawable.icon); /记录两个触屏点的坐标 private int x1, x2, y1, y2; /倍率 private float rate = 1; /记录上次的倍率 private float oldRate = 1; /记录第一次触屏时线段的长度 private float oldLineDistance; /判定是否头次多指触点屏幕 private boolean isFirst = true; 绘图函数: public void myDraw() . canvas.save(); /缩放画布(以图片中心点进行缩放,X、Y轴缩放比例相同) canvas.scale(rate, rate, screenW / 2, screenH / 2); /绘制位图icon canvas.drawBitmap(bmpIcon, screenW / 2 - bmpIcon.getWidth() / 2, screenH / 2 - bmpIcon.getHeight() / 2, paint); canvas.restore(); /便于观察,这里绘制两个触点时形成的线段 canvas.drawLine(x1, y1, x2, y2, paint); . 触屏监听事件: public boolean onTouchEvent(MotionEvent event) /用户手指抬起默认还原为第一次触屏标识位,并且保存本次的缩放比例 if (event.getAction() = MotionEvent.ACTION_UP) isFirst = true; oldRate = rate; else x1 = (int) event.getX(0); y1 = (int) event.getY(0); x2 = (int) event.getX(1); y2 = (int) event.getY(1); if (event.getPointerCount() = 2) if (isFirst) /得到第一次触屏时线段的长度 oldLineDistance = (float)Math.sqrt (Math.pow(event.getX(1) - event.getX(0), 2) + 6 Math.pow(event.getY(1) - event.getY(0), 2); isFirst = false; else /得到非第一次触屏时线段的长度 float newLineDistance = (float) Math.sqrt (Math.pow(event.getX(1) - event.getX(0), 2) + Math.pow(event.getY(1) - event.getY(0), 2); /获取本次的缩放比例 rate = oldRate * newLineDistance/oldLineDistance; return true; 上面代码中,使用了两个常用的函数获取触屏点的 X、Y 坐标: MotionEvent.getX(int pointerIndex) 作用:获取触屏点的 X 坐标 参数:触屏点下标(下标从 0 开始) MotionEvent.getY(int pointerIndex) 作用:获取触屏点的 Y 坐标 参数:触屏点下标(下标从 0 开始) 除此之

注意事项

本文(《android游戏编程之从零开始》第六章样章)为本站会员(wt****50)主动上传,金锄头文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即阅读金锄头文库的“版权提示”【网址:https://www.jinchutou.com/h-59.html】,按提示上传提交保证函及证明材料,经审查核实后我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.