2012-04-22 28 views
0

私は、Angry Birdsのように投射物をドラッグして起動しようとしています。ドラッグ部分はうまく動作しますが、タッチを離すと(つまりACTION_UP)、ボールが瞬時に境界で終わることがあり、それ以外のときはStackOverflowErrorでクラッシュします。エラーを回避して動きを滑らかにするには、どうすればよいですか?ここに私のコードです:タッチをドラッグして離した後にボールを起動する

public class BallView extends View{ 

static Log log; 
Bitmap ball; 
float xStart; 
float yStart; 
float xCurrent; 
float yCurrent; 
int xMax; 
int yMax; 
float xVector; 
float yVector; 

public BallView(Context context){ 
    super(context); 
    this.setFocusable(true); 
    ball = BitmapFactory.decodeResource(getResources(), R.drawable.ball); 
    xStart = 125; 
    yStart = 275; 
    xCurrent = xStart; 
    yCurrent = yStart; 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    xMax = MeasureSpec.getSize(widthMeasureSpec); 
    yMax = MeasureSpec.getSize(heightMeasureSpec); 
    setMeasuredDimension(xMax, yMax); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    canvas.drawBitmap(ball, xCurrent, yCurrent, null); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    int eventaction = event.getAction(); 
    int X = (int)event.getX(); 
    int Y = (int)event.getY(); 

    switch (eventaction) { 
    case MotionEvent.ACTION_DOWN: 
     break; 
    case MotionEvent.ACTION_MOVE: 
     xCurrent = X-30; 
     yCurrent = Y-30; 
     break; 

    case MotionEvent.ACTION_UP: 
     Log.d("actionup", "done"); 
     xCurrent = X-30; 
     yCurrent = Y-30; 
     xVector = xStart-xCurrent; 
     yVector = yStart-yCurrent; 
     break; 
    } 
    invalidate(); 
    if (eventaction == MotionEvent.ACTION_UP){ 
     launch(xVector, yVector); 
    } 
    return true; 
} 

private void launch(float xVector, float yVector) { 
    xCurrent = xCurrent + xVector; 
    yCurrent = yCurrent + yVector; 
    if (xCurrent < 0 || xCurrent > xMax || yCurrent < 0 || yCurrent >yMax){ 
     return; 
    } 
    invalidate(); 
    launch(xVector, yVector); 
} 
} 

私は助けていただきありがとうございます。ありがとうございました。

+0

例外を指定してLogCat出力を送信する必要があります。 – azertiti

+0

xMaxとyMaxとは何ですか?あなたはこれをデバッガで踏んだことがありますか? – derekerdmann

答えて

0

注意:エラートレースの特定の情報はありません。StackOverFlowエラーは、暴走的な再帰関数でよく発生します。 xCurrent = 0、xMax = 1000000、xVector = .001の場合、launch()となるでしょう。はstackoverflowを作成します。私はここでデバッグを開始します。

また、同じスコープ内で同じ名前の変数を宣言しているようです(つまり、xVe​​ctorとyVectorはクラスメンバー変数として宣言されていて、それもlaunch(float xVector, float yVector)で宣言されています)。これにより、あなたや他の誰かが道を混乱させる可能性があります。別個の変数名と従来の命名方式を使用してください。

xCurrent = xCurrent + xVector;

をし、それを短縮:

最後に、便利なオペレータが+=あり、それはとり

xCurrent += xVector;

これはあなたにいくつかの不要なタイピングを節約できます。がんばろう!

+0

再帰的なlaunch()メソッドが頻繁に呼び出されないようにスリープ時間を追加しました。ありがとうございました。 –

0

あなたのlaunch()メソッドが不適切な再帰呼び出しであるようです。このanswerを参照してください。

private void launch(float xVector, float yVector) { 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      while (!(xCurrent + xVector < 0 || xCurrent + xVector > xMax || 
        yCurrent + yVector < 0 || yCurrent + yVector > yMax)){ 

       xCurrent = xCurrent + xVector; 
       yCurrent = yCurrent + yVector; 
       try{ 
        Thread.sleep(200); 
       }catch(Exception e){ 
       } 
       postInvalidate(); 
      } 
     } 
    }).start; 
} 
+0

すばらしいヘルプ。ありがとうございました。私はこれを念頭に置いておきます。 –

関連する問題