/ / Виявлення хітів Java / Зіткнення між об'єктами - Java, виявлення зіткнень

Виявлення Java Hit / Зіткнення між об'єктами - Java, виявлення зіткнень

Будучи новим у програмуванні, я переглянув відео про те, як це зробитистворити понг. Це пройшло добре, і в результаті я хотів спробувати відтворити Brick Breaker, використовуючи деякі прийоми кодування, які використовувались для Pong. Поки що у мене є м’яч, весло та основа гри. Однак м'яч не стикається належним чином з веслом, замість того, щоб стрибати, він проходить наскрізь.

Код базової гри:

import java.applet.Applet;
import java.awt.Color;
import java.awt.Image;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Breaker extends Applet implements Runnable, KeyListener{
final int WIDTH = 600, HEIGHT= 400;
Thread thread;
Graphics gfx;
Image img;
Ball b1;
Player p1;

public void init() {
this.resize(WIDTH, HEIGHT);
this.addKeyListener(this);
b1 = new Ball();
p1 = new Player(1);
img = createImage(WIDTH,HEIGHT);
gfx = img.getGraphics();
thread = new Thread(this);
thread.start();
}

public void paint(Graphics g) {
gfx.setColor(Color.black);
gfx.fillRect(0, 0, WIDTH, HEIGHT);
b1.draw(gfx);
p1.draw(gfx);
g.drawImage(img, 0, 0, this);
}

public void update (Graphics g) {
paint(g);
}

@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_LEFT){
p1.setLeftAccel(true);
}
else if(e.getKeyCode() == KeyEvent.VK_RIGHT){
p1.setRightAccel(true);
}

}

@Override
public void keyReleased(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_LEFT){
p1.setLeftAccel(false);
}
else if(e.getKeyCode() == KeyEvent.VK_RIGHT){
p1.setRightAccel(false);
}
}

@Override
public void run() {
for(;;) {

p1.move();
b1.move();
b1.checkPlayerCollision(p1);

repaint();
getToolkit().sync();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

@Override
public void keyTyped(KeyEvent arg0) {
}
}

М'яч:

import java.awt.Graphics;
import java.awt.Color;

public class Ball {
int score;
double xVel, yVel, x, y;

public Ball() {
x= 350;
y = 250;
xVel= 0;
yVel = 1;
}

public void draw(Graphics g) {
g.setColor(Color.white);
g.fillOval((int)x - 10, (int)y - 10, 20, 20);
}

public void checkPlayerCollision(Player p1) {
if (x <= 50) {
if(x >= p1.getX() && x <= p1.getX() + 10)
xVel = -xVel;
}
else if (x >= 680) {
xVel = -xVel;
}
}

public void move() {
x += xVel;
y += yVel;

if (y < 10) //Bounce at top side of screen
yVel = -yVel;
if (x < 10) // Bounce at left side of screen
xVel = -xVel;
}

public int getX() {
return (int)x;
}

public int getY() {
return (int)y;
}


}

Гравець:

import java.awt.Color;
import java.awt.Graphics;

public class Player implements Paddle {
double x, xVel;
boolean leftAccel, rightAccel;
int player, y;

public Player(int player) {
leftAccel = false; rightAccel = false;
x=260; xVel=0;
}

@Override
public void draw(Graphics g) {
g.setColor(Color.white);
g.fillRect((int)x, 380, 80, 10);

}

@Override
public void move() {
if(leftAccel){
xVel -= 2;
}
else if (rightAccel) {
xVel += 2;
}
else if (!leftAccel && !rightAccel) {
xVel = 0;
}
if(xVel >= 5) {
xVel = 5;
}
else if (xVel <= -5) {
xVel = -5;
}
x += xVel;

if(x < 0)
x=0; //Collision with left wall
if(x > 520)
x = 520; //Collision with right wall

}

public void setLeftAccel(boolean input) {
leftAccel = input;
}

public void setRightAccel(boolean input) {
rightAccel = input;
}

@Override
public int getX() {
return (int)x;

}
}

Весло:

import java.awt.Graphics;

public interface Paddle {
public void draw(Graphics g);
public void move();
public int getX();

}

Я ще не повністю розумію виявлення ударів, тому я просто переплутав те, що використовувалося для понгу, однак, це не працює (і я впевнений, що це може виглядати дивно).

Відповіді:

1 для відповіді № 1

Виявлення зіткнення може бути важко обернути головоюнавколо іноді. Мені насправді допомагає намалювати на аркуші паперу речі, які мені потрібно перевірити, і написати чеки в коді по черзі. Це також гарна ідея мати на увазі свої сокири, це дуже просто змішати x і a y, але вони матимуть важливий вплив нагеймплей. Моє око привернула ваша функція checkPlayerCollision, оскільки це здавалося трохи відхиленим, я змінив деякі перевірки і прокоментував, що робить кожна перевірка / функція.

public void checkPlayerCollision(Player p1) {
if (
// Is the ball at or below paddle height?
y <= 50
// AND Is the ball right of the left side of the paddle?
&& x >= p1.getX()
// AND Is the ball left of the right side of the paddle?
&& x <= p1.getX() + 10
) {
// Collision with the paddle!
// (Ball is lower than y=50 and between left and right side of the paddle!)
// As we want the ball to go back up, we will be changing its velocity
// along the Y-axis.
yVel -= yVel;
} else if (x >= 680) {
// This checks whether the ball went too far to the right..?
xVel -= xVel;
}
}

Найкраща порада, яку я можу вам дати: візьміть аркуш паперу і просто намалюйте просту сітку або графік і використовуйте це, щоб намалювати різні речі, які вам потрібно перевірити. Обов’язково позначте свою точку (0,0), щоб, коли ви працюєте з різними межами, ви знали, які з них дорівнюють 0 (зазвичай верхня та ліва межі), а які рівні width і height полотна.