Я начал курс программирования в школе в этом / прошлом году, и в качестве заключительного экзамена мы должны сделать небольшую и простую игру. С прошлого августа до двух месяцев назад мы кодировали 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;
}
}
}