0

AngryBirdsのような発射体をドラッグして発射しようとしています。ドラッグ部分は正常に機能しますが、タッチを離すと(つまり、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);
}
}

どんな助けでも大歓迎です。ありがとうございました。

4

2 に答える 2

0

うーん、エラー トレースからの特定の情報なし: StackOverFlow エラーは、多くの場合、ランナウェイ再帰関数で発生します。launch()xCurrent = 0、xMax = 1000000、xVector = .001 の場合、おそらくスタック オーバーフローが発生ます。ここでデバッグを開始します。

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

最後に、便利な演算子は+=次のとおりです。

xCurrent = xCurrent + xVector;

それを次のように短縮します。

xCurrent += xVector;

これにより、不要なタイピングを節約できます。幸運を!

于 2012-04-22T17:17:42.890 に答える
0

あなたのlaunch()メソッドは再帰呼び出しが悪いようです。この回答を参照してください。

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;
}
于 2012-04-22T17:44:54.760 に答える