Я хочу сделать игру Breakout на Java, но у меня возникла проблема с коллизией. Я еще не закончил код кирпичей. Поэтому я написал тот же код, что и в Youtube, но столкновение между мячом и ракеткой происходит с ошибками и не работает.
Main Class
package poorgame;
public class PoorGame {
public static void main(String[] args) {
Frame frame = new Frame();
}
}
Frame Class
package poorgame;
import java.awt.*;
import javax.swing.*;
public class Frame extends JFrame{
Panel panel;
JPanel pan;
Frame(){
panel = new Panel();
this.add(panel);
this.setBackground(Color.black);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
this.setVisible(true);
this.setLocationRelativeTo(null);
}
}
Panel Class
package poorgame;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class Panel extends JPanel implements Runnable {
static final int HI = 700;
static final int WID = 700;
static final int BRICKS_W = 130;
static final int BRICKS_H = 30;
static final int PADDLE_W = 150;
static final int PADDLE_H = 25;
static final int BALL = 20;
Ball ball;
Paddle paddle;
Bricks bricks;
Thread game;
Image image;
Graphics graphics;
Random random;
Panel() {
newBricks();
newPaddle();
newBall();
pause = new Pause();
finish = new Finish();
this.setFocusable(true);
this.addKeyListener(new MyKey());
this.setPreferredSize(new Dimension(HI, WID));
game = new Thread(this);
game.start();
}
public void newBricks() {
bricks = new Bricks(20,70,BRICKS_H,BRICKS_W);
}
public void newBall() {
ball = new Ball((WID/2)-(BALL/2),(HI/2)-(BALL/2),BALL,BALL);
}
public void newPaddle() {
paddle = new Paddle(285,570,PADDLE_H,PADDLE_W);
}
public void paint(Graphics g) {
image = createImage(getWidth(), getHeight());
graphics = image.getGraphics();
draw(graphics);
g.drawImage(image, 0, 0, this);
}
public void draw(Graphics g) {
paddle.draw(g);
bricks.draw(g);
ball.draw(g);
}
public void move() {
paddle.move();
ball.move();
}
public void check() {
if(ball.x <=0)
ball.setX(-ball.ballX);
if(ball.x >=WID-BALL)
ball.setX(-ball.ballX);
if(ball.intersects(paddle)){
ball.ballY *= -1;
ball.setY(ball.ballY);}
if(paddle.x<=0)
paddle.x =0;
if(paddle.x>=HI-PADDLE_W)
paddle.x =HI-PADDLE_W;
}
public void crash(){
}
@Override
public void run() {
long lastTime = System.nanoTime();
double amountOfTicks = 60.0;
double ns = 1000000000 / amountOfTicks;
double delta = 0;
while (true) {
long now = System.nanoTime();
delta += (now - lastTime) / ns;
lastTime = now;
if (delta >= 1) {
move();
check();
crash();
repaint();
delta--;
}
}
}
public class MyKey extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
paddle.keyPressed(e);
}
@Override
public void keyReleased(KeyEvent e) {
paddle.keyReleased(e);
}
}
}
Bricks Class
package poorgame;
import java.awt.*;
public class Bricks {
Rectangle rect[] = new Rectangle[25];
Bricks(int x, int y, int h, int w) {
for (int i = 0; i < rect.length; i++) {
if ((i % 5 == 0) && (i != 0)) {
y += 40;
x = 20;
rect[i] = new Rectangle(x,y,h,w);
}
rect[i] = new Rectangle(x,y,h,w);
x += 135;
}
x = 20;
y = 70;
}
public void draw(Graphics g) {
g.setColor(new Color(rect[0].width,rect[0].y,rect[9].height));
for (int i = 0; i < rect.length; i++) {
if ((i % 5 == 0) && (i != 0)) {
rect[0].y += 40;
rect[0].x = 20;
g.setColor(new Color(rect[i].width,rect[i].y,rect[i].height));
g.fillRect(rect[0].x, rect[0].y, rect[i].height, rect[i].width);
}
g.fillRect(rect[0].x, rect[0].y, rect[i].height, rect[i].width);
rect[0].x += 135;
}
rect[0].x = 20;
rect[0].y = 70;
}
public void crash(){
}
}
Paddle Class
package poorgame;
import java.awt.*;
import java.awt.event.*;
public class Paddle extends Rectangle {
int paddleX;
int movin = 5;
Paddle(int x, int y, int h, int w) {
super(x, y, h, w);
}
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
setX(-movin);
move();
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
setX(movin);
move();
}
}
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
setX(0);
move();
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
setX(0);
move();
}
}
public void setX(int X) {
paddleX = X;
}
public void move() {
x += paddleX;
}
public void draw(Graphics g) {
g.setColor(Color.red);
g.fillRect(x, y, height, width);
}
}
Ball Class
package poorgame;
import java.awt.*;
import java.util.*;
public class Ball extends Rectangle{
Random random;
int ballX;
int ballY;
int speed =2;
Ball(int x, int y, int h, int w){
super(x,y,h,w);
random = new Random();
int randomX = random.nextInt(2);
if(randomX==0)
randomX--;
setX(randomX*speed);
int randomY = 1;
//
setY(randomY*speed);
}
public void setX(int randomX){
ballX = randomX;
}
public void setY(int randomY){
ballY = randomY;
}
public void move(){
x +=ballX;
y += ballY;
}
public void draw(Graphics g){
g.setColor(Color.white);
g.fillOval(x, y, height,width);
}
}
```