Android 重力传感器在游戏开发中的应用
作者:lqh 发布时间:2021-11-27 05:54:09
手势操作可以说是智能手机的一种魅力所在,前两节给大家讲解了两种有趣的手势操作,将它们置于游戏当中,大大提升了游戏的可玩性和趣味性。本节将继续介绍智能手机的另一种神奇之处:传感器。
一、何为传感器
所谓传感器就是能够探测如光、热、温度、重力、方向等等的装置。
二、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对手机相册中的图片的压缩和上传到服务器上,这样的功
- 最近有个粉丝提了个问题,说他在Spring Security中用JWT做退出登录的时无法获取当前用户,导致无法证明“我就是要退出的那个我”,
- 说明:基于atguigu学习笔记。简介Webflux是 Spring5 添加新的模块,用于 web 开发的,功能和 SpringMVC 类似
- 普通商户分账功能分账比例:目前只有”低比例分账“小于等于30%分账,分账金额需要减去(千6)手续费.每一张订单只能分发,当前订单总额的百分之
- 1. 背景Java Persistence with Hibernate 在12.2.1小节使用如下例子描述 n+1查询问题:List<
- 本文实例讲述了C#自定义控件实现TextBox禁止粘贴的方法。分享给大家供大家参考,具体如下:开发环境:Visual Studio .net
- 前提其实很多框架都是对另一个框架的封装,我们在学习类似的框架的时候,难免会进入误区,所以我们就应该对其进行总结归纳,对比。本文就是对hibe
- 因为最近重新看了泛型,又看了些反射,导致我对Object、T(以下代指泛型)、?产生了疑惑。我们先来试着理解一下Object类,学习Java
- 概述在JAVA JDK8 List分组的实现和用法一文中介绍了JDK 8如何对list进行分组,但是没有提到如何在分组后,获取每个分组的第一
- @Cacheable在同一类中方法调用无效上述图片中,同一个类中genLiveBullets()方法调用同类中的queryLiveByRoo
- 一、网络保存数据介绍可以使用网络来保存数据,在需要的时候从网络上获取数据,进而显示在App中。用网络保存数据的方法有很多种,对于不同的网络数
- 近来复习数据结构,自己动手实现了栈。栈是一种限制插入和删除只能在一个位置上的表。最基本的操作是进栈和出栈,因此,又被叫作“先进后出”表。首先
- Service翻译成中文是服务,熟悉Windows 系统的同学一定很熟悉了。Android里的Service跟Windows里的Servic
- 首先是main.xml文件代码如下:<LinearLayout xmlns:android="http://schemas.
- Spring Cache设置缓存条件原理从Spring3.1开始,Spring框架提供了对Cache的支持,提供了一个对缓存使用的抽象,通过
- 外观模式: 又称门面模式: 外观Facade为子系统的一组接口提供一个一致界面,使得这组子系统易于使用(通过引入一个新的外观角色降低原系统复
- 直接调用HashKit.sha1(String str)方法就可以了,,返回的是16进制的字符串长度是40,也就是用md.digest()方
- /*同步函数当函数中的代码全部放在了同步代码块中,那么这个函数就是同步函数*///同步函数的锁是this锁,this是一个引用,this指向
- 本文实例为大家分享了Android RxJava创建操作符Timer的具体代码,供大家参考,具体内容如下之前有写过Android实现倒计时之
- 最近做一个需求,需求中的bean只用于生成一次json使用,所以想通过配置来动态的生成,查了一下,java还真有这个实现。java动态的生成