Android 물리 게임 의 중력 시스템 개발 예시 코드

9255 단어 Android중력 계통
이 절 은 여러분 에 게 물리 게임 에 관 한 지식 을 제공 하고 간단 한 원형 자유 낙하 데모 의 작성 을 설명 합 니 다.본 고 에서 소개 하고 자 하 는 중력 시스템 은 사실상 유사 하 다.
       중력 센서 에서 저 는 원형 이 핸드폰 의 반전 각도 에 따라 서로 다른 속 도 를 가 집 니 다.그러나 그 안에 가속도 알고리즘 이 내장 되 어 있 는 것 은 모두 Android os 로 봉 인 된 것 입 니 다.오늘 우리 가 말 하고 자 하 는 중력 시스템 은 바로 이 속 도 를 모 의 하여 자 유 롭 게 떨 어 지 는 원형 을 만 드 는 것 입 니 다.현실 의 고무공 처럼 질 적 이 고 양 이 있 는 것 같 습 니 다!떨 어 질 때 속도 가 빨 라 지고 튕 겨 나 오 면 속도 가 점점 줄어든다.
       먼저 두 장의 효과 캡 처 를 붙 여 여러분 에 게 직관 적 인 이 해 를 한 다음 에 상세 하 게 설명 하 겠 습 니 다.


원형 자유 낙하 데모 안내
       시 뮬 레이 터 의 임의의 버튼 을 눌 렀 을 때 랜 덤 으로 화면 에 랜 덤 크기,랜 덤 색상,랜 덤 위치,끊임없이 반 짝 이 는 원형 을 생 성 합 니 다.그리고 원형 은 중력 을 가지 고 있 습 니 다.자유 낙하 체 를 할 때 원형 이 화면 밑 에 닿 았 을 때 반 짝 이 고 반 짝 이 는 높이 가 한 번 에 낮 습 니 다!(허허,약간 H 를 가지 고 놀다 가 버튼 을 미 친 듯 이 눌 러 서 화면 이 온통-)
       이 실례 에서 보기 위해 서 나 는 원형 을 최종 적 으로 멈 추 게 하지 않 고 한 높이 에서 계속 반등 하고 떨 어 질 것 이다.
       그리고 한 가 지 는 원형 이 고도 로 자유 낙하 할 때 X 좌표계 에서 변 하지 않 았 을 수도 있 습 니 다.물론 이것 은 우리 코드 에서 이상 적 인 상태 에 속 합 니 다.현실 생활 에서 보통 X/Y 좌표계 가 변동 이 있 기 때 문 입 니 다.여기 서 Demo 에서 저 는 주로 수직 으로 떨 어 지고 반등 하 는 기능 을 만 들 었 습 니 다.수평 가속도 에 대해 저 는 하지 않 았 습 니 다.첫 번 째 는 수직 적 인 처리 사고 와 거의 일치 하기 때 문 입 니 다.두 번 째 는 시간 이 없습니다~
       됐어,쓸데없는 소리 하지 마!먼저 제 가 정의 한 원형 류 를 소개 하 겠 습 니 다.
자바 코드

package com.himi;  
import java.util.Random;  
import android.graphics.Canvas;  
import android.graphics.Color;  
import android.graphics.Paint;  
import android.graphics.RectF;  
/** 
 * @author Himi 
 * @       
 */ 
