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