1

だからここに私のコードがあります、

public class GameView extends SurfaceView {

private SurfaceHolder holder;
private GameLoopThread gameLoopThread;
private List<Sprite> sprites = new ArrayList<Sprite>();
private long lastClick;

public int d = 0;
public int color;
TextView tv;
public int score;

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

    gameLoopThread = new GameLoopThread(this);
    holder = getHolder();
    holder.addCallback(new Callback() {

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            createSprites();
            gameLoopThread.setRunning(true);
            gameLoopThread.start();
        }

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

    });

}

private void createSprites() {

    int c = 10;
    {
        Random rnd = new Random();
        color = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256),
                rnd.nextInt(256));
        for (int b = 1; b <= c; b++) {

            int random = (int) Math.ceil(Math.random() * 24);
            if (random == 1) {
                sprites.add(createSprite(R.drawable.bad1));
            } else if (random == 2) {
                sprites.add(createSprite(R.drawable.bad2));
            } else if (random == 3) {
                sprites.add(createSprite(R.drawable.bad3));
            } else if (random == 4) {
                sprites.add(createSprite(R.drawable.bad4));
            } else if (random == 5) {
                sprites.add(createSprite(R.drawable.bad5));
            } else if (random == 6) {
                sprites.add(createSprite(R.drawable.bad6));
            } else if (random == 7) {
                sprites.add(createSprite(R.drawable.bad7));
            } else if (random == 8) {
                sprites.add(createSprite(R.drawable.bad8));
            } else if (random == 9) {
                sprites.add(createSprite(R.drawable.bad9));
            } else if (random == 10) {
                sprites.add(createSprite(R.drawable.bad10));
            } else if (random == 11) {
                sprites.add(createSprite(R.drawable.bad11));
            } else if (random == 12) {
                sprites.add(createSprite(R.drawable.bad12));
            } else if (random == 13) {
                sprites.add(createSprite(R.drawable.bad13));
            } else if (random == 14) {
                sprites.add(createSprite(R.drawable.bad14));
            } else if (random == 15) {
                sprites.add(createSprite(R.drawable.bad15));
            } else if (random == 16) {
                sprites.add(createSprite(R.drawable.bad16));
            } else if (random == 17) {
                sprites.add(createSprite(R.drawable.bad17));
            } else if (random == 18) {
                sprites.add(createSprite(R.drawable.good1));
            } else if (random == 19) {
                sprites.add(createSprite(R.drawable.good2));
            } else if (random == 20) {
                sprites.add(createSprite(R.drawable.good3));
            } else if (random == 21) {
                sprites.add(createSprite(R.drawable.good4));
            } else if (random == 22) {
                sprites.add(createSprite(R.drawable.good5));
            } else if (random == 23) {
                sprites.add(createSprite(R.drawable.good6));
            } else if (random == 24) {
                sprites.add(createSprite(R.drawable.good7));
            }
        }

    }
}

private Sprite createSprite(int resource) {
    Bitmap bmp = BitmapFactory.decodeResource(getResources(), resource);
    return new Sprite(this, bmp);

}

@SuppressLint({ "WrongCall", "DrawAllocation" })
@Override
public void onDraw(Canvas canvas) {

    canvas.drawColor(color);
    Paint paint = new Paint();
    paint.setColor(Color.CYAN);
    canvas.drawText("SCORE  " + score, 10, 10, paint);

    for (Sprite sprite : sprites) {
        sprite.onDraw(canvas);
    }

}

// this is the ontouch event to destroy the sprites and make the blood splat
// effect
@Override
public boolean onTouchEvent(MotionEvent event) {
    if (System.currentTimeMillis() - lastClick > 200) {
        lastClick = System.currentTimeMillis();
        synchronized (getHolder()) {
            float x = event.getX();
            float y = event.getY();
            for (int i = sprites.size() - 1; i >= 0; i--) {
                Sprite sprite = sprites.get(i);

                if (sprite.isCollition(x, y)) {
                    {
                        if ((sprites).equals    (R.drawable.bad1))
                            score = score + 5;
                        else if ((sprites).equals(R.drawable.bad2))
                            score = score + 5;
                        else if ((sprites).equals(R.drawable.bad3))
                            score = score + 5;
                        else if ((sprites).equals(R.drawable.bad4))
                            score = score + 5;
                        else if ((sprites).equals(R.drawable.bad5))
                            score = score + 5;
                        else if ((sprites).equals(R.drawable.bad6))
                            score = score + 5;
                        else if ((sprites).equals(R.drawable.bad7))
                            score = score + 5;
                        else if ((sprites).equals(R.drawable.bad8))
                            score = score + 5;
                        else if ((sprites).equals(R.drawable.bad9))
                            score = score + 5;
                        else if ((sprites).equals(R.drawable.bad10))
                            score = score + 5;
                        else if ((sprites).equals(R.drawable.bad11))
                            score = score + 5;
                        else if ((sprites).equals(R.drawable.bad12))
                            score = score + 5;
                        else if ((sprites).equals(R.drawable.bad13))
                            score = score + 5;
                        else
                            score = score - 5;
                    }
                    d++;
                    if (d >= 10) {
                        d = 0;
                        createSprites();
                    }
                    break;
                }
            }
        }
    }

    return true;
}
}

