For some reason my collision detection isn't working: The ball just clips through the paddle. Here is my code, the important methods are checkForCollisions in the ball class, and getBounds in the Paddle class.
Pong class:
Ball class:
Paddle class:
Pong class:
import static org.lwjgl.opengl.GL11.*;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
public class Pong {
private Ball ball;
public Paddle user;
public Paddle comp;
public static Pong pong;
private Pong(){
try {
Display.setDisplayMode(new DisplayMode(640,480));
Display.create();
} catch (LWJGLException e) {
Display.destroy();
e.printStackTrace();
System.exit(1);
}
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0,640,480,0,-1,1);
glMatrixMode(GL_MODELVIEW);
user=new Paddle(0,280,0);
comp=new Paddle(640,280,1);
}
private void startGameLoop() {
while(!Display.isCloseRequested()){
glClear(GL_COLOR_BUFFER_BIT);
user.draw();
comp.draw();
updateBall();
pollInput();
doAI();
Display.update();
Display.sync(60);
}
Display.destroy();
}
private void doAI() {
// TODO Auto-generated method stub
}
private void pollInput() {
// TODO Auto-generated method stub
}
private void updateBall() {
if(ball==null){
ball=new Ball(Display.getDisplayMode().getWidth()/2,Display.getDisplayMode().getHeight()/2);
}
ball.updateBall();
ball.draw();
}
public static void main(String[] args) {
pong=new Pong();
pong.startGameLoop();
}
}
Ball class:
import java.awt.Rectangle;
import java.util.Random;
import org.lwjgl.opengl.GL11;
public class Ball {
private int x;
private int y;
private int xMotion;
private int yMotion;
private Random random=new Random();
private static final int RADIUS=5;
public Ball(int x, int y){
this.x=x;
this.y=y;
xMotion=-2;
yMotion=(random.nextInt(5)-2)/2;
yMotion=0;
}
public void draw(){
GL11.glPushMatrix();
GL11.glTranslatef(x, y, 0);
GL11.glScalef(RADIUS, RADIUS, 1);
GL11.glBegin(GL11.GL_TRIANGLE_FAN);
GL11.glVertex2f(0, 0);
for(int i = 0; i <= 5000; i++){
double angle = Math.PI * 2 * i / 5000;
GL11.glVertex2f((float)Math.cos(angle), (float)Math.sin(angle));
}
GL11.glEnd();
GL11.glPopMatrix();
}
public void updateBall(){
x+=xMotion;
y+=yMotion;
checkForCollisions();
}
private void checkForCollisions() {
Rectangle ballBounds=new Rectangle(x,y,RADIUS,RADIUS);
if(ballBounds.intersects(Pong.pong.user.getBounds())||ballBounds.intersects(Pong.pong.comp.getBounds()){
xMotion=-xMotion;
yMotion=(random.nextInt(5)-2)/2;
}
}
}
Paddle class:
import static org.lwjgl.opengl.GL11.*;
import java.awt.Rectangle;
public class Paddle {
private int x;
private int y;
private int width=20;
private int height=100;
private int mode;
public Paddle(int x, int y, int mode){
this.x=x;
this.y=y;
this.mode=mode;
}
public void draw(){
glBegin(GL_QUADS);
if(mode==0){
glVertex2i(x,y);
glVertex2i(x,y-height);
glVertex2i(x+width,y-height);
glVertex2i(x+width,y);
}else{
glVertex2i(x,y);
glVertex2i(x,y-height);
glVertex2i(x-width,y-height);
glVertex2i(x-width,y);
}
glEnd();
}
public Rectangle getBounds(){
if(mode==0){
return new Rectangle(x,y,width,height);
}else{
return new Rectangle(x-width,y,width,height);
}
}
}