public class MyArc {  
  private int arc_x, arc_y, arc_r;//   X,Y       
  private float speed_x = 1.2f, speed_y = 1.2f;//   x、y     
  private float vertical_speed;//     
  private float horizontal_speed;//     ,           
  private final float ACC = 0.135f;//             
  private final float RECESSION = 0.2f;//           
  private boolean isDown = true;//           
  private Random ran;//      
  /** 
   * @          
   * @param x   X   
   * @param y   Y   
   * @param r      
   */ 
  public MyArc(int x, int y, int r) {  
    ran = new Random();  
    this.arc_x = x;  
    this.arc_y = y;  
    this.arc_r = r;  
  }  
  public void drawMyArc(Canvas canvas, Paint paint) {//                 
    paint.setColor(getRandomColor());//         ,       (        )  
    canvas.drawArc(new RectF(arc_x + speed_x, arc_y + speed_y, arc_x + 2 *  
        arc_r + speed_x, arc_y + 2 * arc_r + speed_y), 0, 360, true, paint);  
  }  
  /** 
   * @return 
   * @         
   */ 
  public int getRandomColor() {  
    int ran_color = ran.nextInt(8);  
    int temp_color = 0;  
    switch (ran_color) {  
    case 0:  
      temp_color = Color.WHITE;  
      break;  
    case 1:  
      temp_color = Color.BLUE;  
      break;  
    case 2:  
      temp_color = Color.CYAN;  
      break;  
    case 3:  
      temp_color = Color.DKGRAY;  
      break;  
    case 4:  
      temp_color = Color.RED;  
      break;  
    case 6:  
      temp_color = Color.GREEN;  
    case 7:  
      temp_color = Color.GRAY;  
    case 8:  
      temp_color = Color.YELLOW;  
      break;  
    }  
    return temp_color;  
  }  
  /** 
   *       
   */ 
  public void logic() {//               
    if (isDown) {//        
/*--  1-*/speed_y += vertical_speed;//   Y          
      int count = (int) vertical_speed++;  
      //                    
      //     for (int i = 0; i < vertical_speed++; i++) {}         - -  
      for (int i = 0; i < count; i++) {//  1  
/*--  2-*/ vertical_speed += ACC;  
      }  
    } else {//        
      speed_y -= vertical_speed;  
      int count = (int) vertical_speed--;  
      for (int i = 0; i < count; i++) {  
        vertical_speed -= ACC;  
      }  
    }  
    if (isCollision()) {  
      isDown = !isDown;//                  !  
      vertical_speed -= vertical_speed * RECESSION;//                
    }  
  }  
  /** 
   *            
   * @return 
   * @  true      
   */ 
  public boolean isCollision() {  
    return arc_y + 2 * arc_r + speed_y >= MySurfaceViee.screenH;  
  }  
} 
        비교적 간단 하 다.주로 몇 가지 비 고 를 설명 한다.
       비고 1:
       아마 일부 학생 들 은 이곳 이 약간 어 지 러 운 것 을 보 았 을 것 이다.내 가 설명 하 자 면 모두 가 자 유 롭 게 떨 어 질 때 속도 가 점점 빨 라 지 는 것 을 알 고 있다.이것 은 가속도 의 영향 을 받 는 것 이기 때문에 여기 서 우 리 는 원래 의 원형 y 속 도 를 바탕 으로 가속도!
       여기에 있 는 어린이 신발 은 for 순환 을 간략하게 쓸 수 있다 고 합 니 다.그러면 저 는 여러분 에 게 힌트 를 드 리 겠 습 니 다.

 for (int i = 0; i < count; i++) {

        vertical_speed += ACC;

    }
        상기 코드 는 확실히 한 마디 로 표시 할 수 있다.
       vertical_speed +=ACC*count;     혹은    vertical_speed  =vertical_speed + ACC*count;
       그러나 주의해 야 할 것 은 저 에 게 변 수 는 모두 부동 소수점 이기 때문에 부동 소수점 에 대해 자릿수 제한 이 있다 는 것 을 잘 알 고 있 습 니 다.그러면 저 는 for 로 쓰 면 곱 하기 를 피 할 수 있 습 니 다.만약 에 약자 의 형식 이 얻 은 결과 에 차이 가 있 을 수 있 습 니 다!그 러 니까 조심해.
       그리고 제발 vertical 로 간략하게 쓰 지 마 세 요.speed =(vertical_speed +ACC)*count; 이것 은 잘못된 것 이다!
       비고 2:
       가속도 가 원형 원래 의 속도 에 영향 을 주 었 지만 우리 의 가속도 도 일정 하지 않다.실제 구체 의 자유 낙하 를 모 의 하기 위해 가속도 에 편 이 량 ACC 를 증가 시 켰 을 뿐만 아니 라 그 변화의 규칙 에 대해 모 의 를 해서 다음 가속도 편 이 량 을 배로 증가 시 켜 야 한다.그래서 왜 for 순환 할 때 가속도 의 값 을 for 순환 의 판정 조건 으로 생각 합 니까?
       자,다음은 우리 Surface View 를 보 겠 습 니 다.

