안 드 로 이 드 게임 개발 입문 간단 한 예시

12275 단어 Android게임 개발
안 드 로 이 드 시스템 에서 게임 을 개발 하 는 것 은 안 드 로 이 드 개발 학습자 들 이 동경 하 는 것 으로 성취 감도 있 고 재미 도 있 으 며 경제적 인 보 수 를 받 을 수 있다.그럼 안 드 로 이 드 게임 은 어떻게 개발 하나 요?다음은 간단 한 입문 실례 를 소개 한다.
       새 프로젝트 만 들 기
       우선,우 리 는 Eclipse 에서 Movement 라 는 프로젝트 를 새로 만 들 고 적당 한 Android SDK 를 선택 합 니 다.여기 서 우리 가 선택 한 API 는 비교적 낮은 1.5 버 전 으로 적응성 을 더욱 강하 게 할 수 있 습 니 다.그 다음 에 우 리 는 두 가지 종 류 를 새로 만 들 었 습 니 다.하 나 는 UpdateThread 류 이 고 하 나 는 SurfaceView 류 입 니 다.그들 은 프로젝트 에서 스 레 드 와 화면 을 처리 하 는 두 가지 유형 입 니 다.그 다음 에 상세 하 게 소개 할 것 입 니 다.다음 과 같은 그림 은 각각 이 두 가지 종 류 를 만 들 고 그들 이 계승 하 는 부 류 를 정확하게 선택 하 는 것 에 주의 하 십시오.


       구축 이 완 료 된 후에 시스템 의 프로젝트 구 조 는 다음 과 같이 보 여야 한다.

       2.Movment.java 시작 프로그램 작성
       모든 Android 응용 프로그램 은 주 시작 프로그램 이 시작 되 어야 합 니 다.이 시작 프로그램 을 Movment 라 고 부 릅 니 다.코드 는 다음 과 같 습 니 다.
자바 코드

public class Movement extends Activity {  
 @Override 
 public void onCreate(Bundle savedInstanceState) {  
 
   super.onCreate(savedInstanceState);  
   setContentView(new MovementView(this));  
 }  
       주의해 야 할 것 은 우리 의 이 시작 프로그램 은 다른 프로그램 과 같 지 않 습 니 다.시작 할 때 set ContentView 에서 인터페이스 레이아웃 파일 을 전달 하 는 것 이 아니 라 Movement View 의 인 스 턴 스 를 직접 전달 하 는 것 입 니 다.즉,Movement View 라 는 종 류 를 직접 시작 한 것 입 니 다.이런 종류 에서 우 리 는 우리 의 작은 공 을 그 릴 것 입 니 다.
       3.Surface View 가 무엇 입 니까?
       Android 에서 SurfaceView 는 메모리 나 DMA 등 하드웨어 인터페이스 에서 이미지 데 이 터 를 직접 얻 을 수 있 는 중요 한 그래 픽 용기 입 니 다.일반적인 상황 프로그램의 View 와 사용자 응답 은 같은 스 레 드 에서 처 리 됩 니 다.이것 은 장시간 이벤트(예 를 들 어 네트워크 방문)를 처리 할 때 다른 스 레 드 에 넣 어야 하 는 이유 입 니 다(현재 UI 스 레 드 의 조작 과 그리 기 를 막 는 것 을 방지 합 니 다).그러나 다른 스 레 드 에 서 는 UI 요 소 를 수정 할 수 없습니다.예 를 들 어 배경 스 레 드 로 사용자 정의 View 를 업데이트 하 는 것 은 허용 되 지 않 습 니 다.
       다른 라인 에서 인 터 페 이 스 를 그 릴 필요 가 있 거나,신속 한 업데이트 인터페이스 가 필요 하거나,UI 인 터 페 이 스 를 렌 더 링 하 는 데 시간 이 오래 걸 릴 경우 SurfaceView 를 사용 해 야 한다.Surface View 에는 Surface 대상 이 포함 되 어 있 으 며 Surface 는 배경 스 레 드 에서 그 릴 수 있 습 니 다.
       본 논문 에서 우 리 는 이 를 사용 하여 코드 를 통 해 작은 공 을 만 들 고 UpdateThread 스 레 드 가 업데이트 되면 서 작은 공의 위 치 를 계속 바 꿀 것 입 니 다.다음은 Movement View 의 작성 을 배우 기 시 작 했 습 니 다.먼저 Surface View 를 어떻게 활용 하 는 지 살 펴 보 겠 습 니 다.
       먼저 Surface View 및 그림 그리 기 관련 라 이브 러 리 파일 을 가 져 옵 니 다.다음 과 같 습 니 다.
자바 코드

package example.movement;  
 
import android.content.Context;  
import android.graphics.Canvas;  
import android.graphics.Color;  
import android.graphics.Paint;  
import android.graphics.Rect;  
import android.view.SurfaceHolder;  
import android.view.SurfaceView; 
       이 어 우 리 는 Surface View 를 계승 하고 Surface Holder.Callback 인 터 페 이 스 를 실현 해 야 한다.이것 은 Surface Holder 의 내부 인터페이스 로 이 인터페이스 가 변 하 는 정 보 를 얻 을 수 있다.코드 는 다음 과 같다.그리고 우 리 는 일부 구성원 변 수 를 설명 했다.
자바 코드

public class MovementView extends SurfaceView implements SurfaceHolder.Callback {  
  private int xPos;  
  private int yPos;  
 
