2017-08-25 3 views
0

Étant nouveau pour le codage, j'ai regardé une vidéo sur la façon de créer Pong. Cela s'est bien passé, et par conséquent je voulais essayer de recréer Brick Breaker en utilisant certaines des techniques de codage utilisées pour Pong. Jusqu'à présent, j'ai la balle, la pagaie et la base du jeu. Cependant, la balle ne heurte pas correctement la pagaie, au lieu de rebondir.Java Hit Détection/Collision entre les objets

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; 

} 
} 

Paddle:

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 coup, donc j'ai juste joué avec ce qui était utilisé pour pong, mais ça ne marche pas (et je suis sûr que ça pourrait avoir l'air bizarre).

+0

Vous semblez uniquement vérifier les coordonnées X dans votre fonction 'Ball.checkPlayerCollision()'. X est (généralement) l'axe horizontal. Essayez de remplacer la première vérification ('if (x <= 50)') avec 'if (y <= 50)'. edit: Et inverser le 'yVel' au lieu du' xVel'. – Kalkran

+0

Vous pouvez également inclure le rayon de votre ovale dans la détection de collision. La position que vous interrogez est le milieu de la balle, mais vous voulez en fait vous demander si la limite de la balle est entrée en collision avec quelque chose. –

Répondre

1

La détection de collision peut parfois être difficile à envelopper votre tête. Ce qui m'aide vraiment, c'est de dessiner sur un bout de papier les choses que je dois vérifier et écrire les chèques un par un. C'est aussi une bonne idée de garder vos axes à l'esprit, il est vraiment facile de mélanger un x et un y, mais ils auront un effet important sur le gameplay. Mon œil a été attiré par votre fonction checkPlayerCollision car elle semblait un peu éteinte, j'ai changé quelques contrôles autour et commenté ce que chaque vérification/fonction fait.

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 peux vous donner: prenez un morceau de papier et juste dessiner une simple grille ou graphique et l'utiliser pour dessiner différentes choses que vous devez vérifier. Assurez-vous de marquer votre point (0,0) de sorte que lorsque vous travaillez avec les différentes bordures, vous savez lesquelles sont 0 (habituellement les bordures supérieure et gauche) et celles qui sont égales à width et height de la toile.