【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天前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
2天前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
18 7
|
6天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台解决方案
【9月更文挑战第27天】在移动应用开发的广阔天地中,安卓和iOS两大操作系统如同双子星座般耀眼。开发者们在这两大平台上追逐着创新的梦想,却也面临着选择的难题。如何在保持高效的同时,实现跨平台的开发?本文将带你探索跨平台开发的魅力所在,揭示其背后的技术原理,并通过实际案例展示其应用场景。无论你是安卓的忠实拥趸,还是iOS的狂热粉丝,这篇文章都将为你打开一扇通往跨平台开发新世界的大门。
|
3天前
|
缓存 Java Linux
探索安卓开发:从新手到专家的旅程
【9月更文挑战第30天】在这篇文章中,我们将一起踏上一段激动人心的旅程,探索安卓开发的广阔世界。无论你是刚入门的新手,还是希望提升技能的开发者,本文都将为你提供宝贵的知识和指导。我们将深入探讨安卓开发的基础知识、关键概念、实用工具和最佳实践,帮助你在安卓开发领域取得更大的成功。让我们一起开启这段精彩的旅程吧!
|
3天前
|
监控 安全 Java
Kotlin 在公司上网监控中的安卓开发应用
在数字化办公环境中,公司对员工上网行为的监控日益重要。Kotlin 作为一种基于 JVM 的编程语言,具备简洁、安全、高效的特性,已成为安卓开发的首选语言之一。通过网络请求拦截,Kotlin 可实现网址监控、访问时间记录等功能,满足公司上网监控需求。其简洁性有助于快速构建强大的监控应用,并便于后续维护与扩展。因此,Kotlin 在安卓上网监控应用开发中展现出广阔前景。
7 1
|
14天前
|
Android开发 开发者
安卓开发中的自定义视图:从入门到精通
【9月更文挑战第19天】在安卓开发的广阔天地中,自定义视图是一块充满魔力的土地。它不仅仅是代码的堆砌,更是艺术与科技的完美结合。通过掌握自定义视图,开发者能够打破常规,创造出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战应用,一步步展示如何用代码绘出心中的蓝图。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往创意和效率的大门。让我们一起探索自定义视图的秘密,将你的应用打造成一件艺术品吧!
38 10
|
7天前
|
存储 开发工具 Android开发
使用.NET MAUI开发第一个安卓APP
【9月更文挑战第24天】使用.NET MAUI开发首个安卓APP需完成以下步骤:首先,安装Visual Studio 2022并勾选“.NET Multi-platform App UI development”工作负载;接着,安装Android SDK。然后,创建新项目时选择“.NET Multi-platform App (MAUI)”模板,并仅针对Android平台进行配置。了解项目结构,包括`.csproj`配置文件、`Properties`配置文件夹、平台特定代码及共享代码等。
|
13天前
|
存储 Java Android开发
🔥Android开发大神揭秘:从菜鸟到高手,你的代码为何总是慢人一步?💻
在Android开发中,每位开发者都渴望应用响应迅速、体验流畅。然而,代码执行缓慢却是常见问题。本文将跟随一位大神的脚步,剖析三大典型案例:主线程阻塞导致卡顿、内存泄漏引发性能下降及不合理布局引起的渲染问题,并提供优化方案。通过学习这些技巧,你将能够显著提升应用性能,从新手蜕变为高手。
16 2
|
14天前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
54 1
|
6天前
|
搜索推荐 前端开发 Android开发
安卓开发中的自定义视图:打造个性化用户界面
【9月更文挑战第26天】在移动应用开发的广阔天地中,定制性是提升用户体验的不二法宝。本文将带你深入了解安卓开发中自定义视图的魅力所在,通过简洁明了的语言和直观的代码示例,展示如何从零开始创建属于自己的控件,让你的应用界面与众不同。
下一篇
无影云桌面