  private int xVel;  
  private int yVel;  
 
  private int width;  
  private int height;  
 
  private int circleRadius;  
  private Paint circlePaint;  
 
  UpdateThread updateThread;  
}  
        그리고 Movement View 의 구조 함수 에서 우 리 는 작은 공의 크기 와 X,Y 방향 에 있 는 초기 좌 표를 설정 했다.다음 과 같다. 
자바 코드         

public MovementView(Context context) {   
  super(context);   
  getHolder().addCallback(this);   
   
  circleRadius = 10;   
  circlePaint = new Paint();   
  circlePaint.setColor(Color.BLUE);   
   
  xVel = 2;   
  yVel = 2;   
}   
       이 어 ondraw 방법의 작성 을 살 펴 보 겠 습 니 다.여기 서 작은 공 을 그 릴 것 입 니 다.그리고 매번 캔버스 의 배경 색 을 흰색 으로 설정 하여 이전 프레임 을 다시 덮어 씁 니 다.코드 는 다음 과 같 습 니 다.
자바 코드

protected void onDraw(Canvas canvas) {  
 
    canvas.drawColor(Color.WHITE);  
 
    canvas.drawCircle(xPos, yPos, circleRadius, circlePaint);  
}  
       update Physics 라 는 방법 을 어떻게 작성 하 는 지 다시 한번 봅 시다.이 방법의 역할 은 두 가지 가 있다.하 나 는 작은 공 을 처리 하 는 운동 이 고,다른 하 나 는 작은 공의 실시 간 위 치 를 업데이트 하 는 것 이다.작은 공이 화면 에서 끊임없이 운동 하기 때문에 작은 공이 예 를 들 어 스크린 회화 구역 의 꼭대기 에 도착 하면 튕 겨 야 하기 때문에 코드 는 다음 과 같다.
자바 코드

public void updatePhysics() {  
 
//     x,y    
    xPos += xVel;  
    yPos += yVel;  
 
    if (yPos - circleRadius < 0 || yPos + circleRadius > height) {  
 
        
      if (yPos - circleRadius < 0) {  
 
        //              ,     
 
        yPos = circleRadius;  
      }else{  
 
        //              ,     
 
        yPos = height - circleRadius;  
      }  
 
      //  Y           
      yVel *= -1;  
    }  
    if (xPos - circleRadius < 0 || xPos + circleRadius > width) {  
 
        
      if (xPos - circleRadius < 0) {  
 
        //            
 
        xPos = circleRadius;  
      } else {  
 
        //            
 
        xPos = width - circleRadius;  
      }  
 
      //     x     
      xVel *= -1;  
    }  
  }  
       마지막 으로 surfaceCreated 라 는 방법의 코드 를 살 펴 보 겠 습 니 다.이 방법 에서 주로 사용 가능 한 SurfaceView 구역 의 높이 와 폭 을 얻 은 다음 에 작은 공의 시작 좌 표를 설정 하고 UpdateThread 스 레 드 를 시 작 했 습 니 다.코드 는 다음 과 같 습 니 다.
자바 코드

public void surfaceCreated(SurfaceHolder holder) {  
 
    Rect surfaceFrame = holder.getSurfaceFrame();  
    width = surfaceFrame.width();  
    height = surfaceFrame.height();  
 
    xPos = width / 2;  
    yPos = circleRadius;  
 
    updateThread = new UpdateThread(this);  
    updateThread.setRunning(true);  
    updateThread.start();  
  }  
       그 밖 에 우 리 는 surfaceChanged 라 는 방법 을 보충 해 야 한다.이 방법 은 인터페이스 크기 가 바 뀌 었 을 때 호출 한 다 는 뜻 이다.이 응용 프로그램 에서 사용 되 지 않 았 기 때문에 우 리 는 빈 방법 으로 실현 하도록 보류 했다.
자바 코드

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)  
  {  
 
  }  
       한편,surfaceDestroyed 방법 에서 주로 인터페이스 가 소각 되 었 을 때 호출 되 었 습 니 다.여기 서 우 리 는 현재 스 레 드 가 처리 하 는 임 무 를 중단 하고 스 레 드 join 방법 을 사 용 했 습 니 다.
