Stanford CS106A Breakout Game Checking For Collisions Solution

9 Nov

Just when I felt optimistic, like I can conquer the world, I found this to be even harder than all the other parts of the Breakout game to date! I’ve had a pretty hard time finding the answer that I could understand online, so I have to admit that I got a developer friend to help me out a bit, which I am really really grateful for. Here is the next step in the Breakout game:

Here is my solution:


Ok, so while the instructions were helpful, I think they were also confusing, especially the “private GObject getCollidingObject()” and the “GObject collider = getCollidingObject()” parts. I put the GObject collider outside of any method, and that cause some serious bug that I couldn’t figure out how to fix! The other confusing part is figuring out that “collider == brick” only returns the last brick in your brick wall, so to get the brick you need to say “if (collider != null)”.

Anyway, I don’t think I could have figured this out without some help from my friend. Here is my solution, also available on gist.

private void moveBall() {
		ball.move(vx, vy);
		//check for walls
		//need to get vx and vy at the point closest to 0 or the other edge
		if ((ball.getX() - vx <= 0 && vx < 0 )|| (ball.getX() + vx >= (getWidth() - BALL_RADIUS*2) && vx>0)) {
			vx = -vx;
		}
		//We don't need to check for the bottom wall, since the ball can fall through the wall at that point
		if ((ball.getY() - vy <= 0 && vy < 0 )) {
			vy = -vy;
		}
		//check for other objects
		GObject collider = getCollidingObject();
		if (collider == paddle) {
			vy = -vy;
		}
		//since we lay down a row of bricks, the last brick in the brick wall is assigned the value brick.
		//so we narrow it down by saying that the collier does not equal to a paddle or null, 
		//so all that is left is the brick
		else if (collider != null) {
			remove(collider); 
			vy = -vy;
		}
		pause (DELAY);
	}

	private GObject getCollidingObject() {

		if((getElementAt(ball.getX(), ball.getY())) != null) {
	         return getElementAt(ball.getX(), ball.getY());
	      }
		else if (getElementAt( (ball.getX() + BALL_RADIUS*2), ball.getY()) != null ){
	         return getElementAt(ball.getX() + BALL_RADIUS*2, ball.getY());
	      }
		else if(getElementAt(ball.getX(), (ball.getY() + BALL_RADIUS*2)) != null ){
	         return getElementAt(ball.getX(), ball.getY() + BALL_RADIUS*2);
	      }
		else if(getElementAt((ball.getX() + BALL_RADIUS*2), (ball.getY() + BALL_RADIUS*2)) != null ){
	         return getElementAt(ball.getX() + BALL_RADIUS*2, ball.getY() + BALL_RADIUS*2);
	      }
		//need to return null if there are no objects present
		else{
	         return null;
	      }

	}

Now, a few more steps to finish up!

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s