本站文章均为 李华明Himi 原创,转载务必在明显处注明:(作者新浪微博: @李华明Himi )

转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/344.html

前两篇都是向大家介绍了很有意思的两种手势操作,嵌入我们游戏中,不得不说让游戏的自由度、可玩性和趣味性都增色不少!那么今天继续给大家介绍一亮点!传感器!

一:什么是传感器:

所谓传感器能够探测如光、热、温度、重力、方向 等等的功能!

二:Android中提供传感器有哪些:

1.  加速度传感器(重力传感器)

2.  陀螺仪传感器

3.  光传感器

4.  恒定磁场传感器

5.  方向传感器

6.  恒定的压力传感器

7.  接近传感器

8.  温度传感器

今天我们给大家介绍的是游戏开发中最最常见的,用到的频率最高的一种传感器,加速度传感器(重力传感器)!

因为模拟器无法测试,所以我用手机调试的~,先上两张截图;

/***@author Himi*@Sensor 加速度传感器 ,也称为重力传感器*@SDK 1.5(api 3)就支持传感器了*@解释:此传感器不仅对玩家反转手机的动作可以检测到,而且会根据反转手机的程度,得到传感器的值也会不同!*/
public class MySurfaceView extends SurfaceView implements Callback, Runnable {private Thread th = new Thread(this);private SurfaceHolder sfh;private Canvas canvas;private Paint paint;private SensorManager sm;private Sensor sensor;private SensorEventListener mySensorListener;private int arc_x, arc_y;// 圆形的x,y位置private float x = 0, y = 0, z = 0;public MySurfaceView(Context context) {super(context);this.setKeepScreenOn(true);sfh = this.getHolder();sfh.addCallback(this);paint = new Paint();paint.setAntiAlias(true);setFocusable(true);setFocusableInTouchMode(true);//通过服务得到传感器管理对象sm = (SensorManager) MainActivity.ma.getSystemService(Service.SENSOR_SERVICE);sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);//得到一个重力传感器实例//TYPE_ACCELEROMETER    加速度传感器(重力传感器)类型。//TYPE_ALL              描述所有类型的传感器。//TYPE_GYROSCOPE        陀螺仪传感器类型//TYPE_LIGHT            光传感器类型//TYPE_MAGNETIC_FIELD   恒定磁场传感器类型。//TYPE_ORIENTATION      方向传感器类型。//TYPE_PRESSURE         描述一个恒定的压力传感器类型//TYPE_PROXIMITY        常量描述型接近传感器//TYPE_TEMPERATURE      温度传感器类型描述mySensorListener = new SensorEventListener() {@Override//传感器获取值发生改变时在响应此函数public void onSensorChanged(SensorEvent event) {//备注1//传感器获取值发生改变,在此处理x = event.values[0]; //手机横向翻滚//x>0 说明当前手机左翻 x<0右翻y = event.values[1]; //手机纵向翻滚//y>0 说明当前手机下翻 y<0上翻z = event.values[2]; //屏幕的朝向//z>0 手机屏幕朝上 z<0 手机屏幕朝下arc_x -= x;//备注2arc_y += y;}@Override//传感器的精度发生改变时响应此函数public void onAccuracyChanged(Sensor sensor, int accuracy) {// TODO Auto-generated method stub}};sm.registerListener(mySensorListener, sensor, SensorManager.SENSOR_DELAY_GAME);//第一个参数是传感器监听器,第二个是需要监听的传感实例//最后一个参数是监听的传感器速率类型: 一共一下四种形式//SENSOR_DELAY_NORMAL  正常//SENSOR_DELAY_UI  适合界面//SENSOR_DELAY_GAME  适合游戏  (我们必须选这个呀 哇哈哈~)//SENSOR_DELAY_FASTEST  最快}public void surfaceCreated(SurfaceHolder holder) {arc_x = this.getWidth() / 2 - 25;arc_y = this.getHeight() / 2 - 25;th.start();}public void draw() {try {canvas = sfh.lockCanvas();if (canvas != null) {canvas.drawColor(Color.BLACK);paint.setColor(Color.RED);canvas.drawArc(new RectF(arc_x, arc_y, arc_x + 50,arc_y + 50), 0, 360, true, paint);paint.setColor(Color.YELLOW);canvas.drawText("当前重力传感器的值:", arc_x - 50, arc_y-30, paint);canvas.drawText("x=" + x + ",y=" + y + ",z=" + z,arc_x - 50, arc_y, paint);String temp_str = "Himi提示: ";String temp_str2 = "";String temp_str3 = "";if (x < 1 && x > -1 && y < 1 && y > -1) {temp_str += "当前手机处于水平放置的状态";if (z > 0) {temp_str2 += "并且屏幕朝上";} else {temp_str2 += "并且屏幕朝下,提示别躺着玩手机,对眼睛不好哟~";}} else {if (x > 1) {temp_str2 += "当前手机处于向左翻的状态";} else if (x < -1) {temp_str2 += "当前手机处于向右翻的状态";}if (y > 1) {temp_str2 += "当前手机处于向下翻的状态";} else if (y < -1) {temp_str2 += "当前手机处于向上翻的状态";}if (z > 0) {temp_str3 += "并且屏幕朝上";} else {temp_str3 += "并且屏幕朝下,提示别躺着玩手机,对眼睛不好哟~";}}paint.setTextSize(20);canvas.drawText(temp_str, 0, 50, paint);canvas.drawText(temp_str2, 0, 80, paint);canvas.drawText(temp_str3, 0, 110, paint);}} catch (Exception e) {Log.v("Himi", "draw is Error!");} finally {sfh.unlockCanvasAndPost(canvas);}}@Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {draw();try {Thread.sleep(100);} catch (Exception ex) {}}}public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}public void surfaceDestroyed(SurfaceHolder holder) {}
}

