Tile based map scrolling

2019-09-15 02:42发布

问题:

This script draws the map and other stuff:

public void render(Canvas canvas) {
        canvas.drawColor(Color.TRANSPARENT);

        Drawable myImage;

        int tileWidth = 50;
        int tileHeight = 50;

        int mapWidth = 3;
        int mapHeight = 3;

        int rowBaseX = 0;
        int rowBaseY = 0;

        int[][] board = new int[][] {
                {0,0,0},
                {0,0,0},
                {0,0,2}
                };

        for (int row = 0; row < mapHeight; row++)
        {

        for (int col = 0; col < mapWidth; col++)
        {
        Resources res = this.getContext().getResources();

        switch(board[row][col])
        {
        case 0:
        myImage = res.getDrawable(R.drawable.tile1);
        break;
        case 1:
        myImage = res.getDrawable(R.drawable.tile2);
        break;
        default:
        myImage = res.getDrawable(R.drawable.tile3);
        break;
        }

        int curL;
        int curU;

        int curR;
        int curD;

        curL = rowBaseX + (col * tileWidth);
        curU = rowBaseY + (row * tileHeight);

        curR = curL + tileWidth;
        curD = curU + tileHeight;

        if (droid.x - decentreX < curR & droid.x + decentreX > curL) {
            if (droid.y - decentreY < curD & droid.y + decentreY > curU) {
        myImage.setBounds(curL,curU,curR,curD);
        myImage.draw(canvas);
            }
        }
        }
        }

        droid.draw(canvas);
        butt.draw(canvas);
        butt1.draw(canvas);
        butt2.draw(canvas);
        butt3.draw(canvas);
        buttz.draw(canvas);
        buttz1.draw(canvas);
        buttz2.draw(canvas);
        buttz3.draw(canvas);
        buttx.draw(canvas);
    }

The render(Canvas canvas) methos is called on every frame. How can i scroll the map tiles? I tried this:

public void render(Canvas canvas) {
        canvas.drawColor(Color.TRANSPARENT);

        Drawable myImage;

        int tileWidth = 50;
        int tileHeight = 50;

        int mapWidth = 3;
        int mapHeight = 3;

        int rowBaseX = 0;
        int rowBaseY = 0;

        int[][] board = new int[][] {
                {0,0,0},
                {0,0,0},
                {0,0,2}
                };

        for (int row = 0; row < mapHeight; row++)
        {

        for (int col = 0; col < mapWidth; col++)
        {
        Resources res = this.getContext().getResources();

        switch(board[row][col])
        {
        case 0:
        myImage = res.getDrawable(R.drawable.tile1);
        break;
        case 1:
        myImage = res.getDrawable(R.drawable.tile2);
        break;
        default:
        myImage = res.getDrawable(R.drawable.tile3);
        break;
        }

        int curL;
        int curU;

        int curR;
        int curD;

        curL = rowBaseX + (col * tileWidth);
        curU = rowBaseY + (row * tileHeight);

        if (droid.touched & !droid.touched1 & !droid.touched3) {
            curL -= 1;
        }else if (droid.touched1 & !droid.touched & !droid.touched2){
            curU += 1;
        }else if (droid.touched2 & !droid.touched1 & !droid.touched3){
            curL += 1;
        }else if (droid.touched3 & !droid.touched2 & !droid.touched){
            curU -= 1;
        }else if (droid.touched & droid.touched1){
            curL -= 1;
            curU += 1;
        }else if (droid.touched1 & droid.touched2){
            curL += 1;
            curU += 1;
        }else if (droid.touched2 & droid.touched3){
            curL += 1;
            curU -= 1;
        }else if (droid.touched3 & droid.touched){
            curL -= 1;
            curU -= 1;
        }

        curR = curL + tileWidth;
        curD = curU + tileHeight;

        if (droid.x - decentreX < curR & droid.x + decentreX > curL) {
            if (droid.y - decentreY < curD & droid.y + decentreY > curU) {
        myImage.setBounds(curL,curU,curR,curD);
        myImage.draw(canvas);
            }
        }
        }
        }

        droid.draw(canvas);
        butt.draw(canvas);
        butt1.draw(canvas);
        butt2.draw(canvas);
        butt3.draw(canvas);
        buttz.draw(canvas);
        buttz1.draw(canvas);
        buttz2.draw(canvas);
        buttz3.draw(canvas);
        buttx.draw(canvas);
    }

but it didn't worked. Everything that is not in this method is not important. Help me! :)

回答1:

Seems that you are changing lcal vars curL and curU. Thore are recalculates from rowBase on each call restricting the movement to the 1-increment you use when checking droid.touched.

You should change the global position of the tiles by changing the rowBase variables.