2011-07-02 21 views
1

誰もこの簡単なコードで私を助けることができますか? サークルがスムーズに動かないのはなぜですか? 何が問題なのですか?Androidの非常に基本的なゲーム開発

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); 

であなたのキャンバスをクリアすることができます。