Android 중력 센서 의 게임 개발 에서 의 응용

8005 단어 Android중력 센서
제스처 조작 은 스마트 폰 의 매력 이 라 고 할 수 있다.앞의 두 절 은 두 가지 재 미 있 는 제스처 조작 을 설명 하고 이 를 게임 에 넣 어 게임 의 가용성 과 재 미 를 크게 향상 시 켰 다.이 절 은 스마트 폰 의 또 다른 신기 한 점 인 센서 를 계속 소개 한다.
       센서
       센서 란 빛,열,온도,중력,방향 등 을 탐지 할 수 있 는 장치 다.
       2.안 드 로 이 드 는 어떤 센서 를 제공 합 니까?
       1.가속도 센서(중력 센서)
       2.자 이 로 센서
       3.광 센서
       4.고정 자장 센서
       5.방향 센서
       6.고정된 압력 센서
       7.근접 센서
       8.온도 센서
       오늘 우리 가 여러분 에 게 소개 하 는 것 은 게임 개발 에서 가장 흔히 볼 수 있 는,사용 빈도 가 가장 높 은 센서 인 가속도 센서(중력 센서)입 니 다!
       3.센서 인 스 턴 스 설명
       시 뮬 레이 터 가 테스트 할 수 없 기 때문에 핸드폰 으로 디 버 깅 을 했 습 니 다.먼저 두 장의 캡 처 를 했 습 니 다.

        다음 코드 붙 이기:
자바 코드

/** 
 *@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 의 onSensor Changed 이 벤트 는 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:
       여 긴 arcx+=x;근 데 지금 제 화면 이 세로 라 서!x>0 의 손짓 은 게이머 들 이 핸드폰 을 왼쪽 으로 뒤 집 었 다 는 것 을 나타 낸다.그러나 우리 화면의 원형 은 사람의 반전 에 따라 대응 하 는 이동 을 해 야 한다.그러면 여기 게이머 들 이 핸드폰 을 왼쪽 으로 뒤 집 으 면 우 리 는 원형 X 좌 표를 감소 시 켜 야 한다!그래서 여기 arc 라 고 썼어 요.x-=x;。
       총결산
       이 절 은 중력 센서 라 는 것 만 말 했 지만 이미 충분 합 니 다.다른 센서 를 사용 하고 싶다 면 다음 절 차 를 따라 조작 하면 되 기 때 문 입 니 다.
       1.SensorManager.getDefaultSensor()를 이용 합 니 다.원 하 는 센서 의 인 자 를 입력 하여 인 스 턴 스 를 얻 습 니 다.
       2.등록;
       3.모니터 에서 사건 을 처리 합 니 다.
       사실 어렵 지 않 습 니 다.당신 도 자신의 게임 에 여러 가지 감응 효 과 를 가 질 수 있 습 니 다.
       이상 은 안 드 로 이 드 중력 센서 에 대한 자 료 를 정리 하고 관련 지식 을 계속 보충 하 겠 습 니 다.본 사이트 에 대한 지원 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기