备注1:

SensorEventListener的onSensorChanged事件将返回SensorEvent对象,包含Sensor的最新数据,通过event.values获得一个float[]数组!对于不同的传感器类型,其数组包含的元素个数是不同的,重力传感器总是返回一个长度为3的数组,分别代表X、Y和Z方向的数值。Z轴表示了手机是屏幕朝上还是屏幕朝下;

这里还要注意你当前手机处于 纵向, 还是横向,因为这个会影响我们的X,Y表示的意思!

如果当前手机是纵向屏幕:

x>0 说明当前手机左翻 x<0右翻

y>0 说明当前手机下翻 y<0上翻

如果当前手机是横向屏幕:

x>0 说明当前手机下翻 x<0上翻

y>0 说明当前手机右翻 y<0左翻

我要提醒各位童鞋:

1.要考虑玩家当前拿手机的姿势,例如竖屏,横屏

2.根据横竖屏幕的不同,虽然屏幕坐标系会自动改变,但是传感器的值不会自动改变坐标系!所以为什么会横屏竖屏改变的时候我们从传感器中取出的值表示的动作不一样的原因!!!因此大家游戏开发的时候对于人物移动、图片移动等等操作的时候,手势X,Y的正负值代表什么一定要想清楚!否则玩家会玩着玩着吐的 (太晕了!)- -、

备注2 :

这里本应该arc_x+=x;但是因为当前我屏幕是纵向!造成x>0的手势表示玩家将手机左翻了,但是我们屏幕的圆形应该根据人的反转相对应的移动,那么这里玩家将手机左翻,我们就应该让原型的X坐标减少!所以这里写成了arc_x-=x;!

总结一下: 对于传感器的虽然本章只是讲了一个重力传感器,但是一个足够了,因为如果你想使用其他的传感器,那么你只要以下步骤就OK:

1. 利用 SensorManager.getDefaultSensor();传入一个你想要的传感器的参数得到其实例!

2.注册!

3.在监听器里处理事件!

OK!就是这么简单、

源码下载:    “重力传感器+源码.rar”          下载地址:  http://vdisk.weibo.com/s/hq4DY

