Застрял в создании кирпичного поля для простой игры прорыва - PullRequest
0 голосов
/ 04 июня 2019

Я начал курс программирования в школе в этом / прошлом году, и в качестве заключительного экзамена мы должны сделать небольшую и простую игру. С прошлого августа до двух месяцев назад мы кодировали Dr.Racket, прежде чем начать с Java. Поскольку у нас есть только три часа в неделю для изучения, я не стал особенно хорош в Java. У меня есть база для игры с веслом и шарами в окне. По мере того, как я переходил к области кирпичей, я полностью застрял с получением отдельных кирпичей в качестве объектов, чтобы функция обнаружения столкновений работала на меня.

Также была бы полезна некоторая помощь для обнаружения столкновений.

Я нарисовал поле кирпича в программе, но так как это не массив, мой учитель сказал, что мне следует подумать о создании массива, чтобы упростить для меня вещи. Ранее я использовал этот код для рисования поля кирпича:

class Bricks{
    final int rows = 4;
    final int columns = 9;
    final int bx = 0;
    final int by = 0;
    final int width = 80;
    final int height = 15;
    final int gap = 2;
    final Color color = Color.darkGray;

    void renderOn(Graphics g){
        int x = bx, y = by;
        g.setColor(color);
        for(int row = 1; row <= rows; row++){
            for(int col = 1; col <= columns; col++){
                g.fillRect(x, y, width, height);
                x += width + gap;
            }
        if(row%2 == 0)
            x = bx;
        else
            x = bx - width/2 - gap/2;

        y += height + gap;
        }
    }

Теперь мне просто нужно «подтолкнуть», чтобы встать на правильный путь, чтобы заставить мою игру работать, чтобы я мог получить оценку в моем курсе.

Полный код игры выглядит следующим образом:

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Main extends JPanel {

static int WIDTH = 640;
static int HEIGHT = 400;

List<Ball> theBalls = new ArrayList<>();
Padel padel = new Padel(WIDTH/2 -40 , HEIGHT-15, 10, 80, 12, Color.darkGray);
Bricks bricks = new Bricks();
Antal antal = new Antal(0);
public static void main(String[] args) {
    new Main();
}


Main() {
    this.setPreferredSize(new Dimension(WIDTH, HEIGHT));
    JFrame frame = new JFrame("Breakout");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_SPACE && antal.bollar <1){
                theBalls.add(new Ball(WIDTH/2 - 5, HEIGHT-30, 3, -3, 15, Color.red));
                antal.bollar++;
            }
            if (e.getKeyCode() == KeyEvent.VK_ENTER && antal.bollar == 1){
                theBalls.add(new Ball(WIDTH/2 - 5, HEIGHT-30, 3, -3, 15, Color.orange));
                antal.bollar++;
            }
            if (e.getKeyCode() == KeyEvent.VK_LEFT && padel.x > 0){
                padel = padel.move_left();
            }
            if (e.getKeyCode() == KeyEvent.VK_RIGHT && padel.x < WIDTH-padel.width){
                padel = padel.move_right();
            }
        }
    });
    frame.add(this, BorderLayout.CENTER);
    frame.pack();
    frame.setVisible(true);
    Timer timer = new Timer(10, e -> this.repaint());
    timer.start();
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    theBalls = theBalls.stream().map(b -> {
        Ball newBall = b.move(getWidth(), getHeight());
        newBall.renderOn(g);
        return newBall;
    }).collect(Collectors.toList());
    padel.renderOn(g);
    bricks.renderOn(g);
}
}

class Ball {
    final int x, y, xdir, ydir, width;
    final Color color;

Ball(int x, int y, int xdir, int ydir, int width, Color color) {
    this.x = x;
    this.y = y;
    this.xdir = xdir;
    this.ydir = ydir;
    this.width = width;
    this.color = color;

}
int nextXdir(int width) {
    if (x < 0 && xdir < 0 || x > width - this.width && xdir > 0)
        return -xdir;
    else
        return xdir;
}
int nextYdir(int height) {
    if (y < 0 && ydir < 0 || y > height - this.width && ydir > 0)
        return -ydir;
    else
        return ydir;
}
Ball move(int width, int height){
    return new Ball(
            this.x + this.xdir,
            this.y + this.ydir,
            nextXdir(width),
            nextYdir(height),
            this.width,
            this.color);
}
void renderOn(Graphics g) {
    g.setColor(color);
    g.fillOval(x, y, width, width);
}
}
class Padel {
final int x,  y, speed, width, height;
final Color color;

Padel(int x, int y, int speed, int width, int height, Color color){
    this.x = x;
    this.y = y;
    this.speed = speed;
    this.width = width;
    this.height = height;
    this.color = color;
}
Padel move_left(){
    return new Padel(
            this.x - this.speed,
            this.y,
            this.speed,
            this.width,
            this.height,
            this.color);
}
Padel move_right(){
    return new Padel(
            this.x + this.speed,
            this.y,
            this.speed,
            this.width,
            this.height,
            this.color);

}
void renderOn(Graphics g){
    g.setColor(color);
    g.fillRect(x, y, width, height);
}
}

class Antal{
int bollar;

Antal(int bollar){
    this.bollar = bollar;
}
    }

class Bricks {
final int rows = 4;
final int columns = 9;
final int bx = 0;
final int by = 0;
final int width = 80;
final int height = 15;
final int gap = 2;
final Color color = Color.darkGray;

void renderOn(Graphics g) {
    int x = bx, y = by;
    g.setColor(color);
    for (int row = 1; row <= rows; row++) {
        for (int col = 1; col <= columns; col++) {
            g.fillRect(x, y, width, height);
            x += width + gap;
        }
        if (row % 2 == 0)
            x = bx;
        else
            x = bx - width / 2 - gap / 2;

        y += height + gap;
    }
}
}
...