5

を並べて表示するのに問題がありBitmapます。Bitmap2D で定義された座標に描画したいと思いArrayます。

「草」を特定の座標に、「水など」を別の座標に描画できるようにしたいと考えています。

私はこれを理解しようと何日も費やしましたが、洞察をいただければ幸いです。Canvas1つの「草」しか描画できないためBitmap、forループにエラーがあると感じています。私はherehere、他の多くのものを見てきましたが、すべてのタイルが同じであることを望んでいません。これが私のコードです:

MapLoader.java

public class MapLoader extends SurfaceView implements SurfaceHolder.Callback,
    Runnable {

SurfaceHolder holder;
Thread thread;

Bitmap grass = BitmapFactory.decodeResource(getResources(),
        R.drawable.grass);
boolean running = false;

int[][] grassCoords = new int[][] { { 0, 16, 32, 48, 64 },
        { 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 },
        { 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 } };

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

    holder = getHolder();
    holder.addCallback(this);
}

public MapLoader(Context context, AttributeSet attrs) {
    super(context, attrs);

    holder = getHolder();
    holder.addCallback(this);
}

public MapLoader(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

    holder = getHolder();
    holder.addCallback(this);
}

public void pause() {
    running = false;

    while (running) {
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        break;
    }
    thread = null;
}

public void resume() {
    running = true;
    thread = new Thread(this);
    thread.start();

}

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

    running = true;
    thread = new Thread(this);
    thread.start();

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    Canvas c = holder.lockCanvas();
    draw(c);
    holder.unlockCanvasAndPost(c);

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

}

@Override
public void run() {

    while (running == true) {

        // performs drawing to the canvas
        if (!holder.getSurface().isValid()) {

            continue;
        }

        Canvas c = holder.lockCanvas();

        int x = 0;
        int y = 0;

        for (x = 0; x < grassCoords.length; x += grass.getWidth()) {

            for (y = 0; y < grassCoords.length; y += grass.getHeight()) {

                c.drawBitmap(grass, x, y, null);
            }

        }

        holder.unlockCanvasAndPost(c);

    }

}

}

ActivityClass.java

public class Test extends Activity {

MapLoader mapLoader;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mapLoader = new MapLoader(this);
    setContentView(mapLoader);

}
}

ヘルプや提案 (効果的な方法へのリンクであっても) をいただければ幸いです。

ありがとう、

マット

4

2 に答える 2

4

あなたがやろうとしていることを理解するのは簡単ではありません...

どのように座標をそのgrassCoords配列にエンコードしますか? 現在の形として、5x5要素があります。

int[][] grassCoords = new int[][] { { 0, 16, 32, 48, 64 },
        { 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 },
        { 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 } };

grass名前に草だけを描きたいと思っているので、次のように定義できます

int[][] grassCoords = new int[][] { {0, 0}, {16, 16}, {32, 32} };

各要素の上{0, 0}には、草のタイルの単一の座標があります。

2番目の問題はループにあります。配列の長さ以外からデータを読み取らずgrassCoords、インデックスをインクリメントすると、grass.getWidth()実際には意味がありません。

    int x = 0;
    int y = 0;

    for (x = 0; x < grassCoords.length; x += grass.getWidth()) {

        for (y = 0; y < grassCoords.length; y += grass.getHeight()) {

            c.drawBitmap(grass, x, y, null);
        }

    }

配列を正しく反復し、そこからデータをフェッチする必要があります。

    int x = 0;
    for (x = 0; x < grassCoords.length; x++) {
        c.drawBitmap(grass, grassCoords[x][0], grassCoords[x][1], null);
    }

私があなたなら、Java チュートリアルの関連部分を少なくとも 1 回は勉強します。

于 2013-08-30T07:29:25.507 に答える