私がやろうとしているのは、

   if ((sprites).equals(R.drawable.bad1))
score = score + 5;

このコードのどこかに、

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (System.currentTimeMillis() - lastClick > 200) {
        lastClick = System.currentTimeMillis();
        synchronized (getHolder()) {
            float x = event.getX();
            float y = event.getY();
            for (int i = sprites.size() - 1; i >= 0; i--) {
                Sprite sprite = sprites.get(i);

削除されている写真の 1 つの値を保持しますが、これを適切にコーディングする方法がわかりません。ランダマイザーが実行されるたびに写真を配列に配置する必要があるかどうかはわかりませんが、コードはyoutubeの「edu4java」チュートリアルから取得されます。

タッチで写真を削除でき、スコアが正しかったことがわかるように、プログラムをループさせています。取得方法がわかりません。

if ((sprites).equals(R.drawable.bad1))
score = score + 5;

適切な pic 文字列を「見る」ためにチェックします。コードが「自動作成」する配列を確認する必要がありますか? 文字列の値を確認して確認する方法はありますか? 「スプライト」または「スプライト」によって実際に「保持」されているものを「見る」など?

4

2 に答える 2

0

ビットマップをリソース ID と比較することはできません。実際に手動でそれを実行しようとすると、単純な検証のために静かで徹底的なパフォーマンスが得られます。私が行うこととそれを単純に保つために、私は独自のクラスを作成しますスプライトから拡張され、コンテキストとビットマップを渡す代わりに、コンテキストとリソース ID を渡します。次に、このクラス内でリソースをデコードし、リソース ID の参照を保持します。スプライトの equal メソッドをオーバーライドし、オブジェクトの作成に使用された参照を使用して比較を行います。これが私のクラスになります

public class MySprite extends Sprite{
    private int bmpID;
    public MySprite(Context context, int bmpID){
        this.bmpID = bmpID;
        Bitmap bmp = BitmapFactory.decodeResource(context.getResources(), bmpID);
        super(context, bmp);
    }

    @Override
    public boolean equals(Object o) {
        if(!(o instanceof MySprite))return false;
        return this.bmpID == MySprite.class.cast(o).getBmpId();
    }

    public int getBmpId(){
        return bmpID;
    }
}

このようにして、単純な int 比較として保持します。最も重要なことは、それを使用して、同じ bmpID の 2 つのオブジェクトを比較したり、これを実行して望んでいたようなものを比較したりすることができます。

if ((sprites).getBmpId() == R.drawable.bad1))
score = score + 5;

よろしく!

于 2013-06-07T04:09:24.153 に答える
0

1 つの問題は、 のソース コードを提供していないことですSpriteが、おそらくここのコードのように見えますか? そこにあるコードを考えると、そのままのクラスに関する問題に対する適切な解決策はありません。

したがって、この問題を解決する方法は、各スプライトにリソース ID を追加することです。

private Sprite createSprite(int resource) {
    Bitmap bmp = BitmapFactory.decodeResource(getResources(), resource);
    return new Sprite(this, bmp, resource);
}

resourceコンストラクターに余分なパラメーターを追加することに注意してください。さらに、Spriteクラスに methodを追加するとint Sprite.getResource()、衝突検出コードは次のようになります。

if (sprite.isCollition(x, y))
{
    if (sprite.getResource() == R.drawable.bad1)
        score = score + 5;
    else if (sprite.getResource() == R.drawable.bad2)
        score = score + 5;
    else ...
}

注: このコードは決して最適ではありませんが、より良い解決策を発見するための正しい方向を示してくれることを願っています。ここスタック オーバーフローでは、魚を投げるのではなく、人々に釣り方を教えています。

于 2013-06-07T03:54:47.730 に答える