热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android重力传感器在游戏开发中的应用

本文主要介绍Android重力传感器,这里整理了详细的资料,并且详细的说明重力传感器的使用方法,有兴趣的小伙伴可以参考下

      手势操作可以说是智能手机的一种魅力所在,前两节给大家讲解了两种有趣的手势操作,将它们置于游戏当中,大大提升了游戏的可玩性和趣味性。本节将继续介绍智能手机的另一种神奇之处:传感器。

       一、何为传感器

       所谓传感器就是能够探测如光、热、温度、重力、方向等等的装置。

       二、Android提供了哪些传感器

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

       2、陀螺仪传感器

       3、光传感器

       4、恒定磁场传感器

       5、方向传感器

       6、恒定的压力传感器

       7、接近传感器

       8、温度传感器

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

       三、传感器实例讲解

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

        下面贴代码:

Java代码

/** 
 *@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;//备注2  
        arc_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);  
    }  
  }  
  @Override 
  public void run() {  
    // TODO Auto-generated method stub  
    while (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;。

       总结

       虽然本节只讲了重力传感器这一种,但已经足够了,因为如果你想使用其他的传感器,只要按以下步骤操作就可以:

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

       2、注册;

       3、在监听器里处理事件。

       其实并不难,你也可以让自己的游戏有各种感应效果了。

       以上就对Android 重力传感器的资料整理,后续继续补充相关知识,谢谢大家对本站的支持!


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
author-avatar
手机用户2602889575
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有