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

简介:

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

 一:什么是传感器:

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

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

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

    2. 陀螺仪传感器

    3. 光传感器

    5. 恒定磁场传感器

    6. 方向传感器

    7. 恒定的压力传感器

    8. 接近传感器

    9. 温度传感器

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

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

  

 


  
  
  1. /**  
  2.  *@author Himi  
  3.  *@Sensor 加速度传感器 ,也称为重力传感器   
  4.  *@SDK 1.5(api 3)就支持传感器了  
  5.  *@解释:此传感器不仅对玩家反转手机的动作可以检测到,而且会根据反转手机的程度,得到传感器的值也会不同!  
  6.  */  
  7. public class MySurfaceView extends SurfaceView implements Callback, Runnable {  
  8.     private Thread th = new Thread(this);  
  9.     private SurfaceHolder sfh;  
  10.     private Canvas canvas;  
  11.     private Paint paint;  
  12.     private SensorManager sm;  
  13.     private Sensor sensor;  
  14.     private SensorEventListener mySensorListener;  
  15.     private int arc_x, arc_y;// 圆形的x,y位置  
  16.     private float x = 0y = 0z = 0;  
  17.     public MySurfaceView(Context context) {  
  18.         super(context);  
  19.         this.setKeepScreenOn(true);  
  20.         sfh = this.getHolder();  
  21.         sfh.addCallback(this);  
  22.         paint = new Paint();  
  23.         paint.setAntiAlias(true);  
  24.         setFocusable(true);  
  25.         setFocusableInTouchMode(true);  
  26.         //通过服务得到传感器管理对象   
  27.         sm = (SensorManager) MainActivity.ma.getSystemService(Service.SENSOR_SERVICE);  
  28.         sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);//得到一个重力传感器实例  
  29.         //TYPE_ACCELEROMETER    加速度传感器(重力传感器)类型。  
  30.         //TYPE_ALL              描述所有类型的传感器。  
  31.         //TYPE_GYROSCOPE        陀螺仪传感器类型  
  32.         //TYPE_LIGHT            光传感器类型  
  33.         //TYPE_MAGNETIC_FIELD   恒定磁场传感器类型。  
  34.         //TYPE_ORIENTATION      方向传感器类型。  
  35.         //TYPE_PRESSURE         描述一个恒定的压力传感器类型  
  36.         //TYPE_PROXIMITY        常量描述型接近传感器  
  37.         //TYPE_TEMPERATURE      温度传感器类型描述  
  38.         mySensorListener = new SensorEventListener() {  
  39.             @Override  
  40.             //传感器获取值发生改变时在响应此函数  
  41.             public void onSensorChanged(SensorEvent event) {//备注1   
  42.                 //传感器获取值发生改变,在此处理   
  43.                 x = event.values[0]; //手机横向翻滚  
  44.                 //x>0 说明当前手机左翻 x<0右翻       
  45.                 y = event.values[1]; //手机纵向翻滚  
  46.                 //y>0 说明当前手机下翻 y<0上翻  
  47.                 z = event.values[2]; //屏幕的朝向  
  48.                 //z>0 手机屏幕朝上 z<0 手机屏幕朝下  
  49.                 arc_x -x;//备注2  
  50.                 arc_y += y;  
  51.             }  
  52.             @Override  
  53.             //传感器的精度发生改变时响应此函数  
  54.             public void onAccuracyChanged(Sensor sensor, int accuracy) {  
  55.                 // TODO Auto-generated method stub  
  56.             }  
  57.         };  
  58.         sm.registerListener(mySensorListener, sensor, SensorManager.SENSOR_DELAY_GAME);  
  59.         //第一个参数是传感器监听器,第二个是需要监听的传感实例  
  60.         //最后一个参数是监听的传感器速率类型: 一共一下四种形式  
  61.         //SENSOR_DELAY_NORMAL  正常  
  62.         //SENSOR_DELAY_UI  适合界面  
  63.         //SENSOR_DELAY_GAME  适合游戏  (我们必须选这个呀 哇哈哈~)  
  64.         //SENSOR_DELAY_FASTEST  最快  
  65.     }  
  66.     public void surfaceCreated(SurfaceHolder holder) {  
  67.         arc_x = this.getWidth() / 2 - 25;  
  68.         arc_y = this.getHeight() / 2 - 25;  
  69.         th.start();  
  70.     }  
  71.     public void draw() {  
  72.         try {  
  73.             canvas = sfh.lockCanvas();  
  74.             if (canvas != null) {  
  75.                 canvas.drawColor(Color.BLACK);  
  76.                 paint.setColor(Color.RED);  
  77.                 canvas.drawArc(new RectF(arc_x, arc_y, arc_x + 50,  
  78.                         arc_y + 50), 0, 360, true, paint);  
  79.                 paint.setColor(Color.YELLOW);  
  80.                 canvas.drawText("当前重力传感器的值:", arc_x - 50, arc_y-30, paint);  
  81.                 canvas.drawText("x=" + x + ",y=" + y + ",z=" + z,  
  82.                         arc_x - 50, arc_y, paint);  
  83.                 String temp_str = "Himi提示: ";  
  84.                 String temp_str2 = "";  
  85.                 String temp_str3 = "";  
  86.                 if (x < 1 && x > -1 && y < 1 && y > -1) {  
  87.                     temp_str += "当前手机处于水平放置的状态";  
  88.                     if (z > 0) {  
  89.                         temp_str2 += "并且屏幕朝上";  
  90.                     } else {  
  91.                         temp_str2 += "并且屏幕朝下,提示别躺着玩手机,对眼睛不好哟~";  
  92.                     }  
  93.                 } else {  
  94.                     if (x > 1) {  
  95.                         temp_str2 += "当前手机处于向左翻的状态";  
  96.                     } else if (x < -1) {  
  97.                         temp_str2 += "当前手机处于向右翻的状态";  
  98.                     }  
  99.                     if (y > 1) {  
  100.                         temp_str2 += "当前手机处于向下翻的状态";  
  101.                     } else if (y < -1) {  
  102.                         temp_str2 += "当前手机处于向上翻的状态";  
  103.                     }  
  104.                     if (z > 0) {  
  105.                         temp_str3 += "并且屏幕朝上";  
  106.                     } else {  
  107.                         temp_str3 += "并且屏幕朝下,提示别躺着玩手机,对眼睛不好哟~";  
  108.                     }  
  109.                 }  
  110.                 paint.setTextSize(20);  
  111.                 canvas.drawText(temp_str, 0, 50, paint);  
  112.                 canvas.drawText(temp_str2, 0, 80, paint);  
  113.                 canvas.drawText(temp_str3, 0, 110, paint);  
  114.             }  
  115.         } catch (Exception e) {  
  116.             Log.v("Himi", "draw is Error!");  
  117.         } finally {  
  118.             sfh.unlockCanvasAndPost(canvas);  
  119.         }  
  120.     }  
  121.     @Override  
  122.     public void run() {  
  123.         // TODO Auto-generated method stub  
  124.         while (true) {  
  125.             draw();  
  126.             try {  
  127.                 Thread.sleep(100);  
  128.             } catch (Exception ex) {  
  129.             }  
  130.         }  
  131.     }  
  132.     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  
  133.     }  
  134.     public void surfaceDestroyed(SurfaceHolder holder) {  
  135.     }  

 

 备注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!就是这么简单、

 源码下载地址: http://www.himigame.com/android-game/344.html