【Android游戏开发十八】解放手指,利用传感器开发游戏!(本文讲解在SurfaceView中用重力传感器控制圆球的各方向移动)相关推荐

  1. Android绘图Canvas十八般武器之Shader详解及实战篇(上)

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有java层的,也有jni层深入到Frame ...

  2. Android绘图Canvas十八般武器之Shader详解及实战篇(下)

    前言 上一篇<Android绘图Canvas十八般武器之Shader篇(上)> 我们知道了Bitmap的用法,及TileMode的详细情况.接下来,这一篇作为整个知识体系的下半部要讲的是S ...

  3. 【Android游戏开发十八】解放手指,利用传感器开发游戏!

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/344.html 前 ...

  4. 吸引女性玩家来玩游戏的十八个关键要素

    如何可以吸引女性玩家来玩游戏?个人认为,如果能够清楚的知道她们喜欢什么,讨厌什么,知道她们的思维是很关键的.于是便有了我现在的这篇文章. 一.游戏的操作不能复杂 1.对游戏的操作要求 游戏对玩家操作方 ...

  5. Android进阶(二十八)上下文菜单ContextMenu使用案例

    上下文菜单ContextMenu使用案例 前言 回顾之前的应用程序,发现之前创建的选项菜单无法显示了.按照正常逻辑来说,左图中在"商品信息"一栏中应该存在选项菜单,用户可进行分享等 ...

  6. Android 项目必备(八)--> APP 的开发流程

    文章目录 一.正常的互联网开发 App 的流程 二.快速搭建项目 三.定开发规范 四.选用开发库 五.第三方服务集成 六.云测 一.正常的互联网开发 App 的流程 产品规划,定产品方向 需求调研,产 ...

  7. 跟燕十八学习PHP-第十三天-常用数组函数讲解

    /**  燕十八 公益PHP培训  课堂地址:YY频道88354001  学习社区:www.zixue.it  **/ <?php // 数组函数讲解 /* count 函数 作用:计算数组的单 ...

  8. C++的学习心得和知识总结(十八)|基于EasyX实现 2048游戏 项目(C/C++版)

    目录结构 注:提前言明 本文借鉴了以下博主.书籍或网站的内容,其列表如下: 1.网络热门游戏 2048,点击前往 2.EasyX官方链接,点击前往 3.中国色谱 颜色代码对照表(RGB多用于easyX ...

  9. PhoneGap对比html5写android应用程序【android进化三十八】

    什么是PhoneGap,其实就是在手机中可以写html代码的插件,下面一段话来源网摘"PhoneGap是一个开放源代码的,跨平台的构建移动应用程序的框架.在PhoneGap中,完全通过HTM ...

最新文章

  1. 数据库名、实例名、数据库域名、全局数据库名、服务名,
  2. 软件接口数据一致性机制
  3. 微软对学生免费提供Visual Studio等开发软件(包括中国)
  4. pcDuino 软件更新
  5. UC神马数据采集api
  6. 剑指offer:序列化二叉(前序遍历+层次)
  7. 注册表把html设置成桌面,[注册表] 将Windows 10默认应用程序设置页面添加到桌面右键菜单中...
  8. codevs 4189 字典
  9. swift流行UI库(github)
  10. 【UVA140】Bandwidth(最优性剪枝+全排列+思路)
  11. 深入浅出mysql数据开发_深入浅出MySQL数据库开发、优化与管理维护 PDF扫描版[513KB]...
  12. c语言实现通讯录(详解)
  13. BC26连接阿里云,MQTT协议,AT流程和STM32代码实现
  14. VS2010 由于应用程序配置不正确,程序未能启动”--原因及解决方法
  15. 百度地图 baidu-map 地图根据范围画圈
  16. mysql 格林时间转换_oracle中将格林威治时间转化为一般时间
  17. 2019中国区块链开发者大会 | Conflux 伍鸣:性能问题仍是区块链的应用阻碍
  18. 扒皮下音悦台的“返回顶部”图标效果
  19. 深度搜索解决数独游戏
  20. 新浪微博自动推广专家破解版 自动点赞、评论

热门文章

  1. 赛效:怎么将PPT转为PDF
  2. 2023电商运营关于淘宝猜你喜欢玩法
  3. 常规onerror 的使用 和 vue 里面的onerror使用
  4. 在 Anki 中直接进行网页搜索
  5. 树莓派-- NOOBS安装
  6. linux创建文件系统方法,linux创建文件系统方法
  7. 个人中心 (二) 01-编辑资料-基础布局-Popup弹出层-底部弹出-头像男女时间 DatetimePicker时间选择转换-dayjs(value).format('YYYY-MM-DD')
  8. python序列解包求水仙花数_790.琉璃菜的糖浆欠火或过火,都会影响成品的( )。
  9. Java神秘的抽象类,模板设计模式
  10. Open with Live Server 无法打开浏览器