package com.himi;  
import java.util.Random;  
import java.util.Vector;  
import android.content.Context;  
import android.graphics.Canvas;  
import android.graphics.Color;  
import android.graphics.Paint;  
import android.util.Log;  
import android.view.KeyEvent;  
import android.view.SurfaceHolder;  
import android.view.SurfaceView;  
import android.view.SurfaceHolder.Callback;  
public class MySurfaceViee extends SurfaceView implements Callback, Runnable {  
  private Thread th;  
  private SurfaceHolder sfh;  
  private Canvas canvas;  
  private Paint paint;  
  private boolean flag;  
  public static int screenW, screenH;  
  private Vector<MyArc> vc;//                 
  private Random ran;//     
  public MySurfaceViee(Context context) {  
    super(context);  
    this.setKeepScreenOn(true);  
    vc = new Vector<MyArc>();  
    ran = new Random();//  1  
    sfh = this.getHolder();  
    sfh.addCallback(this);  
    paint = new Paint();  
    paint.setAntiAlias(true);  
    setFocusable(true);  
  }  
  public void surfaceCreated(SurfaceHolder holder) {  
    flag = true;//           。。。  
    th = new Thread(this);  
    screenW = this.getWidth();  
    screenH = this.getHeight();  
    th.start();  
  }  
  public void draw() {  
    try {  
      canvas = sfh.lockCanvas();  
      canvas.drawColor(Color.BLACK);  
      if (vc != null) {//      ,              
        for (int i = 0; i < vc.size(); i++) {  
          vc.elementAt(i).drawMyArc(canvas, paint);  
        }  
      }  
    } catch (Exception e) {  
      // TODO: handle exception  
    } finally {  
      try {  
        if (canvas != null)  
          sfh.unlockCanvasAndPost(canvas);  
      } catch (Exception e2) {  
      }  
    }  
  }  
  private void logic() {//     
    if (vc != null) {//      ,             
      for (int i = 0; i < vc.size(); i++) {  
        vc.elementAt(i).logic();  
      }  
    }  
  }  
  @Override 
  public boolean onKeyDown(int keyCode, KeyEvent event) {  
    //       ,                 
    vc.addElement(new MyArc(ran.nextInt(this.getWidth()), ran.nextInt(100), ran.nextInt(50)));  
    return true;  
  }  
  public void run() {  
    // TODO Auto-generated method stub  
    while (flag) {  
      logic();  
      draw();  
      try {  
        Thread.sleep(100);  
      } catch (Exception ex) {  
      }  
    }  
  }  
  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  
    Log.v("Himi", "surfaceChanged");  
  }  
  public void surfaceDestroyed(SurfaceHolder holder) {  
    flag = false;  
  }  
        OK,코드 도 간단 하고 또렷 해!한 마디 만 하 겠 습 니 다.MyArc 에 도 MysurfaceView 와 같은 방법 인 logic()와 draw()가 있 습 니 다.그러면 우리 의 코드 구 조 를 잘 관리 하고 생각 이 뚜렷 하 며 각자 의 책임 을 다 하 며 혼란 을 피 할 수 있 습 니 다.
        이상 은 안 드 로 이 드 개발 중력 시스템 에 대한 자료 정리 입 니 다.추 후 관련 자 료 를 계속 보충 하 겠 습 니 다.본 사이트 에 대한 지원 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기