2

とてもシンプルなゲームを作ろうとしています。ユーザーは、指で動かしたバスケットを使ってリンゴを捕まえようとしなければなりません。すべてうまくいっているようですが、問題があります。アプリの背景を描きたいのです。ただし、背景として画像を使用すると、アプリが非常に遅くなり、多くの遅延が発生します。白背景を使えば問題ありません。

誰かが私が間違っていることを教えてもらえますか?

アプリが更新されるたびに背景を描いているからだと思いますが、これを変更する方法がわかりません。

私のコードは少し混乱しているかもしれません。私はまだ学んでいます。

助けてくれてありがとう!

package com.cris9696.mela;

import java.util.Random;

import com.cris9696.mela.R;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.graphics.Paint.Align;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;

public class Game extends Activity implements OnTouchListener {

ClasseCanvas View;
float xApple, yApple, xBasket, yBasket;
Bitmap Apple, Basket, BackG;
Random rnd = new Random();
int win = 0, score = 0, level = 1;
int record = 0;
Typeface Font;
Paint TextP = new Paint();
Rect dest;
Paint paint;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Font = Typeface.createFromAsset(getAssets(), "TF2.ttf");
    View = new ClasseCanvas(this);
    View.setOnTouchListener(this);
    TextP.setColor(Color.RED);
    TextP.setTextSize(50);
    TextP.setTypeface(Font);
    xApple = yApple = xBasket = yBasket = 0;
    xApple = rnd.nextInt(600);
    Apple = BitmapFactory.decodeResource(getResources(), R.drawable.apple);
    BackG = BitmapFactory
            .decodeResource(getResources(), R.drawable.bg);
    Basket = BitmapFactory.decodeResource(getResources(),
            R.drawable.basket);

    setContentView(View);

}

// /////////////////////////////////////////////////////////////////////////////

@Override
public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub

    xBasket = event.getX();
    yBasket = event.getY();
    /*
     * switch (event.getAction()) { // ci dice cosa succede
     * 
     * case MotionEvent.ACTION_DOWN:
     * 
     * case MotionEvent.ACTION_UP:
     * 
     * break; }
     */
    return true;
}

// ///////////////////////////////////////////////////////////////////////////

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    View.pause();
}

// /////////////////////////////////////////////////////////////////////////////

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    View.resume();
}

// ///////////////////////////////////////////////////////////

public class ClasseCanvas extends SurfaceView implements Runnable {

    SurfaceHolder Holder;
    Thread thread = null;
    boolean isRunning = true;

    public ClasseCanvas(Context context) {
        super(context);
        Holder = getHolder();

        // TODO Auto-generated constructor stub
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while (isRunning) {
            if (!Holder.getSurface().isValid())
                continue;

            Canvas canvas = Holder.lockCanvas();

            dest = new Rect(0, 0, getWidth(), getHeight());
            paint = new Paint();
            paint.setFilterBitmap(true);
            canvas.drawBitmap(BackG, null, dest, paint);
            TextP.setColor(Color.RED);
            canvas.drawText(Integer.toString(score), 56, 56, TextP);
            TextP.setColor(Color.BLACK);
            canvas.drawText("Level " + Integer.toString(level), 115,
                    56, TextP);
            if (xBasket != 0 && yBasket != 0) {
                canvas.drawBitmap(Basket, xBasket - Basket.getWidth() / 2,
                        yBasket - Basket.getHeight() / 2, null);
            }
            canvas.drawBitmap(Apple, xApple, yApple, null);
            if (yApple < canvas.getHeight())
                if (score >= 0)
                    yApple += 5 * level;
                else
                    yApple += 5;
            else {
                yApple = 0;
                score--;
                xApple = rnd.nextInt(canvas.getWidth() - Apple.getWidth());
            }
            if (score > record)
                record = score;
            if (score == 10) {
                level++;
                score = 0;
            }
            if ((xApple >= xBasket - (Basket.getWidth() / 2)
                    && xApple + (Apple.getWidth()) <= xBasket
                            + (Basket.getWidth() / 2) && yApple >= yBasket && yApple <= yBasket
                    + Basket.getHeight())
                    || (xApple >= xBasket - (Basket.getWidth() / 2)
                            && xApple <= xBasket + (Basket.getWidth() / 2)
                            && yApple >= yBasket && yApple <= yBasket
                            + Basket.getHeight())
                    || (xApple + (Apple.getWidth()) >= xBasket
                            - (Basket.getWidth() / 2)
                            && xApple + (Apple.getWidth()) <= xBasket
                                    + (Basket.getWidth() / 2)
                            && yApple >= yBasket && yApple <= yBasket
                            + Basket.getHeight())) {
                win = 1;
                xApple = rnd.nextInt(canvas.getWidth());
                yApple = 0;
                score++;
            }

            Holder.unlockCanvasAndPost(canvas);
        }
    }

    public void pause() {
        isRunning = false;
        while (true) {
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            break;
        }
        thread = null;
        // TODO Auto-generated method stub
    }

    public void resume() {
        // TODO Auto-generated method stub
        isRunning = true;
        thread = new Thread(this);
        thread.start();
    }

}
}
4

2 に答える 2

1

SurfaceViewのonDrawメソッドで背景画像を描画しないでください。surfaceViewが変更されるたびに、そのビットマップ全体が再描画されます。

最善の策は、SurfaceViewをLinearLayoutに追加してから、onCreateメソッドでLinearLayoutをContentViewとして設定することです。linearLayoutの背景をに設定して、R.drawable.bg1回だけ描​​画されるようにします。

編集

したがって、SurfaceViewを線形レイアウトでラップし、linearlayoutのbgを設定するxmlファイル。問題は、onCreateメソッドでこのレイアウトを使用していないことです。

XMlで、に変更<SurfaceView<com.cris9696.mela.game.ClasseCanvasます。次に、onCreateメソッドで次のことを実行できます。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); // the XML layout you created.

    View = (ClasseCanvas) findViewById(R.id.View); // the ClasseCanvas view in your XML file.
    View.setOnTouchListener(this);

    Font = Typeface.createFromAsset(getAssets(), "TF2.ttf");

    TextP.setColor(Color.RED);
    TextP.setTextSize(50);
    TextP.setTypeface(Font);

    xApple = yApple = xBasket = yBasket = 0;
    xApple = rnd.nextInt(600);

    Apple = BitmapFactory.decodeResource(getResources(), R.drawable.apple);
    BackG = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
    Basket = BitmapFactory.decodeResource(getResources(),R.drawable.basket);

}
于 2013-02-18T15:22:25.600 に答える