前兩篇都是向大家介紹了很有意思的兩種手勢操作,嵌入我們游戲中,不得不說讓游戲的自由度、可玩性和趣味性都增色不少!那么今天繼續(xù)給大家介紹一亮點!傳感器!
一:什么是傳感器:
所謂傳感器能夠探測如光、熱、溫度、重力、方向 等等的功能!
二:Android中提供傳感器有哪些:
1. 加速度傳感器(重力傳感器)
2. 陀螺儀傳感器
3. 光傳感器
5. 恒定磁場傳感器
6. 方向傳感器
7. 恒定的壓力傳感器
8. 接近傳感器
9. 溫度傳感器
今天我們給大家介紹的是游戲開發(fā)中最最常見的,用到的頻率最高的一種傳感器,加速度傳感器(重力傳感器)!
因為模擬器無法測試,所以我用手機(jī)調(diào)試的~,先上兩張截圖;

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
-
-
-
-
-
-
- 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;
- 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);
-
-
-
-
-
-
-
-
-
- mySensorListener = new SensorEventListener() {
- @Override
-
- public void onSensorChanged(SensorEvent event) {
-
- x = event.values[0];
-
- y = event.values[1];
-
- z = event.values[2];
-
- arc_x -= x;
- arc_y += y;
- }
- @Override
-
- public void onAccuracyChanged(Sensor sensor, int accuracy) {
-
- }
- };
- sm.registerListener(mySensorListener, sensor, SensorManager.SENSOR_DELAY_GAME);
-
-
-
-
-
-
- }
- 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("當(dāng)前重力傳感器的值:", 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 += "當(dāng)前手機(jī)處于水平放置的狀態(tài)";
- if (z > 0) {
- temp_str2 += "并且屏幕朝上";
- } else {
- temp_str2 += "并且屏幕朝下,提示別躺著玩手機(jī),對眼睛不好喲~";
- }
- } else {
- if (x > 1) {
- temp_str2 += "當(dāng)前手機(jī)處于向左翻的狀態(tài)";
- } else if (x < -1) {
- temp_str2 += "當(dāng)前手機(jī)處于向右翻的狀態(tài)";
- }
- if (y > 1) {
- temp_str2 += "當(dāng)前手機(jī)處于向下翻的狀態(tài)";
- } else if (y < -1) {
- temp_str2 += "當(dāng)前手機(jī)處于向上翻的狀態(tài)";
- }
- if (z > 0) {
- temp_str3 += "并且屏幕朝上";
- } else {
- temp_str3 += "并且屏幕朝下,提示別躺著玩手機(jī),對眼睛不好喲~";
- }
- }
- 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() {
-
- 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的最新數(shù)據(jù),通過event.values獲得一個float[]數(shù)組!對于不同的傳感器類型,其數(shù)組包含的元素個數(shù)是不同的,重力傳感器總是返回一個長度為3的數(shù)組,分別代表X、Y和Z方向的數(shù)值。Z軸表示了手機(jī)是屏幕朝上還是屏幕朝下;
這里還要注意你當(dāng)前手機(jī)處于 縱向, 還是橫向,因為這個會影響我們的X,Y表示的意思!
如果當(dāng)前手機(jī)是縱向屏幕:
x>0 說明當(dāng)前手機(jī)左翻 x<0右翻
y>0 說明當(dāng)前手機(jī)下翻 y<0上翻
如果當(dāng)前手機(jī)是橫向屏幕:
x>0 說明當(dāng)前手機(jī)下翻 x<0上翻
y>0 說明當(dāng)前手機(jī)右翻 y<0左翻
我要提醒各位童鞋:
1.要考慮玩家當(dāng)前拿手機(jī)的姿勢,例如豎屏,橫屏
2.根據(jù)橫豎屏幕的不同,雖然屏幕坐標(biāo)系會自動改變,但是傳感器的值不會自動改變坐標(biāo)系!所以為什么會橫屏豎屏改變的時候我們從傳感器中取出的值表示的動作不一樣的原因?。?!因此大家游戲開發(fā)的時候?qū)τ谌宋镆苿?、圖片移動等等操作的時候,手勢X,Y的正負(fù)值代表什么一定要想清楚!否則玩家會玩著玩著吐的(太暈了!)- -、
備注2 :
這里本應(yīng)該arc_x+=x;但是因為當(dāng)前我屏幕是縱向!造成x>0的手勢表示玩家將手機(jī)左翻了,但是我們屏幕的圓形應(yīng)該根據(jù)人的反轉(zhuǎn)相對應(yīng)的移動,那么這里玩家將手機(jī)左翻,我們就應(yīng)該讓原型的X坐標(biāo)減少!所以這里寫成了arc_x-=x;!
總結(jié)一下: 對于傳感器的雖然本章只是講了一個重力傳感器,但是一個足夠了,因為如果你想使用其他的傳感器,那么你只要以下步驟就OK:
1. 利用 SensorManager.getDefaultSensor();傳入一個你想要的傳感器的參數(shù)得到其實例!
2.注冊!
3.在監(jiān)聽器里處理事件!
OK!就是這么簡單、
下一章講解粒子系統(tǒng)!
源碼下載地址:http://download.csdn.net/source/2985714