5

我在平铺Bitmap. 我想要Bitmap绘制到在 2D 中定义的坐标Array

我希望能够将“草”绘制到某些坐标,将“水等”绘制到其他坐标。

我花了几天时间试图弄清楚这一点,并且非常感谢任何见解。我只能Canvas画 1 个“草” Bitmap,所以我觉得我的 for 循环有错误。我看过这里这里,还有很多其他的,不希望每块瓷砖都一样。这是我的代码:

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);

    }

}

}

活动类.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}草瓦的单个坐标一样。

第二个问题是您的循环,除了数组长度之外,您不会读取任何数据,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 教程的相关部分。

于 2013-08-30T07:29:25.507 回答
2
for (x = 0; x < grassCoords.length; x += grass.getWidth()) {
    for (y = 0; y < grassCoords.length; y += grass.getHeight()) {
        c.drawBitmap(grass, x, y, null);
    }
}

它只绘制一次的原因就是这里的这一点。grassCoords.length5。当您x在第一次绘制后添加草宽度时,它会超过 5,循环结束。您需要为两者使用单独的变量。对y. 正如 auselen 指出的那样,这还有其他问题,但这就是它一开始只画一次的原因。

但是,如果您想用一个位图无缝平铺矩形,则可以完全取消坐标数组。你甚至不需要知道它有多少块宽/高。如果您在其他瓷砖下方使用草基层,如果您正在为背景图像平铺图案等,这将特别有用。您可以这样做:

for(int x = startX; x < endX; x += grass.getWidth()){
    for(int y = startY; y < endY; y += grass.getHeight()){
        c.drawBitmap(grass, x, y, null);
    }
}

请记住,如果您只想定期填充瓷砖,则无需定义坐标。它们都将是倍数,因此定义坐标数组根本没有多大意义。只需将每个瓦片点视为一个网格点并乘以瓦片的高度/宽度。

于 2013-08-30T13:23:06.450 回答