Позиции кирпича, в игре Breakout, с использованием массива в Java - PullRequest
0 голосов
/ 05 февраля 2020

Я работал над проектом Java для Uni, классической c аркадной игры Breakout, и до сих пор сумел создать объекты летучих мышей и мячей, и они работают, как задумано. Я хотел бы реализовать кирпичную стену с использованием массива, поскольку создание каждого кирпича своим собственным объектом приведет к неэффективному коду, но мой опыт работы с Java не распространяется на массивы, и я понимаю, что в отличие от Python, они сложны чтобы начать работать.

Я бы хотел, чтобы кирпичи получили разные позиции на основе уже установленных параметров x и y.

Вот класс Model, в который я хотел бы добавить массив ;

public class Model 
{
    // First, a collection of useful values for calculating sizes and layouts etc.

    public int B              = 6;      // Border round the edge of the panel
    public int M              = 40;     // Height of menu bar space at the top

    public int BALL_SIZE      = 30;     // Ball side
    public int BRICK_WIDTH    = 50;     // Brick size
    public int BRICK_HEIGHT   = 30;

    public int BAT_MOVE       = 5;      // Distance to move bat on each keypress
    public int BALL_MOVE      = 3;      // Units to move the ball on each step

    public int HIT_BRICK      = 50;     // Score for hitting a brick
    public int HIT_BOTTOM     = -200;   // Score (penalty) for hitting the bottom of the screen

    View view;
    Controller controller;

    public GameObj ball;                // The ball
    public ArrayList<GameObj> bricks;   // The bricks
    public GameObj bat;                 // The bat
    public int score = 0;               // The score

    // variables that control the game 
    public boolean gameRunning = true;  // Set false to stop the game
    public boolean fast = false;        // Set true to make the ball go faster

    // initialisation parameters for the model
    public int width;                   // Width of game
    public int height;                  // Height of game

    // CONSTRUCTOR - needs to know how big the window will be
    public Model( int w, int h )
    {
        Debug.trace("Model::<constructor>");  
        width = w; 
        height = h;
    }

    // Initialise the game - reset the score and create the game objects 
    public void initialiseGame()
    {       
        score = 0;
        ball   = new GameObj(width/2, height/2, BALL_SIZE, BALL_SIZE, Color.RED );
        bat    = new GameObj(width/2, height - BRICK_HEIGHT*3/2, BRICK_WIDTH*3, 
            BRICK_HEIGHT/4, Color.GRAY);
        bricks = new ArrayList<>();
        // ***HERE***

    }

А вот соответствующий код, который я хотел бы добавить в класс View для рисования кубиков в графическом интерфейсе;

    public void drawPicture()
{
    // the ball movement is runnng 'i the background' so we have
    // add the following line to make sure
    synchronized( Model.class )   // Make thread safe (because the bal
    {
        GraphicsContext gc = canvas.getGraphicsContext2D();

        // clear the canvas to redraw
        gc.setFill( Color.WHITE );
        gc.fillRect( 0, 0, width, height );

        // update score
        infoText.setText("BreakOut: Score = " + score);

        // draw the bat and ball
        displayGameObj( gc, ball );   // Display the Ball
        displayGameObj( gc, bat  );   // Display the Bat

        // ***HERE***

    }
}

Файл проекта .jar в его текущем состоянии можно посмотреть здесь .

На примечании стороны есть небольшая ошибка с летучей мышью, она не останавливается, когда ударяет в любую сторону, не уверенный, каков лучший путь к go о том, чтобы оно оставалось в пределах параметров окна.

Заранее спасибо !!

1 Ответ

0 голосов
/ 05 февраля 2020

У вас уже есть ArrayList кирпичей. Создайте функцию для преобразования координат строки / столбца в индекс для вашего массива. Скажем, у вас есть сетка 3x4 (3 строки, 4 столбца):

0 |_|_|B|_|
1 |_|_|_|_|
2 |_|_|_|_|
   0 1 2 3

Ваш ArrayList будет иметь размер 12 (3x4).

private int translateCoordToIndex(int row, int col) {
  return row * TOTAL_COLS + col
}

То есть для кирпича в строке = 0, col = 2 на диаграмме, его позиция выглядит как (0*4)+2 = 2, что означает индекс 2 в вашем ArrayList bricks.get(2)

Вы можете даже просто изменить ArrayList на общий массив GameObj GameObj[]

В качестве альтернативы вы можете использовать 2d массив GameObj для представления сетки кирпичей.

GameObj[][] bricks = new GameObj[rows][cols] Таким образом, вы можете получить доступ к точному кирпичу, используя его позицию в строке и столбце - например, bricks[0][0] для первый кирпич.

Оба подхода в значительной степени одинаковы.

...