자바 코드

public void surfaceDestroyed(SurfaceHolder holder) {  
 
    boolean retry = true;  
 
    updateThread.setRunning(false);  
    while (retry) {  
      try {  
        updateThread.join();  
        retry = false;  
      } catch (InterruptedException e) {  
 
      }  
    }  
  }  
       요약 하면 완전한 Movement View 코드 는 다음 과 같 습 니 다.
자바 코드

package example.movement;  
 
import android.content.Context;  
import android.graphics.Canvas;  
import android.graphics.Color;  
import android.graphics.Paint;  
import android.graphics.Rect;  
import android.view.SurfaceHolder;  
import android.view.SurfaceView;  
 
public class MovementView extends SurfaceView implements SurfaceHolder.Callback {  
 
  private int xPos;  
  private int yPos;  
 
  private int xVel;  
  private int yVel;  
 
  private int width;  
  private int height;  
 
  private int circleRadius;  
  private Paint circlePaint;  
 
  UpdateThread updateThread;  
 
  public MovementView(Context context) {  
 
    super(context);  
    getHolder().addCallback(this);  
 
    circleRadius = 10;  
    circlePaint = new Paint();  
    circlePaint.setColor(Color.BLUE);  
 
    xVel = 2;  
    yVel = 2;  
  }  
  @Override 
  protected void onDraw(Canvas canvas) {  
 
    canvas.drawColor(Color.WHITE);  
    canvas.drawCircle(xPos, yPos, circleRadius, circlePaint);  
  }  
 
  public void updatePhysics() {  
    xPos += xVel;  
    yPos += yVel;  
 
    if (yPos - circleRadius < 0 || yPos + circleRadius > height) {  
      if (yPos - circleRadius < 0) {  
        yPos = circleRadius;  
      }else{  
        yPos = height - circleRadius;  
      }  
      yVel *= -1;  
    }  
    if (xPos - circleRadius < 0 || xPos + circleRadius > width) {  
      if (xPos - circleRadius < 0) {  
        xPos = circleRadius;  
      } else {  
        xPos = width - circleRadius;  
      }  
      xVel *= -1;  
    }  
  }  
 
