是否可以仅使用2个位图实例多次绘制位图?

时间:2017-06-11 16:16:26

标签: android canvas bitmap

我试图了解Android中的游戏创作。因此,我尝试在不使用按钮或布局文件的情况下编写简单的TicTacToe。相反,我只想使用位图。

我的问题是我可以创建电路板,切换" X"和" O"符号正确,但我的onDraw()只能在最大值时同时绘制2个符号,我不太明白为什么或如何解决这个问题。

public class GameScreen extends View {

    List<TicTacToeSymbol> symbolList = new ArrayList<>();

    float posX;
    float posY;

    int displayWidth;
    int displayHeight;

    Bitmap background;
    Bitmap bitmapX;
    Bitmap bitmapO;

    Rect dst = new Rect();
    boolean touched = false;

    TicTacToeSymbol currentSymbol;
    TicTacToeSymbol symbolX;
    TicTacToeSymbol symbolO;

    Grid grid = new Grid();

    // Declaring the coordinates for the colums and rows
    int ZERO_COLUMN_X = 0;
    int FIRST_COLUMN_X = 480;
    int SECOND_COLUMN_X = 910;
    int THIRD_COLUMN_X = 1425;

    (...)

    int centerX = 0;
    int centerY = 0;

    public GameScreen(Context context) {
        super(context);
        try {
            AssetManager assetManager = context.getAssets();
            InputStream inputStream = assetManager.open("tictactoegrid.jpg");
            background = BitmapFactory.decodeStream(inputStream);
            inputStream = assetManager.open("X.png");
            bitmapX = BitmapFactory.decodeStream(inputStream);
            inputStream = assetManager.open("O.png");
            bitmapO = BitmapFactory.decodeStream(inputStream);
            inputStream.close();

            // I create only 2 symbols, which might be the problem
            symbolX = new TicTacToeSymbol(0, 0, 1);
            symbolX.setBitmap(bitmapX);

            symbolO = new TicTacToeSymbol(0, 0, 2);
            symbolO.setBitmap(bitmapO);

            setCurrentSymbol(symbolX, 1);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();

        Display display = this.getDisplay();
        Point size = new Point();
        display.getSize(size);
        displayWidth = size.x;
        displayHeight = size.y;
    }

    public void toggleCurrentSymbol() {
        if (currentSymbol == symbolX) {
            currentSymbol = symbolO;
        } else {
            currentSymbol = symbolX;
        }
    }

    public void setCurrentSymbol(TicTacToeSymbol ticTacToeSymbol, int type) {
        this.currentSymbol = ticTacToeSymbol;
        if (type == 1) {
            currentSymbol.setType(1);
        } else
            currentSymbol.setType(2);
    }

    public void setCoordinatesCurrentSymbol(int centerX, int centerY) {
        currentSymbol.setPosX(centerX);
        currentSymbol.setPosY(centerY);
    }

    @Override
    public void onDraw(Canvas canvas) {
        dst.set(0, 0, displayWidth, displayHeight - 200);
        canvas.drawBitmap(background, null, dst, null);
        if (touched) {

            // Checking where the user has clicked
            // First row
            if (posX >= ZERO_COLUMN_X && posX <= FIRST_COLUMN_X
                    && posY > ZERO_ROW_Y && posY < FIRST_ROW_Y) {
                centerX = FIRST_CENTER_X;
                centerY = FIRST_CENTER_Y;
                setCoordinatesCurrentSymbol(centerX, centerY);
                grid.placeSignInGrid(0, 0, currentSymbol);
                toggleCurrentSymbol();
            }
            if (posX > FIRST_COLUMN_X && posX <= SECOND_COLUMN_X
                    && posY > ZERO_ROW_Y && posY < FIRST_ROW_Y) {
                centerX = SECOND_CENTER_X;
                centerY = FIRST_CENTER_Y;
                setCoordinatesCurrentSymbol(centerX, centerY);
                grid.placeSignInGrid(1, 0, currentSymbol);
                toggleCurrentSymbol();
            }

            (...)

        }

        // Go through the grid, get the symbol at the position and add it to the list of symbols
        for (int i = 0; i < Grid.GRID_SIZE; i++) {
            for (int j = 0; j < Grid.GRID_SIZE; j++) {
                if (grid.getSymbolAtField(i, j) != null) {
                    if (!symbolList.contains(grid.getSymbolAtField(i, j))) {
                        symbolList.add(grid.getSymbolAtField(i, j));

                    }
                }
            }
        }

        // Draw every symbol in the list. 
        for (TicTacToeSymbol ttts : symbolList) {
            canvas.drawBitmap(ttts.getBitmap(), ttts.getPosX(), ttts.getPosY(), null);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            touched = true;
            posX = event.getX();
            posY = event.getY();
            invalidate();
            return true;
        }
        return false;
    }
}

我只创建了2个TicTacToeSymbols,即symbolXsymbolO。因此symbolList仅包含这些2并且仅绘制那些2。

但是我怎么能多次画出相同的符号呢?否则,我将不得不创建9个X符号,包括位图和9个O符号,以覆盖所有带有可能符号的网格字段。这似乎不对/不太优雅?

那么如何在正确的位置多次绘制我的2个符号呢?

我已经查看了几个这样的帖子,但无法为我的问题找到解决方案: Draw multiple times from a single bitmap on a canvas ...这会随机定位位图,但我希望我的符号位于特定位置。

0 个答案:

没有答案