【Android遊戲開發十八】解放手指,利用感應器開發遊戲!

來源:互聯網
上載者:User

 

前兩篇都是向大家介紹了很有意思的兩種手勢操作,嵌入我們遊戲中,不得不說讓遊戲的自由度、可玩性和趣味性都增色不少!那麼今天繼續給大家介紹一亮點!感應器!

 

一:什麼是感應器:

     所謂感應器能夠探測如光、熱、溫度、重力、方向 等等的功能!

 

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

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

     2.  陀螺儀感應器

     3.  光感應器

     5.  恒定磁場感應器

     6.  方向感應器

     7.  恒定的壓力感應器

     8.  接近感應器

     9.  溫度感應器

 

今天我們給大家介紹的是遊戲開發中最最常見的,用到的頻率最高的一種感應器,加速度感應器(重力感應器)!

 

因為模擬器無法測試,所以我用手機調試的~,先上兩張;

 


 

                 

 

 

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

/**

 *@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;!

 

 

總結一下: 對於感應器的雖然本章只是講了一個重力感應器,但是一個足夠了,因為如果你想使用其他的感應器,那麼你只要以下步驟就OK:

1. 利用SensorManager.getDefaultSensor();傳入一個你想要的感應器的參數得到其執行個體!

2.註冊!

3.在監聽器裡處理事件!

OK!就是這麼簡單、

 

                                                          

源碼: http://www.bkjia.com/uploadfile/2011/1115/20111115051806107.rar

 

Himi  原創, 歡迎轉載,轉載請在明顯處註明! 謝謝。

原文地址:http://blog.csdn.net/xiaominghimi/archive/2011/01/16/6143520.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.