本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/606801,如需转载请自行联系原作者
目录
相关文章
|
6天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
8天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
10天前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
【10月更文挑战第35天】在数字化时代,安卓应用的开发成为了一个热门话题。本文旨在通过浅显易懂的语言,带领初学者了解安卓开发的基础知识,同时为有一定经验的开发者提供进阶技巧。我们将一起探讨如何从零开始构建第一个安卓应用,并逐步深入到性能优化和高级功能的实现。无论你是编程新手还是希望提升技能的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
8天前
|
存储 API 开发工具
探索安卓开发:从基础到进阶
【10月更文挑战第37天】在这篇文章中,我们将一起探索安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和建议。我们将从安卓开发的基础开始,逐步深入到更复杂的主题,如自定义组件、性能优化等。最后,我们将通过一个代码示例来展示如何实现一个简单的安卓应用。让我们一起开始吧!
|
9天前
|
存储 XML JSON
探索安卓开发:从新手到专家的旅程
【10月更文挑战第36天】在这篇文章中,我们将一起踏上一段激动人心的旅程,从零基础开始,逐步深入安卓开发的奥秘。无论你是编程新手,还是希望扩展技能的老手,这里都有适合你的知识宝藏等待发掘。通过实际的代码示例和深入浅出的解释,我们将解锁安卓开发的关键技能,让你能够构建自己的应用程序,甚至贡献于开源社区。准备好了吗?让我们开始吧!
22 2
|
10天前
|
Android开发
布谷语音软件开发:android端语音软件搭建开发教程
语音软件搭建android端语音软件开发教程!
|
17天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
28 5
|
15天前
|
JSON Java Android开发
探索安卓开发之旅:打造你的第一个天气应用
【10月更文挑战第30天】在这个数字时代,掌握移动应用开发技能无疑是进入IT行业的敲门砖。本文将引导你开启安卓开发的奇妙之旅,通过构建一个简易的天气应用来实践你的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你宝贵的学习资源。我们将一步步地深入到安卓开发的世界中,从搭建开发环境到实现核心功能,每个环节都充满了发现和创造的乐趣。让我们开始吧,一起在代码的海洋中航行!
|
16天前
|
缓存 数据库 Android开发
安卓开发中的性能优化技巧
【10月更文挑战第29天】在移动应用的海洋中,性能是船只能否破浪前行的关键。本文将深入探讨安卓开发中的性能优化策略,从代码层面到系统层面,揭示如何让应用运行得更快、更流畅。我们将以实际案例和最佳实践为灯塔,引领开发者避开性能瓶颈的暗礁。
35 3
|
13天前
|
移动开发 Java Android开发
探索Android与iOS开发的差异性与互联性
【10月更文挑战第32天】在移动开发的大潮中,Android和iOS两大平台各领风骚。本文将深入浅出地探讨这两个平台的开发差异,并通过实际代码示例,展示如何在各自平台上实现相似的功能。我们将从开发环境、编程语言、用户界面设计、性能优化等多个角度进行对比分析,旨在为开发者提供跨平台开发的实用指南。
36 0