/ / Java Hit Detection / Collision entre objets - java, détection de collision

Détection des accès Java / collision entre objets - Java, détection de collision

Étant nouveau dans le codage, j'ai regardé une vidéo sur la façon decréer Pong. Cela s'est bien passé et j'ai donc voulu essayer de recréer Brick Breaker en utilisant certaines des techniques de codage utilisées pour Pong. Jusqu'à présent, j'ai le ballon, la pagaie et la base du jeu. Cependant, la balle n'entre pas en collision correctement avec la raquette, au lieu de rebondir, elle passe à travers.

Code pour le jeu de base:

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) {
}
}

Balle:

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;
}


}

Joueur:

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;

}
}

Pagayer:

import java.awt.Graphics;

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

}

Je ne comprends pas encore complètement la détection de hit, donc je viens de jouer avec ce qui était utilisé pour le pong, cependant, cela ne fonctionne pas (et je suis sûr que cela pourrait sembler bizarre).

Réponses:

1 pour la réponse № 1

La détection des collisions peut être difficile à envelopper votre têteparfois. Ce qui m'aide vraiment, c'est de dessiner sur un morceau de papier les éléments dont j'ai besoin pour vérifier et écrire les chèques dans le code un par un. C’est aussi une bonne idée de garder à l’esprit vos axes, c’est vraiment facile de mélanger un x et un y, mais ils auront un effet important surgameplay. Mon œil a été attiré par votre fonction checkPlayerCollision car elle semblait un peu éteinte, j'ai changé quelques vérifications et commenté ce que fait chaque vérification / fonction.

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;
}
}

Le meilleur conseil que je puisse vous donner: prenez un morceau de papier et dessinez simplement une grille ou un graphique simple et utilisez-le pour dessiner différentes choses que vous devez vérifier. Assurez-vous d'étiqueter votre point (0,0) de sorte que lorsque vous travaillez avec les différentes bordures, vous savez lesquelles sont 0 (généralement les bordures supérieure et gauche) et lesquelles sont égales à width et height de la toile.