2011-07-02 5 views
1

누구든지이 간단한 코드로 나를 도울 수 있습니까? 원이 왜 부드럽게 움직이지 않습니까? 무엇이 문제입니까?안드로이드 매우 기본적인 게임 개발

package chaseme; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Point; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.Window; 

public class ChaseMe extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(new SampleView(this)); 
} 

private class SampleView extends SurfaceView implements SurfaceHolder.Callback, Runnable { 
    private Point point; 
    private Thread thread; 
    private SurfaceHolder holder; 
    private Paint _rect; 
    private Paint _circle; 
    private boolean running; 
    private int WIDTH; 
    private int HEIGHT; 
    private float radius = 20; 

    public SampleView(Context context) { 
     super(context); 

     point = new Point(20, 20); 
     _rect = new Paint(); 
     _rect.setColor(Color.BLACK); 

     _circle = new Paint(); 
     _circle.setColor(Color.BLUE); 

     holder = this.getHolder(); 
     holder.addCallback(this); 
     thread = new Thread(this); 

    } 

    private void updateModel() { 
     if(point.x > WIDTH - radius) { 
      point.x = 20; 
     } 
     if(point.y > HEIGHT - radius) { 
      point.y = 20; 
     } 
     point.x++; 
     point.y++; 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     WIDTH = getWidth(); 
     HEIGHT = getHeight(); 
     this.setRunning(true); 
     thread.start(); 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     boolean retry = true; 

     this.setRunning(false); 
     while (retry) { 
      try { 
       thread.join(); 
       retry = false; 
      } 
      catch (InterruptedException e) {} 
     } 
    } 

    private void setRunning(boolean b) { 
     running = b; 
    } 

    @Override 
    public void run() { 
     while(running) { 
      Canvas c = null; 
      updateModel(); 

      try { 
       c = holder.lockCanvas(null); 
       // synchronized (holder) {      
        render(c); 
       // } 
      } 
      catch(Exception e) { 
       Log.e("main", e.getMessage()); 
      } 
      finally { 
       if(c!=null) { 
        holder.unlockCanvasAndPost(c); 
       }     
      }    
     } 
    } 

    private void render(Canvas c) {   
     c.drawRect(0, 0, WIDTH, HEIGHT, _rect);  
     c.drawCircle(point.x, point.y, radius , _circle); 

     //c.save(); 
     //c.restore(); 
    } 
} 
} 
+0

렌더링시 콘솔에 몇 가지 내용을 인쇄하면 프레임 속도가 좋아 지나요? 애니메이션 프레임간에 스레드를 절대로 절대로 요구하지 않으면 앱이 너무 빠르게 실행되지 않는지 궁금합니다. – Snicolas

+0

글쎄, 문제가 뭔지 알아, 에뮬레이터가 매우 느리게 실행됩니다, 나는 fps를 볼 테스트를 실행하고 약 20에서 10으로 떨어집니다. – Yotam

+0

장치는 안드로이드에 대한 유일한 실제 세계 테스트입니다. 앱을 디버그하는 가장 빠른 방법이기도합니다. 필자는 에뮬레이터를 사용하여 내 장치가 테스트 할 수없는 것을 테스트합니다 (해상도, SDK 버전 ...). 하지만 대개 기기에서 내 코드를 테스트합니다. – Snicolas

답변

1

현재처럼 point.x ++를 호출 할 수 없습니다. 경과 시간 및 화면 크기에 상대적인 움직임을 계산해야합니다.

1 단계 : 모든 프레임에서, 당신은

mLastTime = now; 

2 단계를 수행 메인 루프의 끝에서 다음

long now = System.currentTimeMillis(); 
elapsed = (now - mLastTime); 
totalTimeElapsed += elapsed; 

등을 수행하여 마지막 프레임 이후 경과 된 시간을 계산합니다. 화면 비율 얻기 :

screenWidth = MyClass.this.getWidth(); 
screenHeight = MyClass.this.getHeight(); 
float a = screenWidth; 
float b = screenHeight; 
screenRatioX = a/WIDTH_OF_YOUR_PHONE; 
screenRatioY = b/HEIGTH_OF_YOUR_PHONE; 

3 단계. 이제 애니메이션을 시작할 수 있습니다. 예를 들어, 원하는 경우 서클을 오른쪽에서 왼쪽으로 이동 :

spriteX1 = (int) ((spriteX1 + (VELOCITY*screenRatioX*elapsed))+0.5); 
spriteX2 = spriteX1 + spriteWidth; 

속도가 2.0 이상인 것으로 시작하여 조정합니다.

행운을 빈다.

1

개체의 부드러운 이동을 위해서는 터치 이벤트의 제스처 수신기 기능을 사용해야한다고 생각합니다.

아래 링크는 도움이 될 수 있습니다.

1.http : //mobile.tutsplus.com/tutorials/android/android-gesture/ 2.http : //stackoverflow.com/questions/937313/android-basic-gesture-detection

0

내 욕망에 따라 코드를 테스트했으며 매우 원활하게 실행됩니다.

실제 장치에서 이러한 종류의 프로젝트를 테스트하는 것이 좋습니다. 에뮬레이터는 CPU에 따라 예측할 수없고 느릴 수도 있습니다.

아니 큰 문제가 있지만 대신 사각형을 그리는

canvas.drawColor(Color.BLACK); 

으로 캔버스를 지울 수 있습니다.