  public void surfaceCreated(SurfaceHolder holder) {  
 
    Rect surfaceFrame = holder.getSurfaceFrame();  
    width = surfaceFrame.width();  
    height = surfaceFrame.height();  
 
    xPos = width / 2;  
    yPos = circleRadius;  
 
    updateThread = new UpdateThread(this);  
    updateThread.setRunning(true);  
    updateThread.start();  
  }  
 
  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  
  }  
 
  public void surfaceDestroyed(SurfaceHolder holder) {  
 
    boolean retry = true;  
 
    updateThread.setRunning(false);  
    while (retry) {  
      try {  
        updateThread.join();  
        retry = false;  
      } catch (InterruptedException e) {  
      }  
    }  
  }  
}  
         4.UpdateThread 스 레 드 프로그램
       다음은 UpdateThread 스 레 드 프로그램 을 작성 하기 시작 합 니 다.이 프로그램 은 현재 작은 공의 위 치 를 계속 업데이트 하기 위해 스 레 드 를 시작 합 니 다.먼저 성명 및 구조 함수 부분 을 보십시오.
자바 코드

package licksquid.movement;  
 
import android.graphics.Canvas;  
import android.view.SurfaceHolder;  
 
public class UpdateThread extends Thread {  
  private long time;  
  private final int fps = 20;  
  private boolean toRun = false;  
  private MovementView movementView;  
  private SurfaceHolder surfaceHolder;  
 
}  
public UpdateThread(MovementView rMovementView) {  
    movementView = rMovementView;  
    surfaceHolder = movementView.getHolder();  
  }  
 public void setRunning(boolean run) {  
    toRun = run;  
  }  
        이 setRunning 방법 에 스 레 드 가 멈 춰 야 할 지 여 부 를 표시 하 였 습 니 다.다음은 중요 한 방법 run 을 보 겠 습 니 다.
자바 코드

public void run() {  
 
    Canvas c;  
    while (toRun) {  
 
      long cTime = System.currentTimeMillis();  
 
      if ((cTime - time) <= (1000 / fps)) {  
 
        c = null;  
        try {  
          c = surfaceHolder.lockCanvas(null);  
 
          movementView.updatePhysics();  
          movementView.onDraw(c);  
        } finally {  
          if (c != null) {  
            surfaceHolder.unlockCanvasAndPost(c);  
          }  
        }  
      }  
      time = cTime;  
    }  
  } 
       run 방법 에 서 는 주로 다음 과 같은 몇 가지 작업 을 실 현 했 습 니 다.먼저 이 스 레 드 를 시작 할 수 있 는 지 확인 하 십시오.(실행 을 시작 한 후 Movement View 에서 UpdateThread 를 시작 할 때 값 이 true,즉 updateThread.setRunning(true)로 설정 되 어 있 기 때문에 지정 한 시간 내 에(여 기 는 초당 20 프레임 으로 설정 되 어 있 습 니 다)인지 확인 하 십시오.그렇다면...surfaceHolder 의 lockCanvas 방법 을 사용 하여 현재 캔버스 그림 영역 을 잠 그 고 movement View 의 update Physics 방법 과 onDraw 방법 으로 작은 공 을 그리고 작은 공의 운동 을 판단 합 니 다.마지막 으로 finally 에서 unlockCanvasAndPost 방법 을 사용 하 는 것 을 기억 하 십시오.
       5.프로그램 시작 및 실행
       마지막 으로 프로그램 을 시작 하고 실행 하면 다음 과 같은 효 과 를 볼 수 있 고 작은 공이 각 방향의 점프 운동 을 하 는 것 을 볼 수 있다.
       이 안 드 로 이 드 게임 개발 의 입문 인 스 턴 스 를 완 성 했 습 니 다.사실 안 드 로 이 드 게임 을 만 드 는 것 은 이렇게 간단 합 니 다.
        이상 은 간단 한 게임 개발 프로그램 입 니 다.추 후 관련 지식 을 계속 정리 하